X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FAction%2FSerializeBase.pm;h=b7a6765d3186e9657a443efc2464db3380d7fe75;hb=c0aef9cd678b6b4e4ea557d7fa1e8f43153e00b0;hp=b3864d351ca0e45440072c19de2360c01071988d;hpb=2224bad1aeb7ddf00a41f3c00c55583830230182;p=catagits%2FCatalyst-Action-REST.git diff --git a/lib/Catalyst/Action/SerializeBase.pm b/lib/Catalyst/Action/SerializeBase.pm index b3864d3..b7a6765 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$ @@ -12,7 +12,10 @@ use warnings; use base 'Catalyst::Action'; use Module::Pluggable::Object; use Data::Dump qw(dump); -use HTTP::Headers::Util qw(split_header_words); +use Catalyst::Request::REST; + +Catalyst->request_class('Catalyst::Request::REST') + unless Catalyst->request_class->isa('Catalyst::Request::REST'); __PACKAGE__->mk_accessors(qw(_serialize_plugins _loaded_plugins)); @@ -33,55 +36,42 @@ sub _load_content_plugins { $self->_serialize_plugins( \@plugins ); } - # First, we use the content type in the HTTP Request. It wins all. - my $content_type = $c->request->content_type || ''; - - # Second, we allow GET requests to tunnel the content-type as - # a query param. - if (!$content_type && $c->req->method eq "GET" && $c->req->param('content-type')) { - - $content_type = $c->req->param('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. + my $sclass = $search_path . "::"; + my $sarg; + my $map; + + my $config; + + if ( exists $controller->config->{'serialize'} ) { + $c->log->info("Using deprecated configuration for Catalyst::Action::REST!"); + $c->log->info("Please see perldoc Catalyst::Action::REST for the update guide"); + $config = $controller->config->{'serialize'}; + } else { + $config = $controller->config; } + $map = $config->{'map'}; + # If we don't have a handler for our preferred content type, try + # the default - # Third, we parse the Accept header, and see if the client - # takes a format we understand. - # - # This is taken from chansen's Apache2::UploadProgress. - my $used_accept = 0; - if ( !$content_type && $c->request->header('Accept') ) { - my $accept_header = $c->request->header('Accept'); - my %accept = (); - my $counter = 0; - - foreach my $pair ( split_header_words($accept_header) ) { + my ($content_type) = grep { $map->{$_} } @{$c->request->accepted_content_types}; - my ( $type, $qvalue ) = @{$pair}[ 0, 3 ]; - - unless ( defined $qvalue ) { - $qvalue = 1 - ( ++$counter / 1000 ); - } - - $accept{$type} = sprintf( '%.3f', $qvalue ); + unless ( defined $content_type ) { + if( exists $config->{'default'} ) { + $content_type = $config->{'default'} ; + } else { + return $self->_unsupported_media_type($c, $content_type); } + } - foreach my $type ( sort { $accept{$b} <=> $accept{$a} } keys %accept ) - { - - if ( exists $controller->config->{'serialize'}->{'map'}->{$type} ) - { - $content_type = $type; - last; - } - } - $used_accept = 1; + # 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!'); } - # 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. - my $sclass = $search_path . "::"; - my $sarg; - my $map = $controller->config->{'serialize'}->{'map'}; if ( exists( $map->{$content_type} ) ) { my $mc; if ( ref( $map->{$content_type} ) eq "ARRAY" ) { @@ -102,11 +92,7 @@ sub _load_content_plugins { return $self->_unsupported_media_type($c, $content_type); } } else { - if ( exists( $controller->config->{'serialize'}->{'default'} ) ) { - $sclass .= $controller->config->{'serialize'}->{'default'}; - } else { - return $self->_unsupported_media_type($c, $content_type); - } + return $self->_unsupported_media_type($c, $content_type); } unless ( exists( $self->_loaded_plugins->{$sclass} ) ) { my $load_class = $sclass; @@ -115,8 +101,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; @@ -126,7 +111,7 @@ sub _load_content_plugins { if ($search_path eq "Catalyst::Action::Serialize") { if ($content_type) { $c->response->header( 'Vary' => 'Content-Type' ); - } elsif ($used_accept) { + } elsif ($c->request->accept_only) { $c->response->header( 'Vary' => 'Accept' ); } $c->response->content_type($content_type);