Fixed standards compliance: text/javascript -> application/javascript
[MyWeb.git] / Web.pm
diff --git a/Web.pm b/Web.pm
index ae77471..2bf90bb 100644 (file)
--- 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: <script />
                # as at least Lynx inhibits any further HTML output.
-               $W->{"head"}.='<script type="text/javascript" src="'.uri_escaped(path_web('/My/HaveJS.pm')).'"></script>'."\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"}.='<script type="application/javascript" src="'.uri_escaped(path_web('/My/HaveJS.pm')).'"></script>'."\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: <script />
                        # as at least Lynx inhibits any further HTML output.
+                       # 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
                        Wprint <<"HERE";
-<script type="text/javascript" src="@{[ uri_escaped(path_web('/My/css_inherit.js')) ]}"></script>
+<script type="application/javascript" src="@{[ uri_escaped(path_web('/My/css_inherit.js')) ]}"></script>
 HERE
                        }
                }