use Plack::Loader;
use Catalyst::EngineLoader;
use Encode ();
+use Plack::Request::Upload;
+use Hash::MultiValue;
use utf8;
use namespace::clean -except => 'meta';
sub prepare_query_parameters {
my ($self, $c) = @_;
-
my $env = $c->request->env;
+
+ if(my $query_obj = $env->{'plack.request.query'}) {
+ $c->request->query_parameters($query_obj->as_hashref_mixed);
+ return;
+ }
+
my $query_string = exists $env->{QUERY_STRING}
? $env->{QUERY_STRING}
: '';
# Check for keywords (no = signs)
# (yes, index() is faster than a regex :))
if ( index( $query_string, '=' ) < 0 ) {
- $c->request->query_keywords( $self->unescape_uri($query_string) );
+ $c->request->query_keywords($self->unescape_uri($query_string));
+ $env->{'plack.request.query'} ||= Hash::MultiValue->new(
+ map { (URI::Escape::uri_unescape($_), '') }
+ split(/\+/, $query_string, -1));
+
return;
}
$query{$param} = $value;
}
}
+
+ $env->{'plack.request.query'} ||= Hash::MultiValue->from_mixed(\%query);
$c->request->query_parameters( \%query );
}
my $uploads = $request->_body->upload;
my $parameters = $request->parameters;
+ my @plack_uploads;
foreach my $name (keys %$uploads) {
my $files = $uploads->{$name};
my @uploads;
filename => $upload->{filename},
);
push @uploads, $u;
+
+ # Plack compatibility.
+ my %copy = (%$upload, headers=>$headers);
+ push @plack_uploads, $name, Plack::Request::Upload->new(%copy);
}
$request->uploads->{$name} = @uploads > 1 ? \@uploads : $uploads[0];
+
# support access to the filename as a normal param
my @filenames = map { $_->{filename} } @uploads;
# append, if there's already params with this name
$parameters->{$name} = @filenames > 1 ? \@filenames : $filenames[0];
}
}
+
+ $self->env->{'plack.request.upload'} ||= Hash::MultiValue->new(@plack_uploads);
}
=head2 $self->write($c, $buffer)