diff -urN Catalyst-Action-REST-0.83.original/lib/Catalyst/Action/Deserialize/JSON.pm Catalyst-Action-REST-0.83/lib/Catalyst/Action/Deserialize/JSON.pm --- Catalyst-Action-REST-0.83.original/lib/Catalyst/Action/Deserialize/JSON.pm 2010-02-08 22:23:31.000000000 +0000 +++ Catalyst-Action-REST-0.83/lib/Catalyst/Action/Deserialize/JSON.pm 2010-08-22 13:06:39.769253581 +0000 @@ -4,7 +4,7 @@ use namespace::autoclean; extends 'Catalyst::Action'; -use JSON qw( decode_json ); +use JSON; our $VERSION = '0.83'; $VERSION = eval $VERSION; @@ -23,7 +23,13 @@ } if ( $rbody ) { - my $rdata = eval { decode_json( $rbody ) }; + my $json = JSON->new->utf8; + if (my $options = $controller->{json_options}) { + foreach my $opt (keys %$options) { + $json->$opt( $options->{$opt} ); + } + } + my $rdata = eval { $json->decode( $rbody ) }; if ($@) { return $@; } diff -urN Catalyst-Action-REST-0.83.original/lib/Catalyst/Controller/REST.pm Catalyst-Action-REST-0.83/lib/Catalyst/Controller/REST.pm --- Catalyst-Action-REST-0.83.original/lib/Catalyst/Controller/REST.pm 2010-02-08 22:23:44.000000000 +0000 +++ Catalyst-Action-REST-0.83/lib/Catalyst/Controller/REST.pm 2010-08-22 13:08:31.160215081 +0000 @@ -146,6 +146,12 @@ L installed. The C content type is supported but is deprecated and you will receive warnings in your log. +You can also add a hash in your controller config to pass options to the json object. +For instance, to relax permissions when deserializing input, add: + __PACKAGE__->config( + json_options => { relaxed => 1 } + ) + =item * C => C If a callback=? parameter is passed, this returns javascript in the form of: $callback($serializedJSON); diff -urN Catalyst-Action-REST-0.83.original/t/json.t Catalyst-Action-REST-0.83/t/json.t --- Catalyst-Action-REST-0.83.original/t/json.t 2009-10-26 23:43:22.000000000 +0000 +++ Catalyst-Action-REST-0.83/t/json.t 2010-08-22 13:34:13.060577831 +0000 @@ -10,7 +10,7 @@ eval 'use JSON 2.12'; plan skip_all => 'Install JSON 2.12 or later to run this test' if ($@); -plan tests => 9; +plan tests => 11; use_ok 'Catalyst::Test', 'Test::Serialize'; @@ -36,4 +36,14 @@ is_deeply($mres_post->content, $exp, "POST data matches"); } +{ + my $t = Test::Rest->new('content_type' => 'application/json'); + my $json_data = '{ "sushi":"is good for monkey", }'; + my $mres_post = request($t->post(url => '/monkey_put', data => $json_data)); + ok( ! $mres_post->is_success, "Got expected failed status due to invalid JSON" ); + + my $relaxed_post = request( $t->post(url => "/monkey_json_put", data => $json_data)); + ok( $relaxed_post->is_success, "Got success due to setting relaxed JSON input" ); +} + 1; diff -urN Catalyst-Action-REST-0.83.original/t/lib/Test/Serialize/Controller/JSON.pm Catalyst-Action-REST-0.83/t/lib/Test/Serialize/Controller/JSON.pm --- Catalyst-Action-REST-0.83.original/t/lib/Test/Serialize/Controller/JSON.pm 1970-01-01 00:00:00.000000000 +0000 +++ Catalyst-Action-REST-0.83/t/lib/Test/Serialize/Controller/JSON.pm 2010-08-22 13:32:04.900568331 +0000 @@ -0,0 +1,29 @@ +package Test::Serialize::Controller::JSON; + +use namespace::autoclean; +use Moose; + +BEGIN { extends qw/Catalyst::Controller::REST/ }; + +__PACKAGE__->config( + 'stash_key' => 'rest', + 'json_options' => { + relaxed => 1, + }, + 'map' => { + 'text/x-json' => 'JSON', + }, +); + +sub monkey_json_put : Path("/monkey_json_put") : ActionClass('Deserialize') { + my ( $self, $c ) = @_; + if ( ref($c->req->data) eq "HASH" ) { + my $out = ($c->req->data->{'sushi'}||'') . ($c->req->data->{'chicken'}||''); + utf8::encode($out); + $c->res->output( $out ); + } else { + $c->res->output(1); + } +} + +1;