X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Action-REST.git;a=blobdiff_plain;f=lib%2FCatalyst%2FTraitFor%2FRequest%2FREST.pm;h=1b9c87252ea7c72f2e11b6044c0813630d7d0214;hp=b881a5830ebd34de8d3b2d3a5b2c46da4e25425d;hb=3bb36dcaabf34fef5c15b1bb74c5eb198a7f5168;hpb=e623bdf28cc0a79351b055872dedcc1300a5eaca diff --git a/lib/Catalyst/TraitFor/Request/REST.pm b/lib/Catalyst/TraitFor/Request/REST.pm index b881a58..1b9c872 100644 --- a/lib/Catalyst/TraitFor/Request/REST.pm +++ b/lib/Catalyst/TraitFor/Request/REST.pm @@ -3,13 +3,30 @@ use Moose::Role; use HTTP::Headers::Util qw(split_header_words); use namespace::autoclean; +our $VERSION = '0.82'; +$VERSION = eval $VERSION; + has [qw/ data accept_only /] => ( is => 'rw' ); -sub accepted_content_types { +has accepted_content_types => ( + is => 'ro', + isa => 'ArrayRef', + lazy => 1, + builder => '_build_accepted_content_types', + init_arg => undef, +); + +has preferred_content_type => ( + is => 'ro', + isa => 'Str', + lazy => 1, + builder => '_build_preferred_content_type', + init_arg => undef, +); + +sub _build_accepted_content_types { my $self = shift; - return $self->{content_types} if $self->{content_types}; - my %types; # First, we use the content type in the HTTP Request. It wins all. @@ -49,11 +66,10 @@ sub accepted_content_types { } } - return $self->{content_types} = - [ sort { $types{$b} <=> $types{$a} } keys %types ]; + [ sort { $types{$b} <=> $types{$a} } keys %types ]; } -sub preferred_content_type { $_[0]->accepted_content_types->[0] } +sub _build_preferred_content_type { $_[0]->accepted_content_types->[0] } sub accepts { my $self = shift; @@ -63,3 +79,86 @@ sub accepts { } 1; +__END__ + +=head1 NAME + +Catalyst::TraitFor::Request::REST - A role to apply to Catalyst::Request giving it REST methods and attributes. + +=head1 SYNOPSIS + + if ( $c->request->accepts('application/json') ) { + ... + } + + my $types = $c->request->accepted_content_types(); + +=head1 DESCRIPTION + +This is a L applied to L that adds a few +methods to the request object to facilitate writing REST-y code. +Currently, these methods are all related to the content types accepted by +the client. + +=head1 METHODS + +=over + +=item data + +If the request went through the Deserializer action, this method will +return the deserialized data structure. + +=item accepted_content_types + +Returns an array reference of content types accepted by the +client. + +The list of types is created by looking at the following sources: + +=over 8 + +=item * Content-type header + +If this exists, this will always be the first type in the list. + +=item * content-type parameter + +If the request is a GET request and there is a "content-type" +parameter in the query string, this will come before any types in the +Accept header. + +=item * Accept header + +This will be parsed and the types found will be ordered by the +relative quality specified for each type. + +=back + +If a type appears in more than one of these places, it is ordered based on +where it is first found. + +=item preferred_content_type + +This returns the first content type found. It is shorthand for: + + $request->accepted_content_types->[0] + +=item accepts($type) + +Given a content type, this returns true if the type is accepted. + +Note that this does not do any wildcard expansion of types. + +=back + +=head1 AUTHORS + +See L for authors. + +=head1 LICENSE + +You may distribute this code under the same terms as Perl itself. + +=cut +