X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=blobdiff_plain;f=lib%2FCatalyst%2FActionRole%2FConsumesContent.pm;h=4d15ac2b6dbce93c1a0525aa4e869fd33e8ec4a6;hp=9638a2d7a2d0dd544998d376d9a1e39ae783a4a6;hb=e72a3cd6e12d8b9594dcfdddf13c1fbabdffb900;hpb=3e0665e44f88f4bdcf58ffc4b8a5a51c294773be diff --git a/lib/Catalyst/ActionRole/ConsumesContent.pm b/lib/Catalyst/ActionRole/ConsumesContent.pm index 9638a2d..4d15ac2 100644 --- a/lib/Catalyst/ActionRole/ConsumesContent.pm +++ b/lib/Catalyst/ActionRole/ConsumesContent.pm @@ -9,10 +9,43 @@ has allowed_content_types => ( required=>1, lazy=>1, isa=>'ArrayRef', - auto_deref=>1, builder=>'_build_allowed_content_types'); -sub _build_allowed_content_types { shift->attributes->{Consumes} } +has normalized => ( + is=>'ro', + required=>1, + lazy=>1, + isa=>'HashRef', + builder=>'_build_normalized'); + + +sub _build_normalized { + return +{ + JSON => 'application/json', + JS => 'application/javascript', + PERL => 'application/perl', + HTML => 'text/html', + XML => 'text/XML', + Plain => 'text/plain', + UrlEncoded => 'application/x-www-form-urlencoded', + Multipart => 'multipart/form-data', + HTMLForm => ['application/x-www-form-urlencoded','multipart/form-data'], + }; +} + +sub _build_allowed_content_types { + my $self = shift; + my @proto = map {split ',', $_ } @{$self->attributes->{Consumes}}; + my @converted = map { + if(my $normalized = $self->normalized->{$_}) { + ref $normalized ? @$normalized : ($normalized); + } else { + $_; + } + } @proto; + + return \@converted; +} around ['match','match_captures'] => sub { my ($orig, $self, $ctx, @args) = @_; @@ -25,10 +58,18 @@ around ['match','match_captures'] => sub { sub can_consume { my ($self, $request_content_type) = @_; my @matches = grep { lc($_) eq lc($request_content_type) } - $self->allowed_content_types; + @{$self->allowed_content_types}; return @matches ? 1:0; } +around 'list_extra_info' => sub { + my ($orig, $self, @args) = @_; + return { + %{ $self->$orig(@args) }, + CONSUMES => $self->allowed_content_types, + }; +}; + 1; =head1 NAME @@ -49,9 +90,9 @@ Catalyst::ActionRole::ConsumesContent - Match on HTTP Request Content-Type ## Alternatively, for common types... - sub is_json : Chained('start') JSON { ... } - sub is_urlencoded : Chained('start') URLEncoded { ... } - sub is_multipart : Chained('start') FormData { ... } + sub is_json : Chained('start') Consume(JSON) { ... } + sub is_urlencoded : Chained('start') Consume(HTMLForm)URLEncoded { ... } + sub is_multipart : Chained('start') ConsumeFormData { ... } ## Or allow more than one type @@ -102,6 +143,11 @@ allowed content types (see L) and zero otherwise. An array of strings that are the allowed content types for matching this action. +=head2 can_consume + +Boolean. Does the current request match content type with what this actionrole +can consume? + =head1 AUTHORS Catalyst Contributors, see Catalyst.pm