From e944ebab1ef01993751c75d5fd25ec6b590cb858 Mon Sep 17 00:00:00 2001 From: Dave Lawrence Date: Wed, 5 Feb 2014 22:55:07 +0000 Subject: Bug 968482 - backport bug 966277 to bmo/4.2 to set default content type if no accept header provided --- Bugzilla/WebService/Constants.pm | 5 +++-- Bugzilla/WebService/Server/REST.pm | 8 +++++++- 2 files changed, 10 insertions(+), 3 deletions(-) (limited to 'Bugzilla') diff --git a/Bugzilla/WebService/Constants.pm b/Bugzilla/WebService/Constants.pm index d0ce26caf..c2a6d855c 100644 --- a/Bugzilla/WebService/Constants.pm +++ b/Bugzilla/WebService/Constants.pm @@ -256,11 +256,12 @@ use constant XMLRPC_CONTENT_TYPE_WHITELIST => qw( application/xml ); +# The first content type specified is used as the default. use constant REST_CONTENT_TYPE_WHITELIST => qw( - text/html - application/javascript application/json + application/javascript text/javascript + text/html ); sub WS_DISPATCH { diff --git a/Bugzilla/WebService/Server/REST.pm b/Bugzilla/WebService/Server/REST.pm index 2216911c9..61af97a50 100644 --- a/Bugzilla/WebService/Server/REST.pm +++ b/Bugzilla/WebService/Server/REST.pm @@ -39,6 +39,8 @@ sub handle { # Determine how the data should be represented. We do this early so # errors will also be returned with the proper content type. + # If no accept header was sent or the content types specified were not + # matched, we default to the first type in the whitelist. $self->content_type($self->_best_content_type(REST_CONTENT_TYPE_WHITELIST())); # Using current path information, decide which class/method to @@ -440,6 +442,10 @@ sub _best_content_type { sub _simple_content_negotiation { my ($self, @types) = @_; my @accept_types = $self->_get_content_prefs(); + # Return the types as-is if no accept header sent, since sorting will be a no-op. + if (!@accept_types) { + return @types; + } my $score = sub { $self->_score_type(shift, @accept_types) }; return sort {$score->($b) <=> $score->($a)} @types; } @@ -478,7 +484,7 @@ sub _get_content_prefs { # Sort the types by score, subscore by order, and pull out just the name @prefs = map {$_->{name}} sort {$b->{score} <=> $a->{score} || $a->{order} <=> $b->{order}} @prefs; - return @prefs, '*/*'; # Allows allow for */* + return @prefs; } 1; -- cgit v1.2.3-24-g4f1b