Merge branch 'master' of https://github.com/davewood/catalyst-runtime
John Napiorkowski [Wed, 31 Dec 2014 15:55:56 +0000 (09:55 -0600)]
1  2 
lib/Catalyst.pm

diff --combined lib/Catalyst.pm
@@@ -518,9 -518,6 +518,9 @@@ Add a new error
  
      $c->error('Something bad happened');
  
 +Calling this will always return an arrayref (if there are no errors it
 +will be an empty arrayref.
 +
  =cut
  
  sub error {
@@@ -565,29 -562,6 +565,29 @@@ Returns true if you have error
  
  sub has_errors { scalar(@{shift->error}) ? 1:0 }
  
 +=head2 $c->last_error
 +
 +Returns the most recent error in the stack (the one most recently added...)
 +or nothing if there are no errors.
 +
 +=cut
 +
 +sub last_error { my ($err, @errs) = @{shift->error}; return $err }
 +
 +=head2 shift_errors
 +
 +shifts the most recently added error off the error stack and returns if.  Returns
 +nothing if there are nomore errors.
 +
 +=cut
 +
 +sub shift_errors {
 +    my ($self) = @_;
 +    my ($err, @errors) = @{$self->error};
 +    $self->{error} = \@errors;
 +    return $err;
 +}
 +
  sub _comp_search_prefixes {
      my $c = shift;
      return map $c->components->{ $_ }, $c->_comp_names_search_prefixes(@_);
@@@ -1801,16 -1775,7 +1801,7 @@@ sub execute 
  
      if ( my $error = $@ ) {
          #rethow if this can be handled by middleware
-         if(
-           !$c->config->{always_catch_http_exceptions} &&
-           blessed $error && (
-             $error->can('as_psgi') ||
-             (
-               $error->can('code') &&
-               $error->code =~m/^[1-5][0-9][0-9]$/
-             )
-           )
-         ) {
+         if ( $c->_handle_http_exception($error) ) {
              foreach my $err (@{$c->error}) {
                  $c->log->error($err);
              }
@@@ -1923,7 -1888,7 +1914,7 @@@ sub finalize 
  
      # Support skipping finalize for psgix.io style 'jailbreak'.  Used to support
      # stuff like cometd and websockets
-     
      if($c->request->_has_io_fh) {
        $c->log_response;
        return;
@@@ -1991,11 -1956,7 +1982,7 @@@ sub finalize_error 
          $c->engine->finalize_error( $c, @_ );
      } else {
          my ($error) = @{$c->error};
-         if(
-           !$c->config->{always_catch_http_exceptions} &&
-           blessed $error &&
-           ($error->can('as_psgi') || $error->can('code'))
-         ) {
+         if ( $c->_handle_http_exception($error) ) {
              # In the case where the error 'knows what it wants', becauses its PSGI
              # aware, just rethow and let middleware catch it
              $error->can('rethrow') ? $error->rethrow : croak $error;
@@@ -2137,16 -2098,7 +2124,7 @@@ sub handle_request 
          $status = $c->finalize;
      } catch {
          #rethow if this can be handled by middleware
-         if(
-           !$class->config->{always_catch_http_exceptions} &&
-           blessed($_) && (
-             $_->can('as_psgi') ||
-             (
-               $_->can('code') &&
-               $_->code =~m/^[1-5][0-9][0-9]$/
-             )
-           )
-         ) {
+         if ( $class->_handle_http_exception($_) ) {
              $_->can('rethrow') ? $_->rethrow : croak $_;
          }
          chomp(my $error = $_);
@@@ -3079,7 -3031,7 +3057,7 @@@ sub setup_home 
  
  =head2 $c->setup_encoding
  
- Sets up the input/output encoding.  See L<ENCODING>
+ Sets up the input/output encoding. See L<ENCODING>
  
  =cut
  
@@@ -3312,7 -3264,7 +3290,7 @@@ the plugin name does not begin with C<C
              $class => @roles
          ) if @roles;
      }
- }    
+ }
  
  =head2 registered_middlewares
  
@@@ -3371,7 -3323,7 +3349,7 @@@ sub registered_middlewares 
  
  sub setup_middleware {
      my $class = shift;
-     my @middleware_definitions = @_ ? 
+     my @middleware_definitions = @_ ?
        reverse(@_) : reverse(@{$class->config->{'psgi_middleware'}||[]});
  
      my @middleware = ();
@@@ -3463,18 -3415,28 +3441,34 @@@ sub default_data_handlers 
              ->can('build_cgi_struct')->($params);
        },
        'application/json' => sub {
 -          Class::Load::load_first_existing_class('JSON::MaybeXS', 'JSON')
 -            ->can('decode_json')->(do { local $/; $_->getline });
 -      },
 +          my ($fh, $req) = @_;
 +          my $parser = Class::Load::load_first_existing_class('JSON::MaybeXS', 'JSON');
 +          my $slurped;
 +          return eval { 
 +            local $/;
 +            $slurped = $fh->getline;
 +            $parser->can("decode_json")->($slurped);
 +          } || Catalyst::Exception->throw(sprintf "Error Parsing POST '%s', Error: %s", (defined($slurped) ? $slurped : 'undef') ,$@);
 +        },
      };
  }
  
+ sub _handle_http_exception {
+     my ( $self, $error ) = @_;
+     if (
+            !$self->config->{always_catch_http_exceptions}
+         && blessed $error
+         && (
+             $error->can('as_psgi')
+             || (   $error->can('code')
+                 && $error->code =~ m/^[1-5][0-9][0-9]$/ )
+         )
+       )
+     {
+         return 1;
+     }
+ }
  =head2 $c->stack
  
  Returns an arrayref of the internal execution stack (actions that are
@@@ -3544,7 -3506,7 +3538,7 @@@ There are a number of 'base' config var
  C<always_catch_http_exceptions> - As of version 5.90060 Catalyst
  rethrows errors conforming to the interface described by
  L<Plack::Middleware::HTTPExceptions> and lets the middleware deal with it.
- Set true to get the deprecated behaviour and have Catakyst catch HTTP exceptions.
+ Set true to get the deprecated behaviour and have Catalyst catch HTTP exceptions.
  
  =item *
  
@@@ -3603,7 -3565,7 +3597,7 @@@ to be shown in hit debug tables in the 
  =item *
  
  C<use_request_uri_for_path> - Controls if the C<REQUEST_URI> or C<PATH_INFO> environment
- variable should be used for determining the request path. 
+ variable should be used for determining the request path.
  
  Most web server environments pass the requested path to the application using environment variables,
  from which Catalyst has to reconstruct the request base (i.e. the top level path to / in the application,
@@@ -3642,7 -3604,7 +3636,7 @@@ is having paths rewritten into it (e.g
  at other URIs than that which the app is 'normally' based at with C<mod_rewrite>), the resolution of
  C<< $c->request->base >> will be incorrect.
  
- =back 
+ =back
  
  =item *
  
@@@ -3660,7 -3622,7 +3654,7 @@@ When there is an error in an action cha
  processing the remaining actions and then catch the error upon chain end.  This
  can lead to running actions when the application is in an unexpected state.  If
  you have this issue, setting this config value to true will promptly exit a
- chain when there is an error raised in any action (thus terminating the chain 
+ chain when there is an error raised in any action (thus terminating the chain
  early.)
  
  use like:
@@@ -3706,7 -3668,7 +3700,7 @@@ your stack, such as in a model that an 
  is caught by Catalyst and unless you either catch it yourself (via eval
  or something like L<Try::Tiny> or by reviewing the L</error> stack, it
  will eventually reach L</finalize_errors> and return either the debugging
- error stack page, or the default error page.  However, if your exception 
+ error stack page, or the default error page.  However, if your exception
  can be caught by L<Plack::Middleware::HTTPExceptions>, L<Catalyst> will
  instead rethrow it so that it can be handled by that middleware (which
  is part of the default middleware).  For example this would allow
      sub throws_exception :Local {
        my ($self, $c) = @_;
  
-       http_throw(SeeOther => { location => 
+       http_throw(SeeOther => { location =>
          $c->uri_for($self->action_for('redirect')) });
  
      }
@@@ -4110,6 -4072,8 +4104,8 @@@ Chisel Wright C<pause@herlpacker.co.uk
  
  Danijel Milicevic C<me@danijel.de>
  
+ davewood: David Schmidt <davewood@cpan.org>
  David Kamholz E<lt>dkamholz@cpan.orgE<gt>
  
  David Naughton, C<naughton@umn.edu>