X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FAction%2FSerializeBase.pm;h=ba0cdf4e6313e34957974c928eaca50d976d4cdc;hb=c0008fc76f34cc22ceaf80003191f73a2300bfe5;hp=421a966d6f696a955dd7df2b44c14f06ca463577;hpb=44fa7f9429568532ea892e2020c20177b71cb736;p=catagits%2FCatalyst-Action-REST.git diff --git a/lib/Catalyst/Action/SerializeBase.pm b/lib/Catalyst/Action/SerializeBase.pm index 421a966..ba0cdf4 100644 --- a/lib/Catalyst/Action/SerializeBase.pm +++ b/lib/Catalyst/Action/SerializeBase.pm @@ -8,9 +8,6 @@ use Module::Pluggable::Object; use Catalyst::Request::REST; use Catalyst::Utils (); -our $VERSION = '1.04'; -$VERSION = eval $VERSION; - after BUILDARGS => sub { my $class = shift; my $config = shift; @@ -42,6 +39,8 @@ sub _load_content_plugins { my $sclass = $search_path . "::"; my $sarg; my $map; + my $compliance_mode; + my $default; my $config; @@ -56,6 +55,28 @@ sub _load_content_plugins { $config = $controller; } $map = $config->{'map'}; + $default = $config->{'default'} if $config->{'default'}; + + # If we're in RFC 7231 compliance mode we need to determine if we're + # serializing or deserializing, then set the request object to + # look at the appropriate set of supported content types. + $compliance_mode = $config->{'compliance_mode'}; + if($compliance_mode) { + my $serialize_mode = (split '::', $search_path)[-1]; + if($serialize_mode eq 'Deserialize') { + # Tell the request object to only look at the Content-Type header + $c->request->set_content_type_only(); + + # If we're in compliance mode and doing deserializing we want + # to use the allowed content types for deserializing, not the + # serializer map + $map = $config->{'deserialize_map'}; + $default = $config->{'deserialize_default'} if $config->{'deserialize_default'}; + } elsif($serialize_mode eq 'Serialize') { + # Tell the request object to only look at the Accept header + $c->request->set_accept_only(); + } + } # pick preferred content type my @accepted_types; # priority order, best first @@ -71,7 +92,7 @@ sub _load_content_plugins { # 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'}; + push @accepted_types, $default if $default; # pick the best match that we have a serializer mapping for my ($content_type) = grep { $map->{$_} } @accepted_types; @@ -121,10 +142,12 @@ sub _load_content_plugins { } if ($search_path eq "Catalyst::Action::Serialize") { - if ($content_type) { - $c->response->header( 'Vary' => 'Content-Type' ); - } elsif ($c->request->accept_only) { - $c->response->header( 'Vary' => 'Accept' ); + unless( $c->response->header( 'Vary' ) ) { + if ($content_type) { + $c->response->header( 'Vary' => 'Content-Type' ); + } elsif ($c->request->accept_only) { + $c->response->header( 'Vary' => 'Accept' ); + } } $c->response->content_type($content_type); }