X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=blobdiff_plain;f=t%2Futf_incoming.t;h=52939512e3b55d04792024d1a985df295e45548d;hp=2adccb44ea34bf31923fe539d06b1dc9146dc28c;hb=1e300b1c0ff0917934d63d1435e4ae533dc53e55;hpb=58b80ff1398f28fcf955eedbfc79e91628bfa491 diff --git a/t/utf_incoming.t b/t/utf_incoming.t index 2adccb4..5293951 100644 --- a/t/utf_incoming.t +++ b/t/utf_incoming.t @@ -7,6 +7,7 @@ use HTTP::Message::PSGI (); use Encode 2.21 'decode_utf8', 'encode_utf8', 'encode'; use File::Spec; use JSON::MaybeXS; +use Data::Dumper; use Scalar::Util (); # Test cases for incoming utf8 @@ -139,6 +140,26 @@ use Scalar::Util (); $c->response->body($decoded_text); } + sub file_upload_utf8_param :POST Consumes(Multipart) Local { + my ($self, $c) = @_; + + Test::More::is $c->req->body_parameters->{'♥'}, '♥♥'; + Test::More::ok my $upload = $c->req->uploads->{'♥'}; + Test::More::is $upload->charset, 'UTF-8'; + + my $text = $upload->slurp; + Test::More::is Encode::decode_utf8($text), "

This is stream_body_fh action ♥

\n"; + + my $decoded_text = $upload->decoded_slurp; + Test::More::is $decoded_text, "

This is stream_body_fh action ♥

\n"; + + Test::More::is $upload->filename, '♥ttachment.txt'; + Test::More::is $upload->raw_basename, '♥ttachment.txt'; + + $c->response->content_type('text/html'); + $c->response->body($decoded_text); + } + sub json :POST Consumes(JSON) Local { my ($self, $c) = @_; my $post = $c->req->body_data; @@ -203,6 +224,13 @@ use Scalar::Util (); $c->response->body($c->req->body_parameters->{arg}); } + sub echo_param :Local { + my ($self, $c) = @_; + $c->response->content_type('text/plain'); + $c->response->body($c->req->query_parameters->{arg}); + } + + package MyApp; use Catalyst; @@ -323,7 +351,7 @@ use Catalyst::Test 'MyApp'; is $res->code, 200, 'OK'; is decode_utf8($res->content), "$url", 'correct body'; #should do nothing is $res->content, "$url", 'correct body'; - is $res->content_length, 102, 'correct length'; + is $res->content_length, 104, 'correct length'; is $res->content_charset, 'UTF-8'; { @@ -392,6 +420,16 @@ use Catalyst::Test 'MyApp'; } { + ok my $path = File::Spec->catfile('t', 'utf8.txt'); + ok my $req = POST '/root/file_upload_utf8_param', + Content_Type => 'form-data', + Content => [encode_utf8('♥')=>encode_utf8('♥♥'), encode_utf8('♥')=>["$path", encode_utf8('♥ttachment.txt'), 'Content-Type' =>'text/html; charset=UTF-8', ]]; + + ok my $res = request $req; + is decode_utf8($res->content), "

This is stream_body_fh action ♥

\n"; +} + +{ ok my $req = POST '/root/json', Content_Type => 'application/json', Content => encode_json +{'♥'=>'♥♥'}; # Note: JSON does the UTF* encoding for us @@ -499,6 +537,29 @@ SKIP: { is $c->req->query_parameters->{'a'}, $shiftjs, 'got expected value'; } +{ + my $invalid = '%e2'; + # in url + { + my $req = GET "/$invalid"; + my $res = request $req; + is ($res->code, '400', "Invalid url param is 400"); + } + # in body + { + my $req = POST "/root/echo_arg", Content => "arg0=$invalid"; + my $res = request $req; + is ($res->code, '400', "Invalid post param is 400"); + } + # in query + { + # failing since 5.90080 + my $req = GET "/root/echo_param?arg=$invalid"; + my $res = request $req; + is ($res->code, '400', "Invalid get param is 400") or diag Dumper($res->decoded_content); + } +} + ## should we use binmode on filehandles to force the encoding...? ## Not sure what else to do with multipart here, if docs are enough...