diff options
-rw-r--r-- | Bugzilla/CGI.pm | 26 | ||||
-rwxr-xr-x | buglist.cgi | 6 |
2 files changed, 22 insertions, 10 deletions
diff --git a/Bugzilla/CGI.pm b/Bugzilla/CGI.pm index b4bcf20c8..dd6061346 100644 --- a/Bugzilla/CGI.pm +++ b/Bugzilla/CGI.pm @@ -158,14 +158,27 @@ sub multipart_init { # CGI.pm's header() sets nph according to a param or $CGI::NPH, which # is the desired behaviour. - # Allow multiple calls to $cgi->header() - $CGI::HEADERS_ONCE = 0; - return $self->header( %param, ) . "WARNING: YOUR BROWSER DOESN'T SUPPORT THIS SERVER-PUSH TECHNOLOGY." . $self->multipart_end; } +# Have to add the cookies in. +sub multipart_start { + my $self = shift; + my $headers = $self->SUPER::multipart_start(@_); + # Eliminate the one extra CRLF at the end. + $headers =~ s/$CGI::CRLF$//; + # Add the cookies. We have to do it this way instead of + # passing them to multpart_start, because CGI.pm's multipart_start + # doesn't understand a '-cookie' argument pointing to an arrayref. + foreach my $cookie (@{$self->{Bugzilla_cookie_list}}) { + $headers .= "Set-Cookie: ${cookie}${CGI::CRLF}"; + } + $headers .= $CGI::CRLF; + return $headers; +} + # Override header so we can add the cookies in sub header { my $self = shift; @@ -183,13 +196,6 @@ sub header { return $self->SUPER::header(@_) || ""; } -# Override multipart_start to ensure our cookies are added and avoid bad quoting of -# CGI's multipart_start (bug 275108) -sub multipart_start { - my $self = shift; - return $self->header(@_); -} - # The various parts of Bugzilla which create cookies don't want to have to # pass them around to all of the callers. Instead, store them locally here, # and then output as required from |header|. diff --git a/buglist.cgi b/buglist.cgi index 1a7ffc316..1400968fc 100755 --- a/buglist.cgi +++ b/buglist.cgi @@ -884,6 +884,12 @@ if ($serverpush) { $template->process("list/server-push.html.tmpl", $vars) || ThrowTemplateError($template->error()); + # Under mod_perl, flush stdout so that the page actually shows up. + if ($ENV{MOD_PERL}) { + require Apache2::RequestUtil; + Apache2::RequestUtil->request->rflush(); + } + # Don't do multipart_end() until we're ready to display the replacement # page, otherwise any errors that happen before then (like SQL errors) # will result in a blank page being shown to the user instead of the error. |