diff options
author | Jesse Luehrs <doy@tozt.net> | 2012-09-28 23:45:28 -0500 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2012-09-28 23:45:28 -0500 |
commit | 6d67faeafe38ddb6277e0f7115aec453acf68cec (patch) | |
tree | 5658420fe6bec45b3dfdd501cc9cb5b11bc39252 | |
parent | 378d39ae1a2cf3f6568e410a7844c2fa6dd12526 (diff) | |
download | web-request-6d67faeafe38ddb6277e0f7115aec453acf68cec.tar.gz web-request-6d67faeafe38ddb6277e0f7115aec453acf68cec.zip |
handle encoding
-rw-r--r-- | lib/Web/Response.pm | 13 | ||||
-rw-r--r-- | t/response-streaming.t | 46 |
2 files changed, 57 insertions, 2 deletions
diff --git a/lib/Web/Response.pm b/lib/Web/Response.pm index 6516021..65fc372 100644 --- a/lib/Web/Response.pm +++ b/lib/Web/Response.pm @@ -157,10 +157,19 @@ sub finalize { sub _finalize_streaming { my $self = shift; + my $streaming = $self->streaming_response; + # XXX cookies? - # XXX encoding? - return $self->streaming_response; + return $streaming unless $self->has_encoding; + + return Plack::Util::response_cb($streaming, sub { + return sub { + my $chunk = shift; + return unless defined $chunk; + return $self->_encode($chunk); + }; + }); } sub _encode { diff --git a/t/response-streaming.t b/t/response-streaming.t index fdf54e6..b9c19de 100644 --- a/t/response-streaming.t +++ b/t/response-streaming.t @@ -3,6 +3,7 @@ use strict; use warnings; use Test::More; +use Web::Request; use Web::Response; { @@ -23,4 +24,49 @@ use Web::Response; ); } +{ + use utf8; + + my $req = Web::Request->new_from_env({}); + + my $res = $req->new_response(sub { + my $responder = shift; + $responder->([200, [], ["café"]]); + }); + my $psgi_res = $res->finalize; + ok(ref($psgi_res) eq 'CODE', "got a coderef"); + + my $complete_response; + my $responder = sub { $complete_response = $_[0] }; + $psgi_res->($responder); + is_deeply( + $complete_response, + [ 200, [], ["caf\xe9"] ], + "got the right response" + ); +} + +{ + use utf8; + + my $req = Web::Request->new_from_env({}); + $req->encoding('UTF-8'); + + my $res = $req->new_response(sub { + my $responder = shift; + $responder->([200, [], ["café"]]); + }); + my $psgi_res = $res->finalize; + ok(ref($psgi_res) eq 'CODE', "got a coderef"); + + my $complete_response; + my $responder = sub { $complete_response = $_[0] }; + $psgi_res->($responder); + is_deeply( + $complete_response, + [ 200, [], ["caf\xc3\xa9"] ], + "got the right response" + ); +} + done_testing; |