add71bcdea26edd4d2844cf012b125719b3f5483
[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;
9
10 our $VERSION = '1.01';
11 $VERSION = eval $VERSION;
12
13 sub execute {
14     my $self = shift;
15     my ( $controller, $c, $test ) = @_;
16
17     my $rbody;
18
19     # could be a string or a FH
20     if ( my $body = $c->request->body ) {
21         if(openhandle $body) {
22             seek($body, 0, 0); # in case something has already read from it
23             while ( defined( my $line = <$body> ) ) {
24                 $rbody .= $line;
25             }
26         } else {
27             $rbody = $body;
28         }
29     }
30
31     if ( $rbody ) {
32         my $json = JSON->new->utf8;
33         if (my $options = $controller->{json_options}) {
34             foreach my $opt (keys %$options) {
35                 $json->$opt( $options->{$opt} );
36             }
37         }
38         my $rdata = eval { $json->decode( $rbody ) };
39         if ($@) {
40             return $@;
41         }
42         $c->request->data($rdata);
43     } else {
44         $c->log->debug(
45             'I would have deserialized, but there was nothing in the body!')
46             if $c->debug;
47     }
48     return 1;
49 }
50
51 __PACKAGE__->meta->make_immutable;
52
53 1;