summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2012-09-28 23:45:28 -0500
committerJesse Luehrs <doy@tozt.net>2012-09-28 23:45:28 -0500
commit6d67faeafe38ddb6277e0f7115aec453acf68cec (patch)
tree5658420fe6bec45b3dfdd501cc9cb5b11bc39252
parent378d39ae1a2cf3f6568e410a7844c2fa6dd12526 (diff)
downloadweb-request-6d67faeafe38ddb6277e0f7115aec453acf68cec.tar.gz
web-request-6d67faeafe38ddb6277e0f7115aec453acf68cec.zip
handle encoding
-rw-r--r--lib/Web/Response.pm13
-rw-r--r--t/response-streaming.t46
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;