Ignore old-style .psgi files
Florian Ragwitz [Sun, 27 Mar 2011 11:58:24 +0000 (12:58 +0100)]
lib/Catalyst.pm
lib/Catalyst/EngineLoader.pm

index 6c1ef1e..3ad1701 100644 (file)
@@ -2600,9 +2600,18 @@ sub engine_class {
 }
 
 sub setup_engine {
-    my ($class) = @_;
-
-    $class->engine_loader(Catalyst::EngineLoader->new(application_name => $class));
+    my ($class, $compat_requested_engine) = @_;
+
+    $class->engine_loader(
+        Catalyst::EngineLoader->new({
+            application_name => $class,
+            (!defined $compat_requested_engine
+                 ? ()
+                 : (compat_options => {
+                     requested_engine => $compat_requested_engine,
+                 })),
+        }),
+    );
 
     my $engine = $class->engine_class;
     Class::MOP::load_class($engine);
@@ -2636,13 +2645,27 @@ sub _finalized_psgi_app {
 sub _setup_psgi_app {
     my ($app) = @_;
 
-    if (my $home = Path::Class::Dir->new($app->config->{home})) {
+    for my $home (Path::Class::Dir->new($app->config->{home})) {
         my $psgi_file = $home->file(
             Catalyst::Utils::appprefix($app) . '.psgi',
         );
 
-        return Plack::Util::load_psgi($psgi_file)
-            if -e $psgi_file;
+        next unless -e $psgi_file;
+        my $psgi_app = Plack::Util::load_psgi($psgi_file);
+
+        return $psgi_app
+            unless $app->engine_loader->needs_psgi_engine_compat_hack;
+
+        # load_psgi ran a .psgi file doing ->setup_engine('PSGI'). That's what
+        # .psgi files generated by the old Engine::PSGI do. Those return an app
+        # coderef calling into MyApp->run, which doesn't work anymore, so we're
+        # just ignoring it and use the wrapped legacy psgi app
+        warn <<"EOW";
+Found a legacy Catalyst::Engine::PSGI .psgi file at ${psgi_file}.
+
+Its content has been ignored. Please consult the Catalyst::Upgrading
+documentation on how to upgrade from Catalyst::Engine::PSGI.
+EOW
     }
 
     return $app->_wrapped_legacy_psgi_app($app->psgi_app);
index 3499b50..e59135b 100644 (file)
@@ -12,6 +12,23 @@ has application_name => (
     required => 1,
 );
 
+has compat_options => (
+    traits  => ['Hash'],
+    is      => 'ro',
+    isa     => 'HashRef',
+    default => sub { +{} },
+    handles => {
+        has_compat_option => 'exists',
+        compat_option     => 'get',
+    },
+);
+
+sub needs_psgi_engine_compat_hack {
+    my ($self) = @_;
+    return $self->has_compat_option('requested_engine')
+        && $self->compat_option('requested_engine') eq 'PSGI';
+}
+
 has catalyst_engine_class => (
     isa => 'Str',
     is => 'rw',
@@ -117,4 +134,10 @@ Catalyst Contributors, see Catalyst.pm
 This library is free software. You can redistribute it and/or modify it under
 the same terms as Perl itself.
 
+=begin Pod::Coverage
+
+needs_psgi_engine_compat_hack
+
+=end Pod::Coverage
+
 =cut