From: Andy Grundman Date: Sun, 6 May 2007 15:38:25 +0000 (+0000) Subject: Don't set a content-length from a filehandle object unless it reports a positive... X-Git-Tag: 5.7099_04~187 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=commitdiff_plain;h=3b6a1db18241beccccb477ffd5f3abeaaff35418 Don't set a content-length from a filehandle object unless it reports a positive size --- diff --git a/lib/Catalyst.pm b/lib/Catalyst.pm index 40791cd..809d2a4 100644 --- a/lib/Catalyst.pm +++ b/lib/Catalyst.pm @@ -1427,7 +1427,8 @@ sub finalize_headers { # get the length from a filehandle if ( blessed( $c->response->body ) && $c->response->body->can('read') ) { - if ( my $stat = stat $c->response->body ) { + my $stat = stat $c->response->body; + if ( $stat && $stat->size > 0 ) { $c->response->content_length( $stat->size ); } else { diff --git a/t/live_component_controller_action_streaming.t b/t/live_component_controller_action_streaming.t index b865cf6..d589d11 100644 --- a/t/live_component_controller_action_streaming.t +++ b/t/live_component_controller_action_streaming.t @@ -10,7 +10,7 @@ our $iters; BEGIN { $iters = $ENV{CAT_BENCH_ITERS} || 1; } -use Test::More tests => 8*$iters; +use Test::More tests => 10*$iters; use Catalyst::Test 'TestApp'; if ( $ENV{CAT_BENCHMARK} ) { @@ -29,6 +29,8 @@ sub run_tests { ok( my $response = request('http://localhost/streaming'), 'Request' ); ok( $response->is_success, 'Response Successful 2xx' ); is( $response->content_type, 'text/plain', 'Response Content-Type' ); + # XXX: Length should be undef here, but HTTP::Request::AsCGI sets it + is( $response->content_length, 12, 'Response Content-Length' ); is( $response->content,, <<'EOF', 'Content is a stream' ); foo bar @@ -40,7 +42,7 @@ EOF SKIP: { if ( $ENV{CATALYST_SERVER} ) { - skip "Using remote server", 4; + skip "Using remote server", 5; } my $file = "$FindBin::Bin/01use.t"; @@ -55,6 +57,7 @@ EOF 'Request' ); ok( $response->is_success, 'Response Successful 2xx' ); is( $response->content_type, 'text/plain', 'Response Content-Type' ); + is( $response->content_length, -s $file, 'Response Content-Length' ); is( $response->content, $buffer, 'Content is read from filehandle' ); } }