X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FAction%2FSerializeBase.pm;h=db5d42e2212dca75d64981b3c606208609500454;hb=faf5c20bff09c91f18b46a3d3d8349379aa36192;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..db5d42e 100644 --- a/lib/Catalyst/Action/SerializeBase.pm +++ b/lib/Catalyst/Action/SerializeBase.pm @@ -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,35 @@ 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'); - } - - # 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 ( $type, $qvalue ) = @{$pair}[ 0, 3 ]; - - unless ( defined $qvalue ) { - $qvalue = 1 - ( ++$counter / 1000 ); - } - - $accept{$type} = sprintf( '%.3f', $qvalue ); - } - - foreach my $type ( sort { $accept{$b} <=> $accept{$a} } keys %accept ) - { - - if ( exists $controller->config->{'serialize'}->{'map'}->{$type} ) - { - $content_type = $type; - last; - } - } - $used_accept = 1; - } + 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. my $sclass = $search_path . "::"; my $sarg; - my $map = $controller->config->{'serialize'}->{'map'}; + 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 + if ( ! exists $map->{$content_type} ) { + if( exists $config->{'default'} ) { + $content_type = $config->{'default'} ; + } else { + return $self->_unsupported_media_type($c, $content_type); + } + } + if ( exists( $map->{$content_type} ) ) { my $mc; if ( ref( $map->{$content_type} ) eq "ARRAY" ) { @@ -102,11 +85,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; @@ -126,7 +105,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);