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=db5d42e2212dca75d64981b3c606208609500454;hpb=faf5c20bff09c91f18b46a3d3d8349379aa36192;p=catagits%2FCatalyst-Action-REST.git diff --git a/lib/Catalyst/Action/SerializeBase.pm b/lib/Catalyst/Action/SerializeBase.pm index db5d42e..ac4934f 100644 --- a/lib/Catalyst/Action/SerializeBase.pm +++ b/lib/Catalyst/Action/SerializeBase.pm @@ -1,6 +1,6 @@ # # Catlyst::Action::SerializeBase.pm -# Created by: Adam Jacob, Marchex, +# Created by: Adam Jacob, Marchex, # # $Id$ @@ -36,8 +36,6 @@ sub _load_content_plugins { $self->_serialize_plugins( \@plugins ); } - my $content_type = $c->request->preferred_content_type; - # Finally, we load the class. If you have a default serializer, # and we still don't have a content-type that exists in the map, # we'll use it. @@ -55,14 +53,32 @@ 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 - if ( ! exists $map->{$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') { + $c->log->info('Using deprecated text/x-json content-type.'); + $c->log->info('Use application/json instead!'); } if ( exists( $map->{$content_type} ) ) { @@ -94,8 +110,7 @@ sub _load_content_plugins { eval { require $load_class; }; if ($@) { $c->log->error( - "Error loading $sclass for " . $content_type . ": $!" ) - if $c->log->is_debug; + "Error loading $sclass for " . $content_type . ": $!" ); return $self->_unsupported_media_type($c, $content_type); } else { $self->_loaded_plugins->{$sclass} = 1;