The latter part of that doc doesn't apply in master, yet
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Engine.pm
index 7cba9dd..8f88cef 100644 (file)
@@ -42,11 +42,15 @@ has _response_cb => (
     isa     => 'CodeRef',
     writer  => '_set_response_cb',
     clearer => '_clear_response_cb',
+    predicate => '_has_response_cb',
 );
 
+subtype 'Catalyst::Engine::Types::Writer',
+    as duck_type([qw(write close)]);
+
 has _writer => (
     is      => 'ro',
-    isa     => duck_type([qw(write close)]),
+    isa     => 'Catalyst::Engine::Types::Writer',
     writer  => '_set_writer',
     clearer => '_clear_writer',
 );
@@ -127,6 +131,11 @@ sub finalize_cookies {
                 -httponly => $val->{httponly} || 0,
             )
         );
+        if (!defined $cookie) {
+            $c->log->warn("undef passed in '$name' cookie value - not setting cookie")
+                if $c->debug;
+            next;
+        }
 
         push @cookies, $cookie->as_string;
     }
@@ -342,6 +351,15 @@ Abstract method, allows engines to write headers to response
 sub finalize_headers {
     my ($self, $ctx) = @_;
 
+    # This is a less-than-pretty hack to avoid breaking the old
+    # Catalyst::Engine::PSGI. 5.9 Catalyst::Engine sets a response_cb and
+    # expects us to pass headers to it here, whereas Catalyst::Enngine::PSGI
+    # just pulls the headers out of $ctx->response in its run method and never
+    # sets response_cb. So take the lack of a response_cb as a sign that we
+    # don't need to set the headers.
+
+    return unless $self->_has_response_cb;
+
     my @headers;
     $ctx->response->headers->scan(sub { push @headers, @_ });
 
@@ -660,7 +678,7 @@ sub prepare_read {
 
 =head2 $self->prepare_request(@arguments)
 
-Populate the context object from the request object.
+Sets up the PSGI environment in the Engine.
 
 =cut
 
@@ -815,13 +833,13 @@ sub run {
         # instead the $app->handle method is called per request.
         $app->log->warn("Not supplied a Plack engine, falling back to engine auto-loader (are your scripts ancient?)")
     }
+    $app->run_options($options);
     $server->run($psgi, $options);
 }
 
 =head2 build_psgi_app ($app, @args)
 
-Builds and returns a PSGI application closure, wrapping it in the reverse proxy
-middleware if the using_frontend_proxy config setting is set.
+Builds and returns a PSGI application closure. (Raw, not wrapped in middleware)
 
 =cut