tests and donot let you change encoding too late into the response
John Napiorkowski [Wed, 7 Jan 2015 19:37:39 +0000 (13:37 -0600)]
lib/Catalyst.pm
t/utf_incoming.t

index a255543..bc54ac7 100644 (file)
@@ -1049,7 +1049,11 @@ Clears the encoding for the current context
 
 =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
 
@@ -1060,7 +1064,7 @@ sub clear_encoding {
     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");
     }
 }
 
@@ -1069,6 +1073,13 @@ sub encoding {
     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)
index 373a428..638cef5 100644 (file)
@@ -167,10 +167,19 @@ use JSON::MaybeXS;
   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;
 
@@ -395,6 +404,14 @@ SKIP: {
   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...