X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FAction%2FSerializeBase.pm;h=ac4934fb61d2dcdce52154b30f8da4e9677e5558;hb=a51e7bbd48e4dd0c958549c3392690b00c3f2007;hp=b7a6765d3186e9657a443efc2464db3380d7fe75;hpb=d34635d1f87b7a53a522583fc6c91e76062709fd;p=catagits%2FCatalyst-Action-Serialize-Data-Serializer.git diff --git a/lib/Catalyst/Action/SerializeBase.pm b/lib/Catalyst/Action/SerializeBase.pm index b7a6765..ac4934f 100644 --- a/lib/Catalyst/Action/SerializeBase.pm +++ b/lib/Catalyst/Action/SerializeBase.pm @@ -53,18 +53,27 @@ sub _load_content_plugins { $config = $controller->config; } $map = $config->{'map'}; - # If we don't have a handler for our preferred content type, try - # the default - my ($content_type) = grep { $map->{$_} } @{$c->request->accepted_content_types}; - - unless ( defined $content_type ) { - if( exists $config->{'default'} ) { - $content_type = $config->{'default'} ; - } else { - return $self->_unsupported_media_type($c, $content_type); - } + # pick preferred content type + my @accepted_types; # priority order, best first + # give top priority to content type specified by stash, if any + my $content_type_stash_key = $config->{content_type_stash_key}; + if ($content_type_stash_key + and my $stashed = $c->stash->{$content_type_stash_key} + ) { + # convert to array if not already a ref + $stashed = [ $stashed ] if not ref $stashed; + push @accepted_types, @$stashed; } + # then content types requested by caller + push @accepted_types, @{ $c->request->accepted_content_types }; + # then the default + push @accepted_types, $config->{'default'} if $config->{'default'}; + # pick the best match that we have a serializer mapping for + my ($content_type) = grep { $map->{$_} } @accepted_types; + + return $self->_unsupported_media_type($c, $content_type) + if not $content_type; # carp about old text/x-json if ($content_type eq 'text/x-json') {