X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2Futf_incoming.t;h=c144a443b8f60aeb0d966037777a6bdffc7e723d;hb=ff2b698b349ef162c5f2f4f080ca5f0091e5ba1c;hp=f04dd1956dfc5ab10d292a252df0f63416751c44;hpb=6adc45cf93c50a080f1f32bad475fd2ab5844887;p=catagits%2FCatalyst-Runtime.git diff --git a/t/utf_incoming.t b/t/utf_incoming.t index f04dd19..c144a44 100644 --- a/t/utf_incoming.t +++ b/t/utf_incoming.t @@ -3,9 +3,11 @@ use warnings; use strict; use Test::More; use HTTP::Request::Common; -use Encode 2.21 'decode_utf8', 'encode_utf8'; +use HTTP::Message::PSGI (); +use Encode 2.21 'decode_utf8', 'encode_utf8', 'encode'; use File::Spec; use JSON::MaybeXS; +use Scalar::Util (); # Test cases for incoming utf8 @@ -62,6 +64,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("
This is base-link action ⥠${\$c->req->args->[0]}
"); @@ -131,6 +135,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 @@ -142,7 +147,7 @@ use JSON::MaybeXS; ## If someone clears encoding, they can do as they wish sub manual_1 :Local { my ($self, $c) = @_; - $c->encoding(undef); + $c->clear_encoding; $c->res->content_type('text/plain'); $c->res->content_type_charset('UTF-8'); $c->response->body( Encode::encode_utf8("manual_1 â¥")); @@ -161,12 +166,37 @@ 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("This is stream_write action â¥
"); + $c->encoding(Encode::find_encoding('Shift_JIS')); + $c->response->write("This is stream_write action â¥
"); + } + + 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)); + } + + sub echo_arg :Local { + my ($self, $c) = @_; + $c->response->content_type('text/plain'); + $c->response->body($c->req->body_parameters->{arg}); + } + package MyApp; use Catalyst; - # Default encoding is now UTF-8 - # MyApp->config(encoding=>'UTF-8'); - Test::More::ok(MyApp->setup, 'setup app'); } @@ -268,6 +298,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'; } } @@ -347,7 +382,18 @@ use Catalyst::Test 'MyApp'; ok my $res = request $req; ## decode_json expect the binary utf8 string and does the decoded bit for us. - is_deeply decode_json(($res->content)), +{'â¥'=>'â¥â¥'}; + is_deeply decode_json(($res->content)), +{'â¥'=>'â¥â¥'}, 'JSON was decoded correctly'; +} + +{ + 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', 'content charset is SHIFT_JIS as expected'; } { @@ -369,7 +415,68 @@ SKIP: { is $res->code, 200, 'OK'; is decode_utf8($content), "manual_1 â¥", 'correct body'; - is $res->content_charset, 'UTF-8'; + is $res->content_charset, 'UTF-8', 'zlib charset is set correctly'; +} + +{ + my $res = request "/root/stream_write_error"; + + is $res->code, 200, 'OK'; + like decode_utf8($res->content), qr[This is stream_write action â¥
code, 200, 'OK'; + is decode_utf8($res->content), 'This is path-heart action â¥
', 'correct body'; + is $res->content_length, 36, 'correct length'; + is $res->content_charset, 'UTF-8', 'external PSGI app has expected charset'; +} + +{ + my $utf8 = 'test â¥'; + my $shiftjs = 'test ãã¹ã'; + + ok my $req = POST '/root/echo_arg', + Content_Type => 'form-data', + Content => [ + arg0 => 'helloworld', + Encode::encode('UTF-8','â¥') => Encode::encode('UTF-8','â¥â¥'), # Long form POST simple does not auto encode... + Encode::encode('UTF-8','â¥â¥â¥') => [ + undef, '', + 'Content-Type' =>'text/plain; charset=SHIFT_JIS', + 'Content' => Encode::encode('SHIFT_JIS', $shiftjs)], + arg1 => [ + undef, '', + 'Content-Type' =>'text/plain; charset=UTF-8', + 'Content' => Encode::encode('UTF-8', $utf8)], + arg2 => [ + undef, '', + 'Content-Type' =>'text/plain; charset=SHIFT_JIS', + 'Content' => Encode::encode('SHIFT_JIS', $shiftjs)], + arg2 => [ + undef, '', + 'Content-Type' =>'text/plain; charset=SHIFT_JIS', + 'Content' => Encode::encode('SHIFT_JIS', $shiftjs)], + ]; + + my ($res, $c) = ctx_request $req; + + is $c->req->body_parameters->{'arg0'}, 'helloworld', 'got helloworld value'; + is $c->req->body_parameters->{'â¥'}, 'â¥â¥'; + + ok Scalar::Util::blessed($c->req->body_parameters->{'arg1'}); + ok Scalar::Util::blessed($c->req->body_parameters->{'arg2'}[0]); + ok Scalar::Util::blessed($c->req->body_parameters->{'arg2'}[1]); + ok Scalar::Util::blessed($c->req->body_parameters->{'â¥â¥â¥'}); + + # Since the form post is COMPLEX you are expected to decode it yourself. + is Encode::decode('UTF-8', $c->req->body_parameters->{'arg1'}->raw_data), $utf8, 'decoded utf8 param'; + is Encode::decode('SHIFT_JIS', $c->req->body_parameters->{'arg2'}[0]->raw_data), $shiftjs, 'decoded shiftjis param'; + is Encode::decode('SHIFT_JIS', $c->req->body_parameters->{'arg2'}[1]->raw_data), $shiftjs, 'decoded shiftjis param'; + is Encode::decode('SHIFT_JIS', $c->req->body_parameters->{'â¥â¥â¥'}->raw_data), $shiftjs, 'decoded shiftjis param'; + } ## should we use binmode on filehandles to force the encoding...?