if a response is from an external psgi app, donot double encode if a charset is present
[catagits/Catalyst-Runtime.git] / t / utf_incoming.t
index 3b8e965..76eaa87 100644 (file)
@@ -3,6 +3,7 @@ use warnings;
 use strict;
 use Test::More;
 use HTTP::Request::Common;
+use HTTP::Message::PSGI ();
 use Encode 2.21 'decode_utf8', 'encode_utf8';
 use File::Spec;
 use JSON::MaybeXS;
@@ -62,6 +63,8 @@ use JSON::MaybeXS;
 
         Test::More::is $c->req->args->[0], '♥';
         Test::More::is $c->req->captures->[0], '♥';
+        Test::More::is $arg, '♥';
+        Test::More::is length($arg), 1, "got length of one";
 
         $c->response->body("<p>This is base-link action ♥ ${\$c->req->args->[0]}</p>");
 
@@ -131,6 +134,7 @@ use JSON::MaybeXS;
     my $post = $c->req->body_data;
 
     Test::More::is $post->{'♥'}, '♥♥';
+    Test::More::is length($post->{'♥'}), 2;
     $c->response->content_type('application/json');
 
     # Encode JSON also encodes to a UTF-8 encoded, binary string. This is why we don't
@@ -161,12 +165,31 @@ use JSON::MaybeXS;
     $c->response->body(Compress::Zlib::memGzip(Encode::encode_utf8("manual_1 ♥")));
   }
 
+  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>");
+  }
+
+  sub from_external_psgi :Local {
+    my ($self, $c) = @_;
+    my $env = HTTP::Message::PSGI::req_to_psgi( HTTP::Request::Common::GET '/root/♥');
+    $c->res->from_psgi_response( ref($c)->to_app->($env));
+  }
+
   package MyApp;
   use Catalyst;
 
-  # Default encoding is now UTF-8
-  # MyApp->config(encoding=>'UTF-8');
-
   Test::More::ok(MyApp->setup, 'setup app');
 }
 
@@ -268,6 +291,11 @@ use Catalyst::Test 'MyApp';
     is $c->req->query_parameters->{'♥'}, '♥♥';
     is $c->req->body_parameters->{'♥'}, '♥♥';
     is $c->req->parameters->{'♥'}[0], '♥♥'; #combined with query and body
+    is $c->req->args->[0], '♥';
+    is length($c->req->parameters->{'♥'}[0]), 2;
+    is length($c->req->query_parameters->{'♥'}), 2;
+    is length($c->req->body_parameters->{'♥'}), 2;
+    is length($c->req->args->[0]), 1;
     is $res->content_charset, 'UTF-8';
   }
 }
@@ -351,6 +379,17 @@ use Catalyst::Test 'MyApp';
 }
 
 {
+  ok my $res = request "/root/override_encoding";
+  ok my $enc = Encode::find_encoding('SHIFT_JIS');
+
+  is $res->code, 200, 'OK';
+  is $enc->decode($res->content), "テスト", 'correct body';
+  is $res->content_length, 6, 'correct length'; # Bytes over the wire
+  is length($enc->decode($res->content)), 3;
+  is $res->content_charset, 'SHIFT_JIS';
+}
+
+{
   my $res = request "/root/manual_1";
 
   is $res->code, 200, 'OK';
@@ -372,6 +411,22 @@ 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';
+}
+
+{
+  my $res = request "/root/from_external_psgi";
+
+  is $res->code, 200, 'OK';
+  is decode_utf8($res->content), '<p>This is path-heart action ♥</p>', 'correct body';
+  is $res->content_length, 36, 'correct length';
+  is $res->content_charset, 'UTF-8';
+}
+
 ## should we use binmode on filehandles to force the encoding...?
 ## Not sure what else to do with multipart here, if docs are enough...