X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FRequest.pm;h=87ce66a22119de587f0602f97a7b600ab2dc5927;hb=69a62684e7bf0cbd7967df4018f860b61980d4d4;hp=697e1da14f168a5ab3e0ae66f372efb53ff443f9;hpb=191665f3c88f4b1f81e4198717077ac08d06bdb7;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/Request.pm b/lib/Catalyst/Request.pm index 697e1da..87ce66a 100644 --- a/lib/Catalyst/Request.pm +++ b/lib/Catalyst/Request.pm @@ -103,6 +103,9 @@ has io_fh => ( sub _build_io_fh { my $self = shift; return $self->env->{'psgix.io'} + || ( + $self->env->{'net.async.http.server.req'} && + $self->env->{'net.async.http.server.req'}->stream) ## Until I can make ioasync cabal see the value of supportin psgix.io (jnap) || die "Your Server does not support psgix.io"; }; @@ -128,6 +131,11 @@ sub _build_body_data { } } +has _use_hash_multivalue => ( + is=>'ro', + required=>1, + default=> sub {0}); + # Amount of data to read from input on each pass our $CHUNKSIZE = 64 * 1024; @@ -201,6 +209,18 @@ sub _build_parameters { my $parameters = {}; my $body_parameters = $self->body_parameters; my $query_parameters = $self->query_parameters; + + ## setup for downstream plack + $self->env->{'plack.request.merged'} ||= do { + my $query = $self->env->{'plack.request.query'} || Hash::MultiValue->new; + my $body = $self->env->{'plack.request.body'} || Hash::MultiValue->new; + Hash::MultiValue->new($query->flatten, $body->flatten); + }; + + if($self->_use_hash_multivalue) { + return $self->env->{'plack.request.merged'}->clone; # We want a copy, in case your App is evil + } + # We copy, no references foreach my $name (keys %$query_parameters) { my $param = $query_parameters->{$name}; @@ -314,7 +334,9 @@ sub prepare_body_parameters { $self->prepare_body if ! $self->_has_body; return {} unless $self->_body; - return $self->_body->param; + return $self->_use_hash_multivalue ? + $self->env->{'plack.request.body'}->clone : + $self->_body->param; } sub prepare_connection {