+ # TODO: Support also: private
+ header("Cache-Control"=>"public"); # HTTP/1.1
+
+ # Use $W->{"force_charset"}=0 to disable charset.
+ my $client_charset=$W->{"force_charset"};
+ $client_charset="us-ascii" if !defined $client_charset;
+
+ # Workaround bug
+ # https://bugzilla.mozilla.org/show_bug.cgi?id=120556
+ # of at least
+ # Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8b) Gecko/20050217
+ my $mime=$W->{"content_type"};
+ # http://validator.w3.org/ does not send ANY "Accept" headers!
+ $mime="application/xhtml+xml" if !$mime
+ && !$W->{"headers_in"}{"Accept"}
+ && ($W->{"headers_in"}{"User-Agent"}||"")=~m{^W3C_Validator/}i;
+ $mime or $mime=$class->Negotiate_choose([
+ # Put the fallback variant as the first one.
+ # Rate both variants the same to prefer "text/html" for undecided clients.
+ # At least
+ # Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8b) Gecko/20050217
+ # prefers "application/xhtml+xml" over "text/html" itself:
+ # text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
+ negotiate_variant(
+ "id"=>"text/html",
+ "content-type"=>"text/html",
+ "qs"=>0.6,
+ "charset"=>$client_charset,
+ "lang"=>$W->{"language"},
+ ),
+ negotiate_variant(
+ "id"=>"application/xhtml+xml",
+ "content-type"=>"application/xhtml+xml",
+ "qs"=>0.6,
+ "charset"=>$client_charset,
+ "lang"=>$W->{"language"},
+ ),
+ # application/xml ?
+ # text/xml ?
+ ]);
+ # mod_perl doc: If you set this header via the headers_out table directly, it
+ # will be ignored by Apache. So do not do that.
+ my $type=MIME::Types->new()->type($mime) if $client_charset;
+ cluck "MIME::Types type $mime not known" if $client_charset && !$type;
+ $client_charset=undef() if $type && !$type->isAscii();
+ $W->{"r"}->content_type($mime.(!$client_charset ? "" : "; charset=$client_charset"));
+
+ cache_start();
+ # We still can append headers before we put out some text.
+ # FIXME: It is not clean to still append them without overwriting.
+ return if $W->{"heading_done"};
+ Wprint '<?xml version="1.0" encoding="'.$client_charset.'"?>'."\n"
+ if (!$W->{"header_only"} || $W->{"header_only"} eq "xml") && $mime=~m{^application/\w+[+]xml$};
+ return if $W->{"header_only"};
+ # Split 'heading_done' for the proper handling of: /project/Rel.pm
+ $W->{"heading_done"}++;
+
+ Wprint '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">'."\n";
+ Wprint '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="'.$W->{"language"}.'">'."\n";