use Plack::Loader;
use Catalyst::EngineLoader;
use Encode ();
+use Plack::Request::Upload;
+use Hash::MultiValue;
use utf8;
use namespace::clean -except => 'meta';
a filehandle, otherwise write it out all in one go. If there is no body in
the response, we assume you are handling it 'manually', such as for nonblocking
style or asynchronous streaming responses. You do this by calling L<\write>
-several times (which sends HTTP headers if needed) or you close over L<\write_fh>.
+several times (which sends HTTP headers if needed) or you close over C<$response->write_fh>.
See L<Catalyst::Response\write> and L<Catalyst::Response\write_fh> for more.
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)
return sub {
my ($respond) = @_;
- confess("Did not get a response callback for writer, cannot continiue") unless $respond;
+ confess("Did not get a response callback for writer, cannot continue") unless $respond;
$app->handle_request(env => $env, response_cb => $respond);
};
};