Looping and recursion tests plus a fix
[catagits/Catalyst-Runtime.git] / lib / Catalyst.pm
index 4e63635..203f1c4 100644 (file)
@@ -17,7 +17,7 @@ use Text::SimpleTable;
 use Path::Class;
 use Time::HiRes qw/gettimeofday tv_interval/;
 use URI;
-use Scalar::Util qw/weaken/;
+use Scalar::Util qw/weaken blessed/;
 use Tree::Simple qw/use_weak_refs/;
 use Tree::Simple::Visitor::FindByUID;
 use attributes;
@@ -971,19 +971,22 @@ sub execute {
     $class = $c->component($class) || $class;
     $c->state(0);
 
+    if ($c->depth >= $RECURSION) {
+        my $action = "$code";
+        $action = "/$action" unless $action =~ /\-\>/;
+        my $error = qq/Deep recursion detected calling "$action"/;
+        $c->log->error($error);
+        $c->error($error);
+        $c->state(0);
+        return $c->state;
+    }
+
+
     if ( $c->debug ) {
         my $action = "$code";
         $action = "/$action" unless $action =~ /\-\>/;
         $c->counter->{"$code"}++;
 
-        if ( $c->counter->{"$code"} > $RECURSION ) {
-            my $error = qq/Deep recursion detected in "$action"/;
-            $c->log->error($error);
-            $c->error($error);
-            $c->state(0);
-            return $c->state;
-        }
-
         # determine if the call was the result of a forward
         # this is done by walking up the call stack and looking for a calling
         # sub of Catalyst::forward before the eval
@@ -1165,7 +1168,7 @@ sub finalize_headers {
     if ( $c->response->body && !$c->response->content_length ) {
 
         # get the length from a filehandle
-        if ( ref $c->response->body && $c->response->body->can('read') ) {
+        if ( blessed($c->response->body) && $c->response->body->can('read') ) {
             if ( my $stat = stat $c->response->body ) {
                 $c->response->content_length( $stat->size );
             }
@@ -2092,6 +2095,8 @@ Autrijus Tang
 
 Brian Cassidy
 
+Carl Franks
+
 Christian Hansen
 
 Christopher Hicks