Merge branch 'psgi' into origin/psgi
[catagits/Catalyst-Runtime.git] / lib / Catalyst.pm
index 3ad1701..03ce6ab 100644 (file)
@@ -16,7 +16,6 @@ use Catalyst::Utils;
 use Catalyst::Controller;
 use Data::OptList;
 use Devel::InnerPackage ();
-use File::stat;
 use Module::Pluggable::Object ();
 use Text::SimpleTable ();
 use Path::Class::Dir ();
@@ -37,6 +36,7 @@ use Try::Tiny;
 use Plack::Middleware::Conditional;
 use Plack::Middleware::ReverseProxy;
 use Plack::Middleware::IIS6ScriptNameFix;
+use Plack::Middleware::LighttpdScriptNameFix;
 
 BEGIN { require 5.008004; }
 
@@ -1872,9 +1872,9 @@ sub finalize_headers {
         # get the length from a filehandle
         if ( blessed( $response->body ) && $response->body->can('read') || ref( $response->body ) eq 'GLOB' )
         {
-            my $stat = stat $response->body;
-            if ( $stat && $stat->size > 0 ) {
-                $response->content_length( $stat->size );
+            my $size = -s $response->body;
+            if ( $size ) {
+                $response->content_length( $size );
             }
             else {
                 $c->log->warn('Serving filehandle without a content-length');
@@ -2410,7 +2410,27 @@ Starts the engine.
 
 =cut
 
-sub run { my $c = shift; return $c->engine->run( $c, $c->_finalized_psgi_app, @_ ) }
+sub run {
+    my $c = shift;
+    $c->engine_loader->needs_psgi_engine_compat_hack ?
+      $c->_run_needs_psgi_engine_compat_hack(@_) :
+      $c->engine->run( $c, $c->_finalized_psgi_app, @_ );
+}
+
+sub _run_needs_psgi_engine_compat_hack {
+    my $c = shift;
+
+    ## We assume if they used the classic PSGI Engine, they must has CC:M
+    for my $metal (Catalyst::Controller::Metal->metals_for($c)) {
+        my $res = $metal->call(@_);
+        if (defined $res && !(ref $res eq 'ARRAY' && $res->[0] == 404)) {
+            return $res;
+        }
+    }
+
+    ## If we got this far, just do the psgi app
+    $c->_finalized_psgi_app->(@_)
+}
 
 =head2 $c->set_action( $action, $code, $namespace, $attrs )
 
@@ -2600,16 +2620,13 @@ sub engine_class {
 }
 
 sub setup_engine {
-    my ($class, $compat_requested_engine) = @_;
+    my ($class, $requested_engine) = @_;
 
     $class->engine_loader(
         Catalyst::EngineLoader->new({
             application_name => $class,
-            (!defined $compat_requested_engine
-                 ? ()
-                 : (compat_options => {
-                     requested_engine => $compat_requested_engine,
-                 })),
+            (defined $requested_engine
+                 ? (requested_engine => $requested_engine) : ()),
         }),
     );
 
@@ -2668,14 +2685,12 @@ documentation on how to upgrade from Catalyst::Engine::PSGI.
 EOW
     }
 
-    return $app->_wrapped_legacy_psgi_app($app->psgi_app);
+    return $app->apply_default_middlewares($app->psgi_app);
 }
 
-# Note - this is for back compatibility. Catalyst should not know or care about
-#        how it's deployed. The recommended way of configuring this is now to
-#        use the ReverseProxy middleware yourself if you want it in a .psgi
-#        file.
-sub _wrapped_legacy_psgi_app {
+# FIXME - document me
+
+sub apply_default_middlewares {
     my ($app, $psgi_app) = @_;
 
     $psgi_app = Plack::Middleware::Conditional->wrap(
@@ -2701,23 +2716,7 @@ sub _wrapped_legacy_psgi_app {
 
     # If we're running under Lighttpd, swap PATH_INFO and SCRIPT_NAME
     # http://lists.scsys.co.uk/pipermail/catalyst/2006-June/008361.html
-    # Thanks to Mark Blythe for this fix
-    #
-    # Note that this has probably the same effect as
-    # Plack::Middleware::LighttpdScriptNameFix and we should switch to that if
-    # we can.
-    $psgi_app = Plack::Middleware::Conditional->wrap(
-        $psgi_app,
-        condition => $server_matches->(qr/lighttpd/),
-        builder   => sub {
-            my ($to_wrap) = @_;
-            return sub {
-                my ($env) = @_;
-                $env->{PATH_INFO} ||= delete $env->{SCRIPT_NAME};
-                return $to_wrap->($env);
-            };
-        },
-    );
+    $psgi_app = Plack::Middleware::LighttpdScriptNameFix->wrap($psgi_app);
 
     $psgi_app = Plack::Middleware::Conditional->wrap(
         $psgi_app,
@@ -3298,6 +3297,10 @@ rainboxx: Matthias Dietrich, C<perl@rainboxx.de>
 
 dd070: Dhaval Dhanani <dhaval070@gmail.com>
 
+=head1 COPYRIGHT
+
+Copyright (c) 2005, the above named PROJECT FOUNDER and CONTRIBUTORS.
+
 =head1 LICENSE
 
 This library is free software. You can redistribute it and/or modify it under