X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst.pm;h=b0d3c91b408df26de0b970803546587cdc5c8f5c;hb=8dc69021513026f14bf6920a289759b73ad1e29f;hp=e63fb98dc838d8e5407665ba252a70ab0ec789ee;hpb=dc5f035ee51a9833b5340e3ee597f5722263042f;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst.pm b/lib/Catalyst.pm index e63fb98..b0d3c91 100644 --- a/lib/Catalyst.pm +++ b/lib/Catalyst.pm @@ -65,7 +65,7 @@ __PACKAGE__->stats_class('Catalyst::Stats'); # Remember to update this in Catalyst::Runtime as well! -our $VERSION = '5.7011'; +our $VERSION = '5.7012'; sub import { my ( $class, @arguments ) = @_; @@ -920,6 +920,9 @@ If the last argument to C is a hash reference, it is assumed to contain GET parameter key/value pairs, which will be appended to the URI in standard fashion. +Note that uri_for is destructive to the passed hashref. Subsequent calls +with the same hashref may have unintended results. + Instead of C<$path>, you can also optionally pass a C<$action> object which will be resolved to a path using C<< $c->dispatcher->uri_for_action >>; if the first element of @@ -978,7 +981,7 @@ sub uri_for { $val = '' unless defined $val; (map { $_ = "$_"; - utf8::encode( $_ ); + utf8::encode( $_ ) if utf8::is_utf8($_); # using the URI::Escape pattern here so utf8 chars survive s/([^A-Za-z0-9\-_.!~*'() ])/$URI::Escape::escapes{$1}/go; s/ /+/g; @@ -1266,24 +1269,35 @@ sub _stats_start_execute { } } + my $uid = "$code" . $c->counter->{"$code"}; + # is this a root-level call or a forwarded call? if ( $callsub =~ /forward$/ ) { # forward, locate the caller if ( my $parent = $c->stack->[-1] ) { - $c->stats->profile(begin => $action, - parent => "$parent" . $c->counter->{"$parent"}); + $c->stats->profile( + begin => $action, + parent => "$parent" . $c->counter->{"$parent"}, + uid => $uid, + ); } else { # forward with no caller may come from a plugin - $c->stats->profile(begin => $action); + $c->stats->profile( + begin => $action, + uid => $uid, + ); } } else { - + # root-level call - $c->stats->profile(begin => $action); + $c->stats->profile( + begin => $action, + uid => $uid, + ); } return $action; @@ -1291,7 +1305,7 @@ sub _stats_start_execute { sub _stats_finish_execute { my ( $c, $info ) = @_; - $c->stats->profile(end => $info); + $c->stats->profile( end => $info ); } =head2 $c->_localize_fields( sub { }, \%keys ); @@ -1347,8 +1361,8 @@ sub finalize { $c->finalize_body; } - if ($c->use_stats) { - my $elapsed = tv_interval($c->stats->getNodeValue); + if ($c->use_stats) { + my $elapsed = sprintf '%f', $c->stats->elapsed; my $av = $elapsed == 0 ? '??' : sprintf '%.3f', 1 / $elapsed; $c->log->info( "Request took ${elapsed}s ($av/s)\n" . $c->stats->report . "\n" ); @@ -1421,6 +1435,7 @@ sub finalize_headers { } } else { + # everything should be bytes at this point, but just in case $c->response->content_length( bytes::length( $c->response->body ) ); } } @@ -2122,9 +2137,9 @@ sub setup_stats { my $env = Catalyst::Utils::env_value( $class, 'STATS' ); if ( defined($env) ? $env : ($stats || $class->debug ) ) { - no strict 'refs'; - *{"$class\::use_stats"} = sub { 1 }; - $class->log->debug('Statistics enabled'); + no strict 'refs'; + *{"$class\::use_stats"} = sub { 1 }; + $class->log->debug('Statistics enabled'); } }