- lots of UTF8 changes. Again we think this is now more correct but please test.
- Allow $c->res->redirect($url) to accept $url as an object that does ->as_string
which I think will ease a common case (and common bug) and added documentation.
+ - UTF-8 is now the default encoding (there used to be none...). You can disable
+ this if you need to with MyApp->config(encoding => undef) if it causes you trouble.
+ - Calling $c->res->write($data) now encodes $data based on the configured encoding
+ (UTF-8 is default).
5.90077 - 2014-11-18
- We store the PSGI $env in Catalyst::Engine for backcompat reasons. Changed
=head2 $c->finalize_encoding
-Make sure your headers and body are encoded properly IF you set an encoding.
+Make sure your headers and body are encoded properly IF you set an encoding. By
+default the encoding is UTF-8 but you can disable it by explictly setting the
+encoding configuration value to undef.
+
See L</ENCODING>.
=cut
sub setup_encoding {
my $c = shift;
- # This is where you'd set a default encoding
- my $enc = delete $c->config->{encoding};
- $c->encoding( $enc ) if defined $enc;
+ if( exists($c->config->{encoding}) && !defined($c->config->{encoding}) ) {
+ # Ok, so the user has explicitly said "I don't want encoding..."
+ return;
+ } else {
+ my $enc = defined($c->config->{encoding}) ?
+ delete $c->config->{encoding} : 'UTF-8'; # not sure why we delete it... (JNAP)
+ $c->encoding($enc);
+ }
}
=head2 handle_unicode_encoding_exception
C<encoding> - See L</ENCODING>
+This now defaults to 'UTF-8'. You my turn it off by setting this configuration
+value to undef.
+
=item *
C<abort_chain_on_error_fix>
On request, decodes all params from encoding into a sequence of
logical characters. On response, encodes body into encoding.
+By default encoding is now 'UTF-8'. You may turn it off by setting
+the encoding configuration to undef.
+
=head2 Methods
=over 4
$self->_context->finalize_headers unless $self->finalized_headers;
$buffer = q[] unless defined $buffer;
+ $buffer = $self->_context->encoding->encode( $buffer, $self->_context->_encode_check );
my $len = length($buffer);
$self->_writer->write($buffer);
=head2 $res->write( $data )
-Writes $data to the output stream.
+Writes $data to the output stream. Calling this method will finalize your
+headers and send the headers and status code response to the client (so changing
+them afterwards is a waste... be sure to set your headers correctly first).
+
+You may call this as often as you want throughout your response cycle. You may
+even set a 'body' afterward. So for example you might write your HTTP headers
+and the HEAD section of your document and then set the body from a template
+driven from a database. In some cases this can seem to the client as if you had
+a faster overall response (but note that unless your server support chunked
+body your content is likely to get queued anyway (L<Starman> and most other
+http 1.1 webservers support this).
+
+If there is an encoding set, we encode each line of the response (the default
+encoding is UTF-8).
=head2 $res->write_fh
});
}
+Like the 'write' method, calling this will finalize headers. Unlike 'write' when you
+can this it is assumed you are taking control of the response so the body is never
+finalized (there isn't one anyway) and you need to call the close method.
+
=head2 $res->print( @data )
Prints @data to the output stream, separated by $,. This lets you pass
Test::More::is $c->req->captures->[0], '♥';
$c->response->body("<p>This is base-link action ♥ ${\$c->req->args->[0]}</p>");
+
+ # Test to make sure redirect can now take an object (sorry don't have a better place for it
+ # but wanted test coverage.
+ my $location = $c->res->redirect( $c->uri_for($c->controller('Root')->action_for('uri_for')) );
+ Test::More::ok !ref $location;
}
+ sub stream_write :Local {
+ my ($self, $c) = @_;
+ $c->response->content_type('text/html');
+ $c->response->write("<p>This is stream_write action ♥</p>");
+ }
+
package MyApp;
use Catalyst;
{
my $res = request "/base/♥/♥/♥/♥";
- is $res->code, 200, 'OK';
is decode_utf8($res->content), '<p>This is base-link action ♥ ♥</p>', 'correct body';
is $res->content_length, 39, 'correct length';
}
is decode_utf8($res->content), "$url", 'correct body'; #should do nothing
is $res->content, "$url", 'correct body';
is $res->content_length, 90, 'correct length';
+}
+
+{
+ my $res = request "/root/stream_write";
- # Test to make sure redirect can now take an object (sorry don't have a better place for it
- # but wanted test coverage.
- my $location = $c->res->redirect( $c->uri_for($c->controller('Root')->action_for('uri_for')) );
- ok !ref $location;
+ is $res->code, 200, 'OK';
+ is decode_utf8($res->content), '<p>This is stream_write action ♥</p>', 'correct body';
}
+
done_testing;