summaryrefslogtreecommitdiffstats
path: root/xmlrpc.cgi
diff options
context:
space:
mode:
Diffstat (limited to 'xmlrpc.cgi')
-rwxr-xr-xxmlrpc.cgi40
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;