From 874e96c2423c772564c9dc63254baa99e86f270b Mon Sep 17 00:00:00 2001 From: Dylan William Hardison Date: Sat, 12 Nov 2016 11:41:08 -0500 Subject: Bug 1314201 - ThrowUserError and ThrowCodeError should print headers if headers have not already been printed --- Bugzilla/CGI.pm | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) (limited to 'Bugzilla/CGI.pm') diff --git a/Bugzilla/CGI.pm b/Bugzilla/CGI.pm index 78987ab71..ec8b8e52b 100644 --- a/Bugzilla/CGI.pm +++ b/Bugzilla/CGI.pm @@ -21,6 +21,7 @@ use Bugzilla::Search::Recent; use File::Basename; use URI; +use Carp qw(cluck); BEGIN { if (ON_WINDOWS) { @@ -306,7 +307,6 @@ sub check_etag { return 0; } -# Overwrite to ensure nph doesn't get set, and unset HEADERS_ONCE sub multipart_init { my $self = shift; @@ -330,6 +330,7 @@ sub multipart_init { # CGI.pm's header() sets nph according to a param or $CGI::NPH, which # is the desired behaviour. + $self->{_bz_multipart} = 1; return $self->header( %param, ) . "WARNING: YOUR BROWSER DOESN'T SUPPORT THIS SERVER-PUSH TECHNOLOGY." . $self->multipart_end; @@ -384,7 +385,12 @@ sub header { my %headers; my $user = Bugzilla->user; - # If there's only one parameter, then it's a Content-Type. + if ($self->{_bz_headers_sent} && !$self->{_bz_multipart}) { + # cluck for the warning log so we can see where this was called. + cluck "attempt to send headers after headers already sent!"; + ThrowCodeError("headers_already_sent"); + } + if (scalar(@_) == 1) { %headers = ('-type' => shift(@_)); } @@ -460,9 +466,18 @@ sub header { Bugzilla::Hook::process('cgi_headers', { cgi => $self, headers => \%headers } ); - $self->{_header_done} = 1; - return $self->SUPER::header(%headers) || ""; + my $headers = $self->SUPER::header(%headers) || ""; + if ($headers && Bugzilla->usage_mode != USAGE_MODE_XMLRPC) { + $self->{_bz_headers_sent} = 1; + } + + return $headers; +} + +sub sent_headers { + my ($self) = @_; + return $self->{_bz_headers_sent}; } sub param { -- cgit v1.2.3-24-g4f1b