]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 1094858: Create hook in Bugzilla::WebService::Constants to allow overrriding...
authorDavid Lawrence <dkl@mozilla.com>
Mon, 10 Nov 2014 16:08:13 +0000 (16:08 +0000)
committerDavid Lawrence <dkl@mozilla.com>
Mon, 10 Nov 2014 16:08:13 +0000 (16:08 +0000)
r=gerv,a=glob

Bugzilla/Hook.pm
Bugzilla/WebService/Constants.pm
extensions/Example/Extension.pm

index 2904acba143f414684eb27bbe315177a55c167fc..430d5af49a6e67afe364e2fbb25e3789ea25219b 100644 (file)
@@ -1704,6 +1704,26 @@ The current JSONRPC, XMLRPC, or REST object.
 
 =back
 
+=head2 webservice_status_code_map
+
+This hook allows an extension to change the status codes returned by
+specific webservice errors. The valid internal error codes that Bugzilla
+generates, and the status codes they map to by default, are defined in the
+C<WS_ERROR_CODE> constant in C<Bugzilla::WebService::Constants>. When
+remapping an error, you may wish to use an existing status code constant.
+Such constants are also in C<Bugzilla::WebService::Constants> and start
+with C<STATUS_*> such as C<STATUS_BAD_REQUEST>.
+
+Params:
+
+=over
+
+=item C<status_code_map>
+
+A hash reference containing the current status code mapping.
+
+=back
+
 =head1 SEE ALSO
 
 L<Bugzilla::Extension>
index db50611cbf6454e870a6d672c8ddf433bc5983bb..2f38c8db14849a8def295b75ab5e9e3d985cff69 100644 (file)
@@ -239,26 +239,33 @@ use constant STATUS_GONE             => 410;
 # the related webvservice call. We choose the appropriate
 # http status code based on the error code or use the
 # default STATUS_BAD_REQUEST.
-use constant REST_STATUS_CODE_MAP => {
-    51       => STATUS_NOT_FOUND,
-    101      => STATUS_NOT_FOUND,
-    102      => STATUS_NOT_AUTHORIZED,
-    106      => STATUS_NOT_AUTHORIZED,
-    109      => STATUS_NOT_AUTHORIZED,
-    110      => STATUS_NOT_AUTHORIZED,
-    113      => STATUS_NOT_AUTHORIZED,
-    115      => STATUS_NOT_AUTHORIZED,
-    120      => STATUS_NOT_AUTHORIZED,
-    300      => STATUS_NOT_AUTHORIZED,
-    301      => STATUS_NOT_AUTHORIZED,
-    302      => STATUS_NOT_AUTHORIZED,
-    303      => STATUS_NOT_AUTHORIZED,
-    304      => STATUS_NOT_AUTHORIZED,
-    410      => STATUS_NOT_AUTHORIZED,
-    504      => STATUS_NOT_AUTHORIZED,
-    505      => STATUS_NOT_AUTHORIZED,
-    32614    => STATUS_NOT_FOUND,
-    _default => STATUS_BAD_REQUEST
+sub REST_STATUS_CODE_MAP {
+    my $status_code_map = {
+        51       => STATUS_NOT_FOUND,
+        101      => STATUS_NOT_FOUND,
+        102      => STATUS_NOT_AUTHORIZED,
+        106      => STATUS_NOT_AUTHORIZED,
+        109      => STATUS_NOT_AUTHORIZED,
+        110      => STATUS_NOT_AUTHORIZED,
+        113      => STATUS_NOT_AUTHORIZED,
+        115      => STATUS_NOT_AUTHORIZED,
+        120      => STATUS_NOT_AUTHORIZED,
+        300      => STATUS_NOT_AUTHORIZED,
+        301      => STATUS_NOT_AUTHORIZED,
+        302      => STATUS_NOT_AUTHORIZED,
+        303      => STATUS_NOT_AUTHORIZED,
+        304      => STATUS_NOT_AUTHORIZED,
+        410      => STATUS_NOT_AUTHORIZED,
+        504      => STATUS_NOT_AUTHORIZED,
+        505      => STATUS_NOT_AUTHORIZED,
+        32614    => STATUS_NOT_FOUND,
+        _default => STATUS_BAD_REQUEST
+    };
+
+    Bugzilla::Hook::process('webservice_status_code_map',
+        { status_code_map => $status_code_map });
+
+    return $status_code_map;
 };
 
 # These are the fallback defaults for errors not in ERROR_CODE.
@@ -307,6 +314,7 @@ sub WS_DISPATCH {
 
 =over
 
+=item REST_STATUS_CODE_MAP
 =item WS_DISPATCH
 
 =back
index 256589dab0804508893f48a135d7e143b1d7d37b..af36b107af6a224e4b31c45b6cf8e9bd2eca4ec4 100644 (file)
@@ -21,6 +21,7 @@ use Bugzilla::User::Setting;
 use Bugzilla::Util qw(diff_arrays html_quote);
 use Bugzilla::Status qw(is_open_state);
 use Bugzilla::Install::Filesystem;
+use Bugzilla::WebService::Constants;
 
 # This is extensions/Example/lib/Util.pm. I can load this here in my
 # Extension.pm only because I have a Config.pm.
@@ -958,11 +959,20 @@ sub webservice {
 
 sub webservice_error_codes {
     my ($self, $args) = @_;
-    
+
     my $error_map = $args->{error_map};
     $error_map->{'example_my_error'} = 10001;
 }
 
+sub webservice_status_code_map {
+    my ($self, $args) = @_;
+
+    my $status_code_map = $args->{status_code_map};
+    # Uncomment this line to override the status code for the
+    # error 'object_does_not_exist' to STATUS_BAD_REQUEST
+    #$status_code_map->{51} = STATUS_BAD_REQUEST;
+}
+
 sub webservice_before_call {
     my ($self, $args) = @_;