X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=blobdiff_plain;f=lib%2FCatalyst%2FResponse.pm;h=0ef4c52ddf4ebe626a164e7d4ead178b5611c11f;hp=bf4ef4409c7c8f77c9772d6ec4328a1c76bfa2ab;hb=12982f8623b4a3520146d4f52c5705d2b8a3b5ab;hpb=5c397774465fdb8f734dd7948503c571b2677c79 diff --git a/lib/Catalyst/Response.pm b/lib/Catalyst/Response.pm index bf4ef44..0ef4c52 100644 --- a/lib/Catalyst/Response.pm +++ b/lib/Catalyst/Response.pm @@ -5,6 +5,7 @@ use HTTP::Headers; use Moose::Util::TypeConstraints; use namespace::autoclean; use Scalar::Util 'blessed'; +use Catalyst::Response::Writer; with 'MooseX::Emulate::Class::Accessor::Fast'; @@ -52,7 +53,17 @@ has write_fh => ( builder=>'_build_write_fh', ); -sub _build_write_fh { shift ->_writer } +sub _build_write_fh { + my $writer = $_[0]->_writer; # We need to get the finalize headers side effect... + my $requires_encoding = $_[0]->content_type =~ m/$Catalyst::DEFAULT_ENCODE_CONTENT_TYPE_MATCH/; + my %fields = ( + _writer => $writer, + _encoding => $_[0]->encoding, + _requires_encoding => $requires_encoding, + ); + + return bless \%fields, 'Catalyst::Response::Writer'; +} sub DEMOLISH { my $self = shift; @@ -83,6 +94,8 @@ has _context => ( clearer => '_clear_context', ); +has encoding => (is=>'ro'); + before [qw(status headers content_encoding content_length content_type header)] => sub { my $self = shift; @@ -105,7 +118,7 @@ sub write { $buffer = q[] unless defined $buffer; $buffer = $self->_context->encoding->encode( $buffer, $self->_context->_encode_check ) - if $self->_context->encoding && $self->content_type =~ /^text|xml$|javascript$/; + if $self->_context->encoding && $self->content_type =~ /$Catalyst::DEFAULT_ENCODE_CONTENT_TYPE_MATCH/; my $len = length($buffer); $self->_writer->write($buffer); @@ -411,9 +424,22 @@ encoding is UTF-8). =head2 $res->write_fh -Returns a PSGI $writer object that has two methods, write and close. You can -close over this object for asynchronous and nonblocking applications. For -example (assuming you are using a supporting server, like L +Returns an instance of L, which is a lightweight +decorator over the PSGI C<$writer> object (see L). + +In addition to proxying the C and C method from the underlying PSGI +writer, this proxy object knows any application wide encoding, and provides a method +C that will properly encode your written lines based upon your +encoding settings. By default in L responses are UTF-8 encoded and this +is the encoding used if you respond via C. If you want to handle +encoding yourself, you can use the C method directly. + +Encoding only applies to content types for which it matters. Currently the following +content types are assumed to need encoding: text (including HTML), xml and javascript. + +We provide access to this object so that you can properly close over it for use in +asynchronous and nonblocking applications. For example (assuming you are using a supporting +server, like L: package AsyncExample::Controller::Root;