X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FEngine.pm;h=969021b5d7d5c067552dee1d7a51eb86964f1253;hb=d41516b29b729ba98759cc98b0ad38a47bad9aa5;hp=27dfb3d80cf2d3b5d9ce1243d740d237a458cdef;hpb=1a80619d839bc8dd6321648d8140a795bf85025e;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/Engine.pm b/lib/Catalyst/Engine.pm index 27dfb3d..969021b 100644 --- a/lib/Catalyst/Engine.pm +++ b/lib/Catalyst/Engine.pm @@ -127,7 +127,9 @@ sub finalize { if ( my $location = $c->res->redirect ) { $c->log->debug(qq/Redirecting to "$location"/) if $c->debug; $c->res->headers->header( Location => $location ); + $c->res->headers->remove_content_headers; $c->res->status(302); + return $c->finalize_headers; } if ( !$c->res->output || $#{ $c->error } >= 0 ) { @@ -355,8 +357,10 @@ sub handler ($$) { # Always expect worst case! my $status = -1; eval { + my @stats = (); my $handler = sub { - my $c = $class->prepare($r); + my $c = $class->prepare($r); + $c->{stats} = \@stats; my $action = $c->req->action; my $namespace = ''; $namespace = ( join( '/', @{ $c->req->args } ) || '/' ) @@ -373,11 +377,13 @@ sub handler ($$) { for my $begin ( @{ $c->get_action( 'begin', $namespace ) } ) { $c->state( $c->execute( @{ $begin->[0] } ) ); } - for my $result ( @{ $c->get_action( $action, $default ) } ) { + for my $result ( @{ $c->get_action( $action, $default ) }[-1] ) + { $c->state( $c->execute( @{ $result->[0] } ) ); last unless $default; } - for my $end ( @{ $c->get_action( 'end', $namespace ) } ) { + for my $end ( reverse @{ $c->get_action( 'end', $namespace ) } ) + { $c->state( $c->execute( @{ $end->[0] } ) ); } } @@ -396,7 +402,7 @@ sub handler ($$) { ( $elapsed, $status ) = $class->benchmark($handler); $elapsed = sprintf '%f', $elapsed; my $av = sprintf '%.3f', 1 / $elapsed; - $class->log->info( "Request took $elapsed" . "s ($av/s)" ); + $class->log->info( "Request took $elapsed" . "s ($av/s)", @stats ); } else { $status = &$handler } }; @@ -460,9 +466,9 @@ sub prepare { my @params; for my $key ( keys %{ $c->req->params } ) { my $value = $c->req->params->{$key} || ''; - push @params, "$key=$value"; + push @params, " $key=$value"; } - $c->log->debug( 'Parameters are "' . join( ' ', @params ) . '"' ); + $c->log->debug( 'Parameters are', @params ); } $c->prepare_uploads; return $c; @@ -582,11 +588,12 @@ sub execute { eval { if ( $c->debug ) { - my $action = $c->actions->{reverse}->{"$code"} || "$code"; + my $action = $c->actions->{reverse}->{"$code"}; + $action = "/$action" unless $action =~ /\-\>/; my ( $elapsed, @state ) = $c->benchmark( $code, $class, $c, @{ $c->req->args } ); - $c->log->info( sprintf qq/Processing "$action" took %fs/, $elapsed ) - if $c->debug; + push @{ $c->{stats} }, + _prettify( $action, '', sprintf( '%fs', $elapsed ) ); $c->state(@state); } else { $c->state( &$code( $class, $c, @{ $c->req->args } ) ) } @@ -638,11 +645,11 @@ sub set_action { my %flags; for my $attr ( @{$attrs} ) { - if ( $attr =~ /^Local$/ ) { $flags{local}++ } - elsif ( $attr =~ /^Global$/ ) { $flags{global}++ } - elsif ( $attr =~ /^Path\((.+)\)$/i ) { $flags{path} = $1 } - elsif ( $attr =~ /^Private$/i ) { $flags{private}++ } - elsif ( $attr =~ /Regex\((.+)\)$/i ) { $flags{regex} = $1 } + if ( $attr =~ /^(Local|Relative)$/ ) { $flags{local}++ } + elsif ( $attr =~ /^(Global|Absolute)$/ ) { $flags{global}++ } + elsif ( $attr =~ /^Path\((.+)\)$/i ) { $flags{path} = $1 } + elsif ( $attr =~ /^Private$/i ) { $flags{private}++ } + elsif ( $attr =~ /^(Regex|Regexp)\((.+)\)$/i ) { $flags{regex} = $2 } } return unless keys %flags; @@ -664,8 +671,6 @@ sub set_action { my $uid = $parent->getUID; $c->actions->{private}->{$uid}->{$method} = [ $namespace, $code ]; my $forward = $prefix ? "$prefix/$method" : $method; - $c->log->debug(qq|Private "/$forward" is "$namespace->$method"|) - if $c->debug; if ( $flags{path} ) { $flags{path} =~ s/^\w+//; @@ -680,7 +685,7 @@ sub set_action { if ( $flags{regex} =~ /^"(.*)"$/ ) { $flags{regex} = $1 } } - my $reverse = $prefix ? "$method ($prefix)" : $method; + my $reverse = $prefix ? "$prefix/$method" : $method; if ( $flags{local} || $flags{global} || $flags{path} ) { my $path = $flags{path} || $method; @@ -692,12 +697,10 @@ sub set_action { $absolute = 1 if $flags{global}; my $name = $absolute ? $path : "$prefix/$path"; $c->actions->{plain}->{$name} = [ $namespace, $code ]; - $c->log->debug(qq|Public "/$name" is "/$forward"|) if $c->debug; } if ( my $regex = $flags{regex} ) { push @{ $c->actions->{compiled} }, [ $regex, qr#$regex# ]; $c->actions->{regex}->{$regex} = [ $namespace, $code ]; - $c->log->debug(qq|Public "$regex" is "/$forward"|) if $c->debug; } $c->actions->{reverse}->{"$code"} = $reverse; @@ -733,10 +736,23 @@ sub setup_actions { my ( $code, $attrs ) = @{$action}; my $name = ''; no strict 'refs'; - for my $sym ( values %{ $comp . '::' } ) { - if ( *{$sym}{CODE} && *{$sym}{CODE} == $code ) { - $name = *{$sym}{NAME}; - $self->set_action( $name, $code, $comp, $attrs ); + my @cache = ( $comp, @{"$comp\::ISA"} ); + my %namespaces; + while ( my $namespace = shift @cache ) { + $namespaces{$namespace}++; + for my $isa ( @{"$comp\::ISA"} ) { + next if $namespaces{$isa}; + push @cache, $isa; + $namespaces{$isa}++; + } + } + for my $namespace ( keys %namespaces ) { + for my $sym ( values %{ $namespace . '::' } ) { + if ( *{$sym}{CODE} && *{$sym}{CODE} == $code ) { + $name = *{$sym}{NAME}; + $self->set_action( $name, $code, $comp, $attrs ); + last; + } } } } @@ -774,10 +790,38 @@ sub setup_components { $self->components->{ ref $comp } = $comp; $self->setup_actions($comp); } - $self->log->debug( 'Initialized components "' - . join( ' ', keys %{ $self->components } ) - . '"' ) - if $self->debug; + my @comps; + push @comps, " $_" for keys %{ $self->components }; + $self->log->debug( 'Loaded components', @comps ) + if ( @comps && $self->debug ); + my $actions = $self->actions; + my @messages = ('Loaded private actions'); + my $walker = sub { + my ( $walker, $parent, $messages, $prefix ) = @_; + $prefix .= $parent->getNodeValue || ''; + $prefix .= '/' unless $prefix =~ /\/$/; + my $uid = $parent->getUID; + for my $action ( keys %{ $actions->{private}->{$uid} } ) { + my ( $class, $code ) = @{ $actions->{private}->{$uid}->{$action} }; + push @$messages, _prettify( "$prefix$action", $class, $code ); + } + $walker->( $walker, $_, $messages, $prefix ) + for $parent->getAllChildren; + }; + $walker->( $walker, $self->tree, \@messages, '' ); + $self->log->debug(@messages) if ( $#messages && $self->debug ); + @messages = ('Loaded plain actions'); + for my $plain ( sort keys %{ $actions->{plain} } ) { + my ( $class, $code ) = @{ $actions->{plain}->{$plain} }; + push @messages, _prettify( "/$plain", $class, $code ); + } + $self->log->debug(@messages) if ( $#messages && $self->debug ); + @messages = ('Loaded regex actions'); + for my $regex ( sort keys %{ $actions->{regex} } ) { + my ( $class, $code ) = @{ $actions->{regex}->{$regex} }; + push @messages, _prettify( $regex, $class, $code ); + } + $self->log->debug(@messages) if ( $#messages && $self->debug ); } =item $c->stash @@ -810,13 +854,23 @@ sub _prefix { sub _class2prefix { my $class = shift || ''; my $prefix; - if ($class =~ /^.*::([MVC]|Model|View|Controller)?::(.*)$/) { - $prefix = lc $2; - $prefix =~ s/\:\:/\//g; + if ( $class =~ /^.*::([MVC]|Model|View|Controller)?::(.*)$/ ) { + $prefix = lc $2; + $prefix =~ s/\:\:/\//g; } return $prefix; } +sub _prettify { + my ( $val1, $val2, $val3 ) = @_; + formline +' @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<<<<<<<<< @>>>>>>>>>>>>>> ', + $val1, $val2, $val3; + my $formatted = $^A; + $^A = ''; + return $formatted; +} + =back =head1 AUTHOR