summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Bugzilla.pm2
-rw-r--r--Bugzilla/CGI.pm7
-rw-r--r--Bugzilla/Error.pm2
-rw-r--r--Bugzilla/Quantum.pm2
-rw-r--r--Bugzilla/Quantum/CGI.pm18
-rw-r--r--Bugzilla/WebService/Server/JSONRPC.pm3
6 files changed, 22 insertions, 12 deletions
diff --git a/Bugzilla.pm b/Bugzilla.pm
index 86d109350..c12e24e42 100644
--- a/Bugzilla.pm
+++ b/Bugzilla.pm
@@ -200,7 +200,7 @@ sub template {
if (Bugzilla->cgi->server_software eq 'Bugzilla::Quantum::CGI') {
return request_cache->{quantum_template} //= do {
my $template = request_cache->{template};
- my $c = request_cache->{mojo_controller};
+ my $c = $Bugzilla::C;
my $q_template = Bugzilla::Quantum::Template->new( controller => $c, template => $template );
$q_template->{_is_main} = 1;
$q_template;
diff --git a/Bugzilla/CGI.pm b/Bugzilla/CGI.pm
index 1e070290e..8fae0c424 100644
--- a/Bugzilla/CGI.pm
+++ b/Bugzilla/CGI.pm
@@ -601,8 +601,11 @@ sub header {
}
my $headers = $self->SUPER::header(%headers) || '';
if ($self->server_software eq 'Bugzilla::Quantum::CGI') {
- my $c = Bugzilla->request_cache->{mojo_controller};
+ my $c = $Bugzilla::C;
$c->res->headers->parse($headers);
+ if ($c->res->headers->status =~ /^([0-9]+)/) {
+ $c->res->code($1);
+ }
return '';
}
else {
@@ -712,7 +715,7 @@ sub redirect {
use Carp;
carp "redirect @_\n";
if ($self->server_software eq 'Bugzilla::Quantum::CGI') {
- my $c = Bugzilla->request_cache->{mojo_controller};
+ my $c = $Bugzilla::C;
$self->SUPER::redirect(@_);
$c->redirect_to($c->res->headers->location);
return '';
diff --git a/Bugzilla/Error.pm b/Bugzilla/Error.pm
index bd2442410..9fcd16386 100644
--- a/Bugzilla/Error.pm
+++ b/Bugzilla/Error.pm
@@ -128,6 +128,7 @@ sub _throw_error {
# of JSON::RPC. So, in that circumstance, instead of exiting,
# we die with no message. JSON::RPC checks raise_error before
# it checks $@, so it returns the proper error.
+ die if _in_eval();
$server->response($server->error_response_header);
}
}
@@ -257,6 +258,7 @@ sub ThrowErrorPage {
message => $message,
id => $server->{_bz_request_id},
version => $server->version);
+ die if _in_eval();
$server->response($server->error_response_header);
}
} else {
diff --git a/Bugzilla/Quantum.pm b/Bugzilla/Quantum.pm
index df06da697..dfa22d824 100644
--- a/Bugzilla/Quantum.pm
+++ b/Bugzilla/Quantum.pm
@@ -48,7 +48,7 @@ sub startup {
$r->any('/')->to('CGI#index_cgi');
$r->any('/rest')->to('CGI#rest_cgi');
- $r->any('/rest/*path_info')->to('CGI#rest_cgi');
+ $r->any('/rest/*PATH_INFO')->to('CGI#rest_cgi');
$r->get(
'/__lbheartbeat__' => sub {
diff --git a/Bugzilla/Quantum/CGI.pm b/Bugzilla/Quantum/CGI.pm
index 9b9af51de..aa1447c3e 100644
--- a/Bugzilla/Quantum/CGI.pm
+++ b/Bugzilla/Quantum/CGI.pm
@@ -17,8 +17,8 @@ use Sub::Quote 2.005000;
use Try::Tiny;
use Taint::Util qw(untaint);
use Socket qw(AF_INET inet_aton);
-use Capture::Tiny qw(capture_stdout);
use Sys::Hostname;
+use English qw(-no_match_vars);
sub load_all {
my ($class, $r) = @_;
@@ -60,24 +60,24 @@ sub _load_cgi {
my ($c) = @_;
my $stdin = $c->_STDIN;
my $stdout = '';
+ local $Bugzilla::C = $c;
local %ENV = $c->_ENV;
local *STDIN; ## no critic (local)
+ local *STDOUT; ## no critic (local)
local $CGI::Compile::USE_REAL_EXIT = 0;
+ local $PROGRAM_NAME = $file;
open STDIN, '<', $stdin->path or die "STDIN @{[$stdin->path]}: $!" if -s $stdin->path;
+ open STDOUT, '>', \$stdout or die "STDOUT capture: $!";
try {
Bugzilla->init_page();
- Bugzilla->request_cache->{mojo_controller} = $c;
- $stdout = capture_stdout \&$inner;
+ $inner->();
}
catch {
+ $c->render(text => $_);
die $_ unless ref $_ eq 'ARRAY' && $_->[0] eq "EXIT\n" || /\bModPerl::Util::exit\b/;
}
finally {
- if ( length $stdout ) {
- warn "setting body\n";
- $c->res->body($stdout);
- $c->rendered;
- }
+ $c->res->body($stdout) if $stdout
Bugzilla->_cleanup; ## no critic (private)
CGI::initialize_globals();
};
@@ -107,6 +107,7 @@ sub _ENV {
$remote_user = $authenticate =~ /Basic\s+(.*)/ ? b64_decode $1 : '';
$remote_user = $remote_user =~ /([^:]+)/ ? $1 : '';
}
+ my $path_info = $c->stash('PATH_INFO') || '';
return (
CONTENT_LENGTH => $content_length || 0,
@@ -115,6 +116,7 @@ sub _ENV {
HTTPS => $req->is_secure ? 'YES' : 'NO',
%env_headers,
QUERY_STRING => $c->stash('cgi.query_string') || $req->url->query->to_string,
+ PATH_INFO => $path_info ? "/$path_info" : '',
REMOTE_ADDR => $tx->remote_address,
REMOTE_HOST => gethostbyaddr( inet_aton( $tx->remote_address || '127.0.0.1' ), AF_INET ) || '',
REMOTE_PORT => $tx->remote_port,
diff --git a/Bugzilla/WebService/Server/JSONRPC.pm b/Bugzilla/WebService/Server/JSONRPC.pm
index 093167048..9253053ce 100644
--- a/Bugzilla/WebService/Server/JSONRPC.pm
+++ b/Bugzilla/WebService/Server/JSONRPC.pm
@@ -112,6 +112,9 @@ sub response {
print $cgi->header(-status => $response->code, @header_args);
print $response->content;
}
+ if ($cgi->server_software eq 'Bugzilla::Quantum::CGI') {
+ $Bugzilla::C->rendered;
+ }
}
# The JSON-RPC 1.1 GET specification is not so great--you can't specify