first pass at making Catalyst act enough like PSGI middleware to be broadly compatible
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Engine.pm
index b8d29a4..9f97a42 100644 (file)
@@ -13,6 +13,8 @@ use URI::QueryParam;
 use Plack::Loader;
 use Catalyst::EngineLoader;
 use Encode ();
+use Plack::Request::Upload;
+use Hash::MultiValue;
 use utf8;
 
 use namespace::clean -except => 'meta';
@@ -58,7 +60,7 @@ 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.  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.
 
@@ -569,6 +571,7 @@ sub prepare_uploads {
 
     my $uploads = $request->_body->upload;
     my $parameters = $request->parameters;
+    my @plack_uploads;
     foreach my $name (keys %$uploads) {
         my $files = $uploads->{$name};
         my @uploads;
@@ -583,9 +586,14 @@ sub prepare_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
@@ -601,6 +609,8 @@ sub prepare_uploads {
             $parameters->{$name} = @filenames > 1 ? \@filenames : $filenames[0];
         }
     }
+
+    $self->env->{'plack.request.upload'} ||= Hash::MultiValue->new(@plack_uploads);
 }
 
 =head2 $self->write($c, $buffer)
@@ -693,7 +703,7 @@ sub build_psgi_app {
 
         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);
         };
     };