return $c->_filter_component( $comp, @args ) if $comp;
}
+ return
+ if $c->config->{disable_component_resolution_regex_fallback};
+
# This is here so $c->comp( '::M::' ) works
my $query = ref $name ? $name : qr{$name}i;
A hook to attach modifiers to. This method does not do anything except set the
C<setup_finished> accessor.
-Applying method modifiers to the C<setup> method doesn't work, because of quirky thingsdone for plugin setup.
+Applying method modifiers to the C<setup> method doesn't work, because of quirky things done for plugin setup.
Example:
$error = qq/Caught exception in $class->$name "$error"/;
}
$c->error($error);
- $c->state(0);
}
+ $c->state(0);
}
return $c->state;
}
=cut
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->(@_)
+ my $app = shift;
+ $app->engine_loader->needs_psgi_engine_compat_hack ?
+ $app->engine->run($app, @_) :
+ $app->engine->run( $app, $app->_finalized_psgi_app, @_ );
}
=head2 $c->set_action( $action, $code, $namespace, $attrs )
# .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
+
+ $app->engine(undef);
+ $app->setup_engine;
+
+ # ^^ We need to do this because even though we are discarded $psgi_app, the
+ # fact that it was loaded above means that Catalyst Engine now has the
+ # wrong value (PSGI), which persists due to the singleton nature of all
+ # this stuff. This solution is probably a lame hack but did work for all
+ # the cases we know about. Hopefully we can pull out this crap soon
+ # Please note that if the fact that the psgi file was loaded started to set
+ # values in areas outside Engine this hack will probably fail.
+
warn <<"EOW";
Found a legacy Catalyst::Engine::PSGI .psgi file at ${psgi_file}.
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 {
+=head2 $c->apply_default_middlewares
+
+Adds the following L<Plack> middlewares to your application, since they are
+useful and commonly needed:
+
+L<Plack::Middleware::ReverseProxy>, (conditionally added based on the status
+of your $ENV{REMOTE_ADDR}, and can be forced on with C<using_frontend_proxy>
+or forced off with C<ignore_frontend_proxy>), L<Plack::Middleware::LighttpdScriptNameFix>
+(if you are using Lighttpd), L<Plack::Middleware::IIS6ScriptNameFix> (always
+applied since this middleware is smart enough to conditionally apply itself).
+
+Additionally if we detect we are using Nginx, we add a bit of custom middleware
+to solve some problems with the way that server handles $ENV{PATH_INFO} and
+$ENV{SCRIPT_NAME}
+
+=cut
+
+
+sub apply_default_middlewares {
my ($app, $psgi_app) = @_;
$psgi_app = Plack::Middleware::Conditional->wrap(
my $class = ref $proto || $proto;
Class::MOP::load_class( $plugin );
- $class->log->warn( "$plugin inherits from 'Catalyst::Component' - this is decated and will not work in 5.81" )
+ $class->log->warn( "$plugin inherits from 'Catalyst::Component' - this is deprecated and will not work in 5.81" )
if $plugin->isa( 'Catalyst::Component' );
$proto->_plugins->{$plugin} = 1;
unless ($instant) {