=head2 encoding
-Sets or gets the application encoding.
+Sets or gets the application encoding. Setting encoding takes either an
+Encoding object or a string that we try to resolve via L<Encode::find_encoding>.
+
+You would expect to get the encoding object back if you attempt to set it. If
+there is a failure you will get undef returned and an error message in the log.
=cut
if(blessed $c) {
$c->encoding(undef);
} else {
- $c->debug->error("You can't clear encoding on the application");
+ $c->log->error("You can't clear encoding on the application");
}
}
my $encoding;
if ( scalar @_ ) {
+
+ # Don't let one change this once we are too far into the response
+ if(blessed $c && $c->res->finalized_headers) {
+ Carp::croak("You may not change the encoding once the headers are finalized");
+ return;
+ }
+
# Let it be set to undef
if (my $wanted = shift) {
$encoding = Encode::find_encoding($wanted)
sub override_encoding :Local {
my ($self, $c) = @_;
$c->res->content_type('text/plain');
+ $c->encoding(Encode::find_encoding('UTF-8'));
$c->encoding(Encode::find_encoding('Shift_JIS'));
$c->response->body("テスト");
}
+ sub stream_write_error :Local {
+ my ($self, $c) = @_;
+ $c->response->content_type('text/html');
+ $c->response->write("<p>This is stream_write action ♥</p>");
+ $c->encoding(Encode::find_encoding('Shift_JIS'));
+ $c->response->write("<p>This is stream_write action ♥</p>");
+ }
+
package MyApp;
use Catalyst;
is $res->content_charset, 'UTF-8';
}
+{
+ my $res = request "/root/stream_write_error";
+
+ is $res->code, 200, 'OK';
+ like decode_utf8($res->content), qr[<p>This is stream_write action ♥</p><!DOCTYPE html], 'correct body';
+}
+
+
## should we use binmode on filehandles to force the encoding...?
## Not sure what else to do with multipart here, if docs are enough...