X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FResponse.pm;h=efd01825bc5a94e7a1c25fff5ce7534675650377;hb=490b7a80e669aefefcf6d18a03cc04df52cacea8;hp=f5ec77c5e13fc49aa15a1c2f3c96643e24626190;hpb=e67f0874848760b322fafdf8b599009b7defd5a0;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/Response.pm b/lib/Catalyst/Response.pm index f5ec77c..efd0182 100644 --- a/lib/Catalyst/Response.pm +++ b/lib/Catalyst/Response.pm @@ -28,7 +28,7 @@ has _writer => ( has write_fh => ( is=>'ro', - predicate=>'has_write_fh', + predicate=>'_has_write_fh', lazy=>1, builder=>'_build_write_fh', ); @@ -42,7 +42,7 @@ sub _build_write_fh { sub DEMOLISH { my $self = shift; - return if $self->has_write_fh; + return if $self->_has_write_fh; if($self->_has_writer) { $self->_writer->close } @@ -117,7 +117,7 @@ sub from_psgi_response { if(ref $psgi_res eq 'ARRAY') { my ($status, $headers, $body) = @$psgi_res; $self->status($status); - $self->headers($headers); + $self->headers(HTTP::Headers->new(@$headers)); if(ref $body eq 'ARRAY') { $self->body(join '', grep defined, @$body); } else { @@ -125,9 +125,10 @@ sub from_psgi_response { } } elsif(ref $psgi_res eq 'CODE') { $psgi_res->(sub { - my ($status, $headers, $maybe_body) = @_; + my $response = shift; + my ($status, $headers, $maybe_body) = @$response; $self->status($status); - $self->headers($headers); + $self->headers(HTTP::Headers->new(@$headers)); if($maybe_body) { if(ref $maybe_body eq 'ARRAY') { $self->body(join '', grep defined, @$maybe_body); @@ -137,8 +138,8 @@ sub from_psgi_response { } else { return $self->write_fh; } - }); - } else { + }); + } else { die "You can't set a Catalyst response from that, expect a valid PSGI response"; } } @@ -180,6 +181,14 @@ you might want to use a L type of object (Something that implements in the same fashion), or a filehandle GLOB. Catalyst will write it piece by piece into the response. +When using a L type of object and no content length has been +already set in the response headers Catalyst will make a reasonable attempt +to determine the size of the Handle. Depending on the implementation of your +handle object, setting the content length may fail. If it is at all possible +for you to determine the content length of your handle object, +it is recomended that you set the content length in the response headers +yourself, which will be respected and sent by Catalyst in the response. + =head2 $res->has_body Predicate which returns true when a body has been set. @@ -361,7 +370,7 @@ Example: sub myaction :Local Args { my ($self, $c) = @_; - $c->res->from_psgi_response($app->($self->env)); + $c->res->from_psgi_response($app->($c->req->env)); } Please note this does not attempt to map or nest your PSGI application under