Version 0.91
[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 my $compartment = Safe->new;
10 $compartment->permit_only( qw(padany null lineseq const pushmark list anonhash anonlist refgen leaveeval undef) );
11
12 our $VERSION = '0.91';
13 $VERSION = eval $VERSION;
14
15 sub execute {
16     my $self = shift;
17     my ( $controller, $c, $serializer ) = @_;
18
19     my $sp = $serializer;
20     $sp =~ s/::/\//g;
21     $sp .= ".pm";
22     eval {
23         require $sp
24     };
25     if ($@) {
26         $c->log->debug("Could not load $serializer, refusing to serialize: $@")
27             if $c->debug;
28         return 0;
29     }
30     my $body = $c->request->body;
31     if ($body) {
32         my $rbody;
33         if ( -f $c->request->body ) {
34             open( BODY, "<", $c->request->body );
35             while ( my $line = <BODY> ) {
36                 $rbody .= $line;
37             }
38             close(BODY);
39         }
40         my $rdata;
41         if ( $serializer eq "Data::Dumper" ) {
42             # Taken from Data::Serialize::Data::Dumper::deserialize, but run within a Safe compartment
43             my $code = $rbody =~ /^\{/ ? "+".$rbody : $rbody;
44             $rdata = $compartment->reval( $code );
45         }
46         else {
47             my $dso = Data::Serializer->new( serializer => $serializer );
48             eval {
49                 $rdata = $dso->raw_deserialize($rbody);
50             };
51         }
52         if ($@) {
53             return $@;
54         }
55         $c->request->data($rdata);
56     } else {
57         $c->log->debug(
58             'I would have deserialized, but there was nothing in the body!')
59                 if $c->debug;
60     }
61     return 1;
62 }
63
64 __PACKAGE__->meta->make_immutable;
65
66 1;