X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=blobdiff_plain;f=lib%2FCatalyst.pm;h=d16779b5a9292d4494c2dfaaabec19fca26d5b97;hp=0e2fdbd23bae24606be1ba3f9056f36957296cbf;hb=a61b69837d86d115383621109faa3157af75ce91;hpb=35b3434762d426e0cd5e04eb735291f8ca7ea08e diff --git a/lib/Catalyst.pm b/lib/Catalyst.pm index 0e2fdbd..d16779b 100644 --- a/lib/Catalyst.pm +++ b/lib/Catalyst.pm @@ -65,6 +65,8 @@ sub _build_request_constructor_args { my %p = ( _log => $self->log ); $p{_uploadtmp} = $self->_uploadtmp if $self->_has_uploadtmp; $p{data_handlers} = {$self->registered_data_handlers}; + $p{_use_hash_multivalue} = $self->config->{use_hash_multivalue_in_request} + if $self->config->{use_hash_multivalue_in_request}; \%p; } @@ -118,7 +120,7 @@ __PACKAGE__->stats_class('Catalyst::Stats'); # Remember to update this in Catalyst::Runtime as well! -our $VERSION = '5.90049_002'; +our $VERSION = '5.90049_006'; sub import { my ( $class, @arguments ) = @_; @@ -3165,15 +3167,20 @@ you really don't need to invoke it. =head2 default_data_handlers -Default Data Handler that come bundled with L. Currently there is -only one default data handler, for 'application/json'. This uses L -which uses the dependency free L OR L if you have -installed it. If you don't mind the XS dependency, you should add the faster -L to you dependency list (in your Makefile.PL or dist.ini, or -cpanfile, etc.) +Default Data Handlers that come bundled with L. Currently there are +only two default data handlers, for 'application/json' and an alternative to +'application/x-www-form-urlencoded' which supposed nested form parameters via +L or via L IF you've installed it. -L is loaded the first time you ask for it (so if you never ask -for it, its never used). +The 'application/json' data handler is used to parse incoming JSON into a Perl +data structure. It used either L or L, depending on which +is installed. This allows you to fail back to L, which is a Pure Perl +JSON decoder, and has the smallest dependency impact. + +Because we don't wish to add more dependencies to L, if you wish to +use this new feature we recommend installing L or L in +order to get the best performance. You should add either to your dependency +list (Makefile.PL, dist.ini, cpanfile, etc.) =cut @@ -3199,10 +3206,16 @@ sub setup_data_handlers { sub default_data_handlers { my ($class) = @_; return +{ + 'application/x-www-form-urlencoded' => sub { + my ($fh, $req) = @_; + my $params = $req->_use_hash_multivalue ? $req->body_parameters->mixed : $req->body_parameters; + Class::Load::load_first_existing_class('CGI::Struct::XS', 'CGI::Struct') + ->can('build_cgi_struct')->($params); + }, 'application/json' => sub { - local $/; - Class::Load::load_class("JSON::MaybeXS"); - JSON::MaybeXS::decode_json $_->getline }, + Class::Load::load_first_existing_class('JSON::MaybeXS', 'JSON') + ->can('decode_json')->(do { local $/; $_->getline }); + }, }; } @@ -3395,6 +3408,26 @@ In the future this might become the default behavior. =item * +C + +In L the methods C, C +and C return a hashref where values might be scalar or an arrayref +depending on the incoming data. In many cases this can be undesirable as it +leads one to writing defensive code like the following: + + my ($val) = ref($c->req->parameters->{a}) ? + @{$c->req->parameters->{a}} : + $c->req->parameters->{a}; + +Setting this configuration item to true will make L populate the +attributes underlying these methods with an instance of L +which is used by L and others to solve this very issue. You +may prefer this behavior to the default, if so enable this option (be warned +if you enable it in a legacy application we are not sure if it is completely +backwardly compatible). + +=item * + C - See L. =item *