/usr/share/perl5/Catalyst/ActionRole/ConsumesContent.pm is in libcatalyst-perl 5.90053-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 | package Catalyst::ActionRole::ConsumesContent;
use Moose::Role;
requires 'match', 'match_captures', 'list_extra_info';
has allowed_content_types => (
is=>'ro',
required=>1,
lazy=>1,
isa=>'ArrayRef',
builder=>'_build_allowed_content_types');
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) = @_;
if(my $content_type = $ctx->req->content_type) {
return 0 unless $self->can_consume($content_type);
}
return $self->$orig($ctx, @args);
};
sub can_consume {
my ($self, $request_content_type) = @_;
my @matches = grep { lc($_) eq lc($request_content_type) }
@{$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
Catalyst::ActionRole::ConsumesContent - Match on HTTP Request Content-Type
=head1 SYNOPSIS
package MyApp::Web::Controller::MyController;
use base 'Catalyst::Controller';
sub start : POST Chained('/') CaptureArg(0) { ... }
sub is_json : Chained('start') Consumes('application/json') { ... }
sub is_urlencoded : Chained('start') Consumes('application/x-www-form-urlencoded') { ... }
sub is_multipart : Chained('start') Consumes('multipart/form-data') { ... }
## Alternatively, for common types...
sub is_json : Chained('start') Consume(JSON) { ... }
sub is_urlencoded : Chained('start') Consumes(UrlEncoded) { ... }
sub is_multipart : Chained('start') Consumes(Multipart) { ... }
## Or allow more than one type
sub is_more_than_one
: Chained('start')
: Consumes('application/x-www-form-urlencoded')
: Consumes('multipart/form-data')
{
## ...
}
1;
=head1 DESCRIPTION
This is an action role that lets your L<Catalyst::Action> match on the content
type of the incoming request.
Generally when there's a PUT or POST request, there's a request content body
with a matching MIME content type. Commonly this will be one of the types
used with classic HTML forms ('application/x-www-form-urlencoded' for example)
but there's nothing stopping you specifying any valid content type.
For matching purposes, we match strings but the casing is insensitive.
=head1 REQUIRES
This role requires the following methods in the consuming class.
=head2 match
=head2 match_captures
Returns 1 if the action matches the existing request and zero if not.
=head1 METHODS
This role defines the following methods
=head2 match
=head2 match_captures
Around method modifier that return 1 if the request content type matches one of the
allowed content types (see L</http_methods>) and zero otherwise.
=head2 allowed_content_types
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?
=head2 list_extra_info
Add the accepted content type to the debug screen.
=head1 AUTHORS
Catalyst Contributors, see Catalyst.pm
=head1 COPYRIGHT
This library is free software. You can redistribute it and/or modify it under
the same terms as Perl itself.
=cut
|