Merge remote branch 'origin/topic/prepare_action_in_try'
Tomas Doran [Fri, 18 Nov 2011 14:42:16 +0000 (14:42 +0000)]
* origin/topic/prepare_action_in_try:
  Explain the logic here, as it's crazy. But I think this works.
  Move prepare_action call into try block

1  2 
lib/Catalyst.pm

diff --combined lib/Catalyst.pm
@@@ -75,7 -75,7 +75,7 @@@ our $GO        = Catalyst::Exception::G
  __PACKAGE__->mk_classdata($_)
    for qw/components arguments dispatcher engine log dispatcher_class
    engine_loader context_class request_class response_class stats_class
 -  setup_finished _psgi_app loading_psgi_file/;
 +  setup_finished _psgi_app loading_psgi_file run_options/;
  
  __PACKAGE__->dispatcher_class('Catalyst::Dispatcher');
  __PACKAGE__->request_class('Catalyst::Request');
@@@ -84,7 -84,7 +84,7 @@@ __PACKAGE__->stats_class('Catalyst::Sta
  
  # Remember to update this in Catalyst::Runtime as well!
  
 -our $VERSION = '5.90005';
 +our $VERSION = '5.90006';
  
  sub import {
      my ( $class, @arguments ) = @_;
@@@ -1573,16 -1573,6 +1573,16 @@@ sub welcome_message 
  EOF
  }
  
 +=head2 run_options
 +
 +Contains a hash of options passed from the application script, including
 +the original ARGV the script received, the processed values from that
 +ARGV and any extra arguments to the script which were not processed.
 +
 +This can be used to add custom options to your application's scripts
 +and setup your application differently depending on the values of these
 +options.
 +
  =head1 INTERNAL METHODS
  
  These methods are not meant to be used by end users.
@@@ -2025,6 -2015,7 +2025,7 @@@ sub prepare 
                  $c->prepare_body;
              }
          }
+         $c->prepare_action;
      }
      # VERY ugly and probably shouldn't rely on ->finalize actually working
      catch {
          $c->response->status(400);
          $c->response->content_type('text/plain');
          $c->response->body('Bad Request');
+         # Note we call finalize and then die here, which escapes
+         # finalize being called in the enclosing block..
+         # It in fact couldn't be called, as we don't return $c..
+         # This is a mess - but I'm unsure you can fix this without
+         # breaking compat for people doing crazy things (we should set
+         # the 400 and just return the ctx here IMO, letting finalize get called
+         # above...
          $c->finalize;
          die $_;
      };
  
-     my $method  = $c->req->method  || '';
-     my $path    = $c->req->path;
-     $path       = '/' unless length $path;
-     my $address = $c->req->address || '';
      $c->log_request;
  
-     $c->prepare_action;
      return $c;
  }
  
@@@ -2652,7 -2643,7 +2653,7 @@@ sub setup_engine 
  
          $meta->add_method(handler => sub {
              my $r = shift;
 -            my $psgi_app = $class->psgi_app;
 +            my $psgi_app = $class->_finalized_psgi_app;
              $apache->call_app($r, $psgi_app);
          });
  
@@@ -2743,16 -2734,7 +2744,16 @@@ sub apply_default_middlewares 
  
      # If we're running under Lighttpd, swap PATH_INFO and SCRIPT_NAME
      # http://lists.scsys.co.uk/pipermail/catalyst/2006-June/008361.html
 -    $psgi_app = Plack::Middleware::LighttpdScriptNameFix->wrap($psgi_app);
 +    $psgi_app = Plack::Middleware::Conditional->wrap(
 +        $psgi_app,
 +        builder   => sub { Plack::Middleware::LighttpdScriptNameFix->wrap($_[0]) },
 +        condition => sub {
 +            my ($env) = @_;
 +            return unless $env->{SERVER_SOFTWARE} && $env->{SERVER_SOFTWARE} =~ m!lighttpd[-/]1\.(\d+\.\d+)!;
 +            return unless $env < 4.23;
 +            1;
 +        },
 +    );
  
      # we're applying this unconditionally as the middleware itself already makes
      # sure it doesn't fuck things up if it's not running under one of the right
@@@ -3166,26 -3148,7 +3167,26 @@@ headers
  
  If you do not wish to use the proxy support at all, you may set:
  
 -    MyApp->config(ignore_frontend_proxy => 1);
 +    MyApp->config(ignore_frontend_proxy => 0);
 +
 +=head2 Note about psgi files
 +
 +Note that if you supply your own .psgi file, calling
 +C<< MyApp->psgi_app(@_); >>, then B<this will not happen automatically>.
 +
 +You either need to apply L<Plack::Middleware::ReverseProxy> yourself
 +in your psgi, for example:
 +
 +    builder {
 +        enable "Plack::Middleware::ReverseProxy";
 +        MyApp->psgi_app
 +    };
 +
 +This will unconditionally add the ReverseProxy support, or you need to call
 +C<< $app = MyApp->apply_default_middlewares($app) >> (to conditionally
 +apply the support depending upon your config).
 +
 +See L<Catalyst::PSGI> for more information.
  
  =head1 THREAD SAFETY