Cherry pick everything bar the use parent change from 25d49c2, fixing RT#46680
[catagits/Catalyst-Action-REST.git] / lib / Catalyst / Action / Serialize.pm
CommitLineData
7ad87df9 1package Catalyst::Action::Serialize;
2
3use strict;
4use warnings;
5
e601adda 6use base 'Catalyst::Action::SerializeBase';
7ad87df9 7use Module::Pluggable::Object;
def65dcc 8use MRO::Compat;
7ad87df9 9
10sub execute {
11 my $self = shift;
12 my ( $controller, $c ) = @_;
13
def65dcc 14 $self->maybe::next::method(@_);
e601adda 15
7ad87df9 16 return 1 if $c->req->method eq 'HEAD';
17 return 1 if length( $c->response->body );
18 return 1 if scalar @{ $c->error };
19 return 1 if $c->response->status =~ /^(?:204|3\d\d)$/;
20
9a76221e 21 my ( $sclass, $sarg, $content_type ) =
22 $self->_load_content_plugins( "Catalyst::Action::Serialize",
23 $controller, $c );
51cc8fe9 24 unless ( defined($sclass) ) {
9a76221e 25 if ( defined($content_type) ) {
faf5c20b 26 $c->log->info("Could not find a serializer for $content_type");
9a76221e 27 } else {
faf5c20b 28 $c->log->info(
9cd203c9 29 "Could not find a serializer for an empty content-type");
9a76221e 30 }
51cc8fe9 31 return 1;
32 }
9a76221e 33 $c->log->debug(
faf5c20b 34 "Serializing with $sclass" . ( $sarg ? " [$sarg]" : '' ) ) if $c->debug;
7ad87df9 35
e601adda 36 my $rc;
eccb2137 37 if ( defined($sarg) ) {
e601adda 38 $rc = $sclass->execute( $controller, $c, $sarg );
7ad87df9 39 } else {
e601adda 40 $rc = $sclass->execute( $controller, $c );
7ad87df9 41 }
9a76221e 42 if ( $rc eq 0 ) {
43 return $self->_unsupported_media_type( $c, $content_type );
44 } elsif ( $rc ne 1 ) {
45 return $self->_serialize_bad_request( $c, $content_type, $rc );
46 }
7ad87df9 47
48 return 1;
eccb2137 49}
7ad87df9 50
511;
398c5a1b 52
53=head1 NAME
54
55Catalyst::Action::Serialize - Serialize Data in a Response
56
57=head1 SYNOPSIS
58
59 package Foo::Controller::Bar;
60
61 __PACKAGE__->config(
faf5c20b 62 'default' => 'text/x-yaml',
63 'stash_key' => 'rest',
64 'map' => {
65 'text/html' => [ 'View', 'TT', ],
66 'text/x-yaml' => 'YAML',
67 'text/x-data-dumper' => [ 'Data::Serializer', 'Data::Dumper' ],
398c5a1b 68 }
69 );
70
e601adda 71 sub end :ActionClass('Serialize') {}
398c5a1b 72
73=head1 DESCRIPTION
74
75This action will serialize the body of an HTTP Response. The serializer is
e601adda 76selected by introspecting the HTTP Requests content-type header.
398c5a1b 77
faf5c20b 78It requires that your Catalyst controller is properly configured to set up the
79mapping between Content Type's and Serialization classes.
398c5a1b 80
faf5c20b 81The specifics of serializing each content-type is implemented as a plugin to
82L<Catalyst::Action::Serialize>.
398c5a1b 83
e601adda 84Typically, you would use this ActionClass on your C<end> method. However,
85nothing is stopping you from choosing specific methods to Serialize:
86
87 sub foo :Local :ActionClass('Serialize') {
88 .. populate stash with data ..
89 }
90
9a76221e 91When you use this module, the request class will be changed to
92L<Catalyst::Request::REST>.
93
398c5a1b 94=head1 CONFIGURATION
95
a51e7bbd 96=head2 map
398c5a1b 97
a51e7bbd 98Takes a hashref, mapping Content-Types to a given serializer plugin.
398c5a1b 99
a51e7bbd 100=head2 default
367b3ff4 101
a51e7bbd 102This is the 'fall-back' Content-Type if none of the requested or acceptable
103types is found in the L</map>. It must be an entry in the L</map>.
398c5a1b 104
a51e7bbd 105=head2 stash_key
398c5a1b 106
a51e7bbd 107Specifies the key of the stash entry holding the data that is to be serialized.
108So if the value is "rest", we will serialize the data under:
e601adda 109
110 $c->stash->{'rest'}
398c5a1b 111
a51e7bbd 112=head2 content_type_stash_key
398c5a1b 113
a51e7bbd 114Specifies the key of the stash entry that optionally holds an overriding
115Content-Type. If set, and if the specified stash entry has a valid value,
116then it takes priority over the requested content types.
398c5a1b 117
a51e7bbd 118This can be useful if you want to dynamically force a particular content type,
119perhaps for debugging.
398c5a1b 120
e601adda 121=head1 HELPFUL PEOPLE
122
123Daisuke Maki pointed out that early versions of this Action did not play
124well with others, or generally behave in a way that was very consistent
125with the rest of Catalyst.
126
398c5a1b 127=head1 SEE ALSO
128
129You likely want to look at L<Catalyst::Controller::REST>, which implements
e601adda 130a sensible set of defaults for doing a REST controller.
398c5a1b 131
132L<Catalyst::Action::Deserialize>, L<Catalyst::Action::REST>
133
5cb5f6bb 134=head1 AUTHORS
398c5a1b 135
5cb5f6bb 136See L<Catalyst::Action::REST> for authors.
398c5a1b 137
138=head1 LICENSE
139
140You may distribute this code under the same terms as Perl itself.
141
142=cut