summaryrefslogtreecommitdiffstats
path: root/Bugzilla/WebService
diff options
context:
space:
mode:
authorDavid Lawrence <dkl@mozilla.com>2014-11-13 19:08:08 +0100
committerDavid Lawrence <dkl@mozilla.com>2014-11-13 19:08:08 +0100
commitae3093fa0de16ffd653f8c4c55e4311e9264ab08 (patch)
treec4eb044cb38d9628c72815bfe2a201e5cd64c85f /Bugzilla/WebService
parent5b9d96e69d6c854a1838b7973a3b615ae1af9a7f (diff)
downloadbugzilla-ae3093fa0de16ffd653f8c4c55e4311e9264ab08.tar.gz
bugzilla-ae3093fa0de16ffd653f8c4c55e4311e9264ab08.tar.xz
Bug 1096565: backport bug 1088253 to bmo/4.2 to allow arbitrary URL params to be passed to REST API calls
Diffstat (limited to 'Bugzilla/WebService')
-rw-r--r--Bugzilla/WebService/Server/REST.pm37
1 files changed, 29 insertions, 8 deletions
diff --git a/Bugzilla/WebService/Server/REST.pm b/Bugzilla/WebService/Server/REST.pm
index 69f97ef08..cee1e7a03 100644
--- a/Bugzilla/WebService/Server/REST.pm
+++ b/Bugzilla/WebService/Server/REST.pm
@@ -29,6 +29,7 @@ use Bugzilla::WebService::Server::REST::Resources::Product;
use Bugzilla::WebService::Server::REST::Resources::User;
use Bugzilla::WebService::Server::REST::Resources::BugUserLastVisit;
+use List::MoreUtils qw(uniq);
use Scalar::Util qw(blessed reftype);
use MIME::Base64 qw(decode_base64);
@@ -347,14 +348,34 @@ sub _retrieve_json_params {
my $params = {};
%{$params} = %{ Bugzilla->input_params };
- # First add any params we were able to pull out of the path
- # based on the resource regexp
- %{$params} = (%{$params}, %{$self->bz_rest_params}) if $self->bz_rest_params;
+ # First add any parameters we were able to pull out of the path
+ # based on the resource regexp and combine with the normal URL
+ # parameters.
+ if (my $rest_params = $self->bz_rest_params) {
+ foreach my $param (keys %$rest_params) {
+ # If the param does not already exist or if the
+ # rest param is a single value, add it to the
+ # global params.
+ if (!exists $params->{$param} || !ref $rest_params->{$param}) {
+ $params->{$param} = $rest_params->{$param};
+ }
+ # If rest_param is a list then add any extra values to the list
+ elsif (ref $rest_params->{$param}) {
+ my @extra_values = ref $params->{$param}
+ ? @{ $params->{$param} }
+ : ($params->{$param});
+ $params->{$param}
+ = [ uniq (@{ $rest_params->{$param} }, @extra_values) ];
+ }
+ }
+ }
- # Merge any additional query key/values with $obj->{params} if not a GET request
- # We do this manually cause CGI.pm doesn't understand JSON strings.
+ # Any parameters passed in in the body of a non-GET request will override
+ # any parameters pull from the url path. Otherwise non-unique keys are
+ # combined.
if ($self->request->method ne 'GET') {
my $extra_params = {};
+ # We do this manually because CGI.pm doesn't understand JSON strings.
my $json = delete $params->{'POSTDATA'} || delete $params->{'PUTDATA'};
if ($json) {
eval { $extra_params = $self->json->utf8(0)->decode($json); };
@@ -363,9 +384,9 @@ sub _retrieve_json_params {
}
}
- # Allow parameters in the query string if request was not GET.
- # Note: query string parameters will override any matching params
- # also specified in the request body.
+ # Allow parameters in the query string if request was non-GET.
+ # Note: parameters in query string body override any matching
+ # parameters in the request body.
foreach my $param ($self->cgi->url_param()) {
$extra_params->{$param} = $self->cgi->url_param($param);
}