124af973c7675f12b36aa169e7e06966fd3fef25
[catagits/Catalyst-Action-REST.git] / lib / Catalyst / Action / Deserialize / Data / Serializer.pm
1 package Catalyst::Action::Deserialize::Data::Serializer;
2
3 use Moose;
4 use namespace::autoclean;
5
6 extends 'Catalyst::Action';
7 use Data::Serializer;
8 use Safe;
9 use Scalar::Util qw(openhandle);
10 my $compartment = Safe->new;
11 $compartment->permit_only( qw(padany null lineseq const pushmark list anonhash anonlist refgen leaveeval undef) );
12
13 our $VERSION = '1.03';
14 $VERSION = eval $VERSION;
15
16 sub execute {
17     my $self = shift;
18     my ( $controller, $c, $serializer ) = @_;
19
20     my $sp = $serializer;
21     $sp =~ s/::/\//g;
22     $sp .= ".pm";
23     eval {
24         require $sp
25     };
26     if ($@) {
27         $c->log->debug("Could not load $serializer, refusing to serialize: $@")
28             if $c->debug;
29         return 0;
30     }
31     my $body = $c->request->body;
32     if ($body) {
33         my $rbody = '';
34
35         if(openhandle $body) {
36             seek($body, 0, 0); # in case something has already read from it
37             while ( defined( my $line = <$body> ) ) {
38                 $rbody .= $line;
39             }
40         } else {
41             $rbody = $body;
42         }
43
44         my $rdata;
45         if ( $serializer eq "Data::Dumper" ) {
46             # Taken from Data::Serialize::Data::Dumper::deserialize, but run within a Safe compartment
47             my $code = $rbody =~ /^\{/ ? "+".$rbody : $rbody;
48             $rdata = $compartment->reval( $code );
49         }
50         else {
51             my $dso = Data::Serializer->new( serializer => $serializer );
52             eval {
53                 $rdata = $dso->raw_deserialize($rbody);
54             };
55         }
56         if ($@) {
57             return $@;
58         }
59         $c->request->data($rdata);
60     } else {
61         $c->log->debug(
62             'I would have deserialized, but there was nothing in the body!')
63                 if $c->debug;
64     }
65     return 1;
66 }
67
68 __PACKAGE__->meta->make_immutable;
69
70 1;