diff options
Diffstat (limited to 'xmlrpc.cgi')
-rwxr-xr-x | xmlrpc.cgi | 40 |
1 files changed, 28 insertions, 12 deletions
diff --git a/xmlrpc.cgi b/xmlrpc.cgi index 07c1020aa..620187e5a 100755 --- a/xmlrpc.cgi +++ b/xmlrpc.cgi @@ -16,27 +16,43 @@ use Bugzilla; use Bugzilla::Constants; use Bugzilla::Error; use Bugzilla::WebService::Constants; +use Capture::Tiny qw(capture_stdout); + BEGIN { - if (!Bugzilla->feature('xmlrpc')) { - ThrowCodeError('feature_disabled', { feature => 'xmlrpc' }); - } + if (!Bugzilla->feature('xmlrpc')) { + ThrowCodeError('feature_disabled', {feature => 'xmlrpc'}); + } } use Bugzilla::WebService::Server::XMLRPC; -Bugzilla->usage_mode(USAGE_MODE_XMLRPC); +my $stdout = capture_stdout { + Bugzilla->usage_mode(USAGE_MODE_XMLRPC); # Fix the error code that SOAP::Lite uses for Perl errors. -local $SOAP::Constants::FAULT_SERVER; -$SOAP::Constants::FAULT_SERVER = ERROR_UNKNOWN_FATAL; + local $SOAP::Constants::FAULT_SERVER; + $SOAP::Constants::FAULT_SERVER = ERROR_UNKNOWN_FATAL; + # The line above is used, this one is ignored, but SOAP::Lite # might start using this constant (the correct one) for XML-RPC someday. -local $XMLRPC::Constants::FAULT_SERVER; -$XMLRPC::Constants::FAULT_SERVER = ERROR_UNKNOWN_FATAL; + local $XMLRPC::Constants::FAULT_SERVER; + $XMLRPC::Constants::FAULT_SERVER = ERROR_UNKNOWN_FATAL; + + local @INC = (bz_locations()->{extensionsdir}, @INC); + my $server = new Bugzilla::WebService::Server::XMLRPC; -local @INC = (bz_locations()->{extensionsdir}, @INC); -my $server = new Bugzilla::WebService::Server::XMLRPC; # We use a sub for on_action because that gets us the info about what # class is being called. Note that this is a hack--this is technically # for setting SOAPAction, which isn't used by XML-RPC. -$server->on_action(sub { $server->handle_login(WS_DISPATCH, @_) }) - ->handle(); + $server->on_action(sub { $server->handle_login(WS_DISPATCH, @_) })->handle(); +}; +my $C = $Bugzilla::Quantum::CGI::C; +my ($header_str, $body) = split(/(?:\r\n\r\n|\n\n)/, $stdout, 2); +my $headers = Mojo::Headers->new; +$headers->parse("$header_str\r\n\r\n"); +foreach my $name (@{$headers->names}) { + $C->res->headers->header($name => $headers->header($name)); +} +my ($code) = $headers->header('Status') =~ /^(\d+)/; +$C->res->code($code) if $code; +$C->write($body); +exit; |