X-Git-Url: http://git.jankratochvil.net/?a=blobdiff_plain;f=Web.pm;h=2bf90bbecedb28689de0ca261128f3c3ed064369;hb=c0c711273b6186d349e187e1368ebaf85e9b8b4f;hp=ae77471f2ee8bb366b9125574ed7be2616921193;hpb=26a1732cc168cb2069c96b917eb6e879b6cf7c89;p=MyWeb.git diff --git a/Web.pm b/Web.pm index ae77471..2bf90bb 100644 --- a/Web.pm +++ b/Web.pm @@ -144,7 +144,9 @@ my($class,%args)=@_; Wrequire 'My::Hash'; # $W={} can get somehow created very easily. - cluck "W not empty:\n".Dumper($W) if keys(%$W); + # Do not: cluck "W not empty:\n".Dumper($W) if keys(%$W); + # to prevent (of $W->{"headers_in"}): TODO: Enumeration may not be expected. + cluck "W not empty; __PACKAGE__ was: ".$W->{"__PACKAGE__"} if keys(%$W); $W=My::Hash->new({},"My::Hash::Sub","My::Hash::Push"); bless $W,$class; %$W=( @@ -270,7 +272,11 @@ my($class,%args)=@_; if ($W->{"detect_js"} && !$W->{"have_js"}) { # Do not: '."\n"; + # Do not: text/javascript + # as it does not look as registered, at least according to: MIME::Types $VERSION 1.15 + # "application/javascript" so far standardized till 2005-12-08 by: + # http://www.ietf.org/internet-drafts/draft-hoehrmann-script-types-03.txt + $W->{"head"}.=''."\n"; } do { _args_check(%$_) if $_; } for ($W->{"args_check"}); @@ -304,7 +310,7 @@ sub exit_hook } sub exit_hook_start { - cluck "exit_hook_start() twice?" if defined $exit_orig; + do { cluck "exit_hook_start() twice?"; return; } if defined $exit_orig; $exit_orig=\&CORE::GLOBAL::exit; # Prevent: Subroutine CORE::GLOBAL::exit redefined no warnings 'redefine'; @@ -314,7 +320,8 @@ sub exit_hook_stop { do { cluck "exit_hook_stop() without exit_hook_start()?"; return; } if \&exit_hook ne \&CORE::GLOBAL::exit; - cluck "INTERNAL: exit_orig uninitialized" if !$exit_orig; + do { cluck "INTERNAL: exit_orig uninitialized"; return; } + if !$exit_orig; # Prevent: Subroutine CORE::GLOBAL::exit redefined no warnings 'redefine'; *CORE::GLOBAL::exit=$exit_orig; @@ -1044,6 +1051,9 @@ sub cache_finish() # as we may have just gave 304 and 'exit;' without starting the caching. return if !$W->{"cache_active"}; + # Headers may not be complete in this case; not sure, just trying. + return if $W->{"r"}->connection()->aborted(); + # Fill-in/check: %uri_args_frozen_to_headers_in_keys my $headers_in_keys_stored_arrayref_ref=\$uri_args_frozen_to_headers_in_keys{$W->{"uri_args_frozen"}}; my @headers_in_keys=tied(%{$W->{"headers_in_RecordKeys"}})->accessed(); @@ -1104,7 +1114,11 @@ my($class)=@_; if (!$W->{"header_only"}) { header("Content-Style-Type"=>"text/css"); - header("Content-Script-Type"=>"text/javascript"); + # Do not: text/javascript + # as it does not look as registered, at least according to: MIME::Types $VERSION 1.15 + # "application/javascript" so far standardized till 2005-12-08 by: + # http://www.ietf.org/internet-drafts/draft-hoehrmann-script-types-03.txt + header("Content-Script-Type"=>"application/javascript"); # $W->{"r"}->content_languages() ? do { header("Content-Language"=>$_) if $_; } for $W->{"language"}; } @@ -1120,33 +1134,39 @@ my($class)=@_; # of at least # Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8b) Gecko/20050217 # http://validator.w3.org/ does not send ANY "Accept" headers! - $W->{"content_type"}="application/xhtml+xml" if !defined $W->{"content_type"} - && !$W->{"headers_in"}{"Accept"} - && ($W->{"headers_in"}{"User-Agent"}||"")=~m{^W3C_Validator/}i; - defined($W->{"content_type"}) or $W->{"content_type"}=$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, - (!$W->{"charset"} ? () : "charset"=>$W->{"charset"}), - "lang"=>$W->{"language"}, - ), - negotiate_variant( - "id"=>"application/xhtml+xml", - "content-type"=>"application/xhtml+xml", - "qs"=>0.6, - (!$W->{"charset"} ? () : "charset"=>$W->{"charset"}), - "lang"=>$W->{"language"}, - ), - # application/xml ? - # text/xml ? - ]); + if (!defined $W->{"content_type"}) { + # Be _stable_ for "headers_in". + my $accept=$W->{"headers_in"}{"Accept"}; + my $user_agent=$W->{"headers_in"}{"User-Agent"}||""; + $W->{"content_type"}="application/xhtml+xml" + if !$accept && $user_agent=~m{^W3C_Validator/}i; + # Be _stable_: + my $negotiated=$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, + (!$W->{"charset"} ? () : "charset"=>$W->{"charset"}), + "lang"=>$W->{"language"}, + ), + negotiate_variant( + "id"=>"application/xhtml+xml", + "content-type"=>"application/xhtml+xml", + "qs"=>0.6, + (!$W->{"charset"} ? () : "charset"=>$W->{"charset"}), + "lang"=>$W->{"language"}, + ), + # application/xml ? + # text/xml ? + ]); + $W->{"content_type"}=$negotiated if !defined $W->{"content_type"}; + } # 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; @@ -1190,8 +1210,12 @@ HERE if ($W->{"css_inherit"}) { # Do not: + HERE } }