You are here: Foswiki>Tasks Web>Item12835 (05 Jul 2015, GeorgeClark)Edit Attach

Item12835: http status code not properly set under certain conditions

pencil
Priority: Normal
Current State: Closed
Released In: 2.0.0
Target Release: major
Applies To: Engine
Component: Foswiki/Response.pm
Branches: trunk
Reported By: GuntramBlohm
Waiting For:
Last Change By: GeorgeClark
In FosWiki.pm, in line 954, if the engine decides on a 304 reply, it sets the status code:

            # finally decide on a 304 reply
            if ( $etagFlag && $lastModified ) {
                $hopts->{'Status'} = '304 Not Modified';
                $text = '';

Later, Foswiki/Response.pm line 247 will use the Status header to set the return status in the reply object:

            unless ( exists $this->{headers}->{$hdr} ) {
                if ( $hdr eq 'Status' ) {
                    $this->status($hdr);                            # <---- Bug here!
                }

This passes the header name, "Status", instead of the status, 304, to $this->status(). Which will make the status undefined:

            sub status {
                my ( $this, $status ) = @_;
                    if ($status) {
                        ASSERT( !$this->{outputHasStarted}, 'Too late to change status' )
                          if DEBUG;
                        $this->{status} = $status =~ /^\d{3}/ ? $status : undef;      # <--- status will be undef because the parameter, "Status", does not begin with 3 digits
                    }
                    return $this->{status};
                }
            }

In the cgi version, this doesn't hurt much, because the engine will still pass the header - Status: 304 - to apache, and the web server will turn this into a HTTP/1.1 304 not modified header. However, in the mod_perl version, the engine will convert the undefined status to 200, and send out HTTP/1.1 200 OK, with an extra Status: 304 header and an empty document body, resulting in an empty page.

The following patch fixes the problem:

diff -rC4 /home/webadmin/wiki-test.islap003/lib/Foswiki/Response.pm lib/Foswiki/Response.pm
*** /home/webadmin/wiki-test.islap003/lib/Foswiki/Response.pm   Wed Nov 10 01:29:12 2010
--- lib/Foswiki/Response.pm     Mon Mar 31 15:59:49 2014
***************
*** 243,251 ****
      while ( my ( $hdr, $value ) = each %$hopt ) {
          $hdr =~ s/(?:^|(?<=-))(.)([^-]*)/\u$1\L$2\E/g;
          unless ( exists $this->{headers}->{$hdr} ) {
              if ( $hdr eq 'Status' ) {
!                 $this->status($hdr);
              }
              elsif ( $hdr eq 'Expires' ) {
                  $value = CGI::Util::expires( $value, 'http' );
              }
--- 243,251 ----
      while ( my ( $hdr, $value ) = each %$hopt ) {
          $hdr =~ s/(?:^|(?<=-))(.)([^-]*)/\u$1\L$2\E/g;
          unless ( exists $this->{headers}->{$hdr} ) {
              if ( $hdr eq 'Status' ) { 
!                 $this->status($value);
              }
              elsif ( $hdr eq 'Expires' ) {
                  $value = CGI::Util::expires( $value, 'http' );
              }

-- GuntramBlohm - 31 Mar 2014

Thanks a lot for the fix. Same error happens on trunk. I don't think the error is related to mod_perl.

-- MichaelDaum - 01 Apr 2014
 

ItemTemplate edit

Summary http status code not properly set under certain conditions
ReportedBy GuntramBlohm
Codebase 1.1.9, trunk
SVN Range
AppliesTo Engine
Component Foswiki/Response.pm
Priority Normal
CurrentState Closed
WaitingFor
Checkins distro:f783768789a8
TargetRelease major
ReleasedIn 2.0.0
CheckinsOnBranches trunk
trunkCheckins distro:f783768789a8
Release01x01Checkins
Topic revision: r4 - 05 Jul 2015, GeorgeClark
The copyright of the content on this website is held by the contributing authors, except where stated elsewhere. See Copyright Statement. Creative Commons License    Legal Imprint    Privacy Policy