no need for OurPkgVersion with modern dzil
[catagits/Catalyst-Action-REST.git] / lib / Catalyst / Action / Deserialize / JSON.pm
1 package Catalyst::Action::Deserialize::JSON;
2
3 use Moose;
4 use namespace::autoclean;
5 use Scalar::Util qw(openhandle);
6
7 extends 'Catalyst::Action';
8 use JSON::MaybeXS qw(JSON);
9
10 sub execute {
11     my $self = shift;
12     my ( $controller, $c, $test ) = @_;
13
14     my $rbody;
15
16     # could be a string or a FH
17     if ( my $body = $c->request->body ) {
18         if(openhandle $body) {
19             seek($body, 0, 0); # in case something has already read from it
20             while ( defined( my $line = <$body> ) ) {
21                 $rbody .= $line;
22             }
23         } else {
24             $rbody = $body;
25         }
26     }
27
28     if ( $rbody ) {
29         my $json = JSON->new->utf8;
30         if (my $options = $controller->{json_options}) {
31             foreach my $opt (keys %$options) {
32                 $json->$opt( $options->{$opt} );
33             }
34         }
35         my $rdata = eval { $json->decode( $rbody ) };
36         if ($@) {
37             return $@;
38         }
39         $c->request->data($rdata);
40     } else {
41         $c->log->debug(
42             'I would have deserialized, but there was nothing in the body!')
43             if $c->debug;
44     }
45     return 1;
46 }
47
48 __PACKAGE__->meta->make_immutable;
49
50 1;