summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Bugzilla/Error.pm7
-rw-r--r--Bugzilla/Hook.pm19
-rw-r--r--extensions/example/code/webservice-error_codes.pl25
-rw-r--r--extensions/example/lib/WSExample.pm4
-rw-r--r--extensions/example/template/en/global/user-error-errors.html.tmpl12
5 files changed, 65 insertions, 2 deletions
diff --git a/Bugzilla/Error.pm b/Bugzilla/Error.pm
index 3e5688e2a..d15336a81 100644
--- a/Bugzilla/Error.pm
+++ b/Bugzilla/Error.pm
@@ -102,7 +102,12 @@ sub _throw_error {
die("$message\n");
}
elsif (Bugzilla->error_mode == ERROR_MODE_DIE_SOAP_FAULT) {
- my $code = WS_ERROR_CODE->{$error};
+ # Clone the hash so we aren't modifying the constant.
+ my %error_map = %{ WS_ERROR_CODE() };
+ require Bugzilla::Hook;
+ Bugzilla::Hook::process('webservice-error_codes',
+ { error_map => \%error_map });
+ my $code = $error_map{$error};
if (!$code) {
$code = ERROR_UNKNOWN_FATAL if $name =~ /code/i;
$code = ERROR_UNKNOWN_TRANSIENT if $name =~ /user/i;
diff --git a/Bugzilla/Hook.pm b/Bugzilla/Hook.pm
index 0cf566db1..820693ee0 100644
--- a/Bugzilla/Hook.pm
+++ b/Bugzilla/Hook.pm
@@ -262,3 +262,22 @@ WebService functions (and so that you also don't conflict with other
plugins).
=back
+
+=head2 webservice-error_codes
+
+If your webservice extension throws custom errors, you can set numeric
+codes for those errors here.
+
+Extensions should use error codes above 10000, unless they are re-using
+an already-existing error code.
+
+Params:
+
+=over
+
+=item C<error_map>
+
+A hash that maps the names of errors (like C<invalid_param>) to numbers.
+See L<Bugzilla::WebService::Constants/WS_ERROR_CODE> for an example.
+
+=back
diff --git a/extensions/example/code/webservice-error_codes.pl b/extensions/example/code/webservice-error_codes.pl
new file mode 100644
index 000000000..94c4c52fc
--- /dev/null
+++ b/extensions/example/code/webservice-error_codes.pl
@@ -0,0 +1,25 @@
+# -*- Mode: perl; indent-tabs-mode: nil -*-
+#
+# The contents of this file are subject to the Mozilla Public
+# License Version 1.1 (the "License"); you may not use this file
+# except in compliance with the License. You may obtain a copy of
+# the License at http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS
+# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+# implied. See the License for the specific language governing
+# rights and limitations under the License.
+#
+# The Original Code is the Bugzilla Bug Tracking System.
+#
+# The Initial Developer of the Original Code is Everything Solved, Inc.
+# Portions created by Everything Solved, Inc. are Copyright (C) 2008
+# Everything Solved, Inc. All Rights Reserved.
+#
+# Contributor(s): Max Kanat-Alexander <mkanat@bugzilla.org>
+
+use strict;
+use warnings;
+use Bugzilla;
+my $error_map = Bugzilla->hook_args->{error_map};
+$error_map->{'example_my_error'} = 10001;
diff --git a/extensions/example/lib/WSExample.pm b/extensions/example/lib/WSExample.pm
index ced4c6d36..146867294 100644
--- a/extensions/example/lib/WSExample.pm
+++ b/extensions/example/lib/WSExample.pm
@@ -21,10 +21,12 @@
package extensions::example::lib::WSExample;
use strict;
use warnings;
-
use base qw(Bugzilla::WebService);
+use Bugzilla::Error;
# This can be called as Example.hello() from XML-RPC.
sub hello { return 'Hello!'; }
+sub throw_an_error { ThrowUserError('example_my_error') }
+
1;
diff --git a/extensions/example/template/en/global/user-error-errors.html.tmpl b/extensions/example/template/en/global/user-error-errors.html.tmpl
new file mode 100644
index 000000000..df5a203dd
--- /dev/null
+++ b/extensions/example/template/en/global/user-error-errors.html.tmpl
@@ -0,0 +1,12 @@
+[%# Note that error messages should generally be indented four spaces, like
+ # below, because when Bugzilla translates an error message into plain
+ # text, it takes four spaces off the beginning of the lines.
+ #
+ # Note also that I prefixed my error name with "example", the name of my
+ # extension, so that I wouldn't conflict with other error names in
+ # Bugzilla or other extensions.
+ #%]
+[% IF error == "example_my_error" %]
+ [% title = "Example Error Title" %]
+ This is the error message! It contains <em>some html</em>.
+[% END %]