From 99d67f4bf21cabadeab0a499b7292c4a242720fb Mon Sep 17 00:00:00 2001
From: Tatsuhiko Miyagawa <miyagawa@bulknews.net>
Date: Tue, 20 Oct 2009 18:32:18 -0700
Subject: [PATCH] Fixed poll_cb and added test (stolen from nothingmuch's AnyEvent -- later should be merged)
---
lib/Plack/Server/POE.pm | 5 +-
t/streaming.t | 105 +++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 107 insertions(+), 3 deletions(-)
create mode 100644 t/streaming.t
diff --git a/lib/Plack/Server/POE.pm b/lib/Plack/Server/POE.pm
index 0823e5b..867c08d 100644
--- a/lib/Plack/Server/POE.pm
+++ b/lib/Plack/Server/POE.pm
@@ -155,14 +155,13 @@ sub on_client_input {
return;
}
- return Plack::Util::inline_object(
+ my $writer; $writer = Plack::Util::inline_object(
write => $w,
close => $c,
poll_cb => sub {
my $get = shift;
($heap->{client_flush} = sub {
- my $chunk = $get->();
- $w->($chunk) if defined $chunk;
+ my $chunk = $get->($writer);
})->();
},
);
diff --git a/t/streaming.t b/t/streaming.t
new file mode 100644
index 0000000..ea48e09
--- /dev/null
+++ b/t/streaming.t
@@ -0,0 +1,105 @@
+use strict;
+use warnings;
+use FindBin;
+use Test::More;
+use Test::Requires qw(POE HTTP::Parser::XS);
+
+use Plack;
+use Plack::Test::Suite;
+
+use HTTP::Request;
+use HTTP::Request::Common;
+
+local @Plack::Test::Suite::TEST = (
+ [
+ 'coderef res',
+ sub {
+ my $cb = shift;
+ my $res = $cb->(GET "http://127.0.0.1/?name=miyagawa");
+ is $res->code, 200;
+ is $res->header('content_type'), 'text/plain';
+ is $res->content, 'Hello, name=miyagawa';
+ },
+ sub {
+ my $env = shift;
+
+ return sub {
+ my ( $write, $sock ) = @_;
+
+ $write->([
+ 200,
+ [ 'Content-Type' => 'text/plain', ],
+ [ 'Hello, ' . $env->{QUERY_STRING} ],
+ ]);
+ }
+ },
+ ],
+ [
+ 'coderef streaming',
+ sub {
+ my $cb = shift;
+ my $res = $cb->(GET "http://127.0.0.1/?name=miyagawa");
+ is $res->code, 200;
+ is $res->header('content_type'), 'text/plain';
+ is $res->content, 'Hello, name=miyagawa';
+ },
+ sub {
+ my $env = shift;
+
+ return sub {
+ my ( $write, $sock ) = @_;
+
+ my $writer = $write->([
+ 200,
+ [ 'Content-Type' => 'text/plain', ],
+ ]);
+
+ $writer->write("Hello, ");
+ $writer->write($env->{QUERY_STRING});
+ $writer->close();
+ }
+ },
+ ],
+ [
+ 'coderef poll_cb',
+ sub {
+ my $cb = shift;
+ my $res = $cb->(GET "http://127.0.0.1/?name=miyagawa");
+ is $res->code, 200;
+ is $res->header('content_type'), 'text/plain';
+ is $res->content, 'Hello, name=miyagawa';
+ },
+ sub {
+ my $env = shift;
+
+ return sub {
+ my ( $write, $sock ) = @_;
+
+ my @queue = ( "Hello, ", $env->{QUERY_STRING} );
+
+ $write->([
+ 200,
+ [ 'Content-Type' => 'text/plain', ],
+ ])->poll_cb(sub {
+ my $writer = shift;
+
+ if ( @queue ) {
+ $writer->write(shift @queue);
+ } else {
+ $writer->close;
+ }
+ });
+ };
+ },
+ ]
+);
+
+# prevent Lint middleware from being used
+Plack::Test::Suite->run_server_tests(sub {
+ my($port, $app) = @_;
+ my $server = Plack::Loader->load("POE", port => $port, host => "127.0.0.1");
+ $server->run($app);
+});
+
+done_testing();
+
--
1.6.3.1