use Plack::Loader;
use Catalyst::EngineLoader;
use Encode ();
+use Plack::Request::Upload;
+use Hash::MultiValue;
use utf8;
use namespace::clean -except => 'meta';
Finalize body. Prints the response output as blocking stream if it looks like
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.
-
-By default we do not close the writer object in case we are in an event loop
-and there is deferred activity. However if you have some sloppy code that is
-closing over an unweakened context ($c) this could lead to the writer NEVER
-being closed. In versions of Catalyst 5.90030 and older, we used to forcibly
-close the writer in this method, but we no longer do that since it prevented us
-from introducing proper asynchronous support in Catalyst core. If you have old
-code that is leaking context but was otherwise working and you don't want to fix
-your memory leaks (is really the best idea) you can force enable the old
-behavior (and lose asynchronous support) by setting the global configuration key
-C<aggressively_close_writer_on_finalize_body> to true. See L<Catalyst::Upgrading>
-for more if you have this issue.
+style or asynchronous streaming responses. You do this by calling L</write>
+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.
=cut
sub finalize_body {
my ( $self, $c ) = @_;
+ return if $c->response->_has_write_fh;
+
my $body = $c->response->body;
no warnings 'uninitialized';
if ( blessed($body) && $body->can('read') or ref($body) eq 'GLOB' ) {
$self->write( $c, $body );
}
- if($c->config->{aggressively_close_writer_on_finalize_body}) {
- my $res = $c->response;
- $res->_writer->close;
- $res->_clear_writer;
- }
+ my $res = $c->response;
+ $res->_writer->close;
+ $res->_clear_writer;
return;
}
sub prepare_query_parameters {
my ($self, $c) = @_;
-
my $env = $c->request->env;
+
+ if(my $query_obj = $env->{'plack.request.query'}) {
+ $c->request->query_parameters(
+ $c->request->_use_hash_multivalue ?
+ $query_obj->clone :
+ $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));
return;
}
$query{$param} = $value;
}
}
- $c->request->query_parameters( \%query );
+
+ $c->request->query_parameters(
+ $c->request->_use_hash_multivalue ?
+ Hash::MultiValue->from_mixed(\%query) :
+ \%query);
}
=head2 $self->prepare_read($c)
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);
};
};