Streaming response API for contentHandlers is now taking shape

This commit is contained in:
Patrick Donelan 2010-04-07 01:02:01 -04:00
parent c0abcc3e4a
commit c7235378d1
5 changed files with 94 additions and 74 deletions

View file

@ -6,7 +6,9 @@ The WebGUI server response object. See L<Plack::Response>
=cut
use strict;
use parent qw(Plack::Request);
use Plack::Util::Accessor qw(session);
use WebGUI::Response;
=head1 METHODS
@ -23,7 +25,9 @@ See L<WebGUI::Session/response>
sub new_response {
my $self = shift;
WebGUI::Response->new(@_);
my $response = WebGUI::Response->new(@_);
$response->session($self->session);
return $response;
}
1;

View file

@ -2,7 +2,7 @@ package WebGUI::Response;
use strict;
use parent qw(Plack::Response);
use Plack::Util::Accessor qw(streaming writer streamer);
use Plack::Util::Accessor qw(session streaming writer streamer);
=head2 DESCRIPTION
@ -12,9 +12,8 @@ The WebGUI server response object. See of L<Plack::Response>
sub stream {
my $self = shift;
my $streamer = shift;
$self->streamer(shift);
$self->streaming(1);
$self->streamer($streamer);
}
sub stream_write {

View file

@ -458,8 +458,11 @@ sub open {
my $config = ref $c ? $c : WebGUI::Config->new($webguiRoot,$c);
my $self = {_config=>$config }; # TODO - if we store reference here, should we weaken WebGUI->config?
bless $self , $class;
$self->{_request} = $request if defined $request;
$self->{_response} = $request->new_response( 200 ) if defined $request;
if (defined $request) {
$request->session($self); # hello circular reference
$self->{_request} = $request;
$self->{_response} = $request->new_response( 200 );
}
my $sessionId = shift || $request->cookies->{$config->getCookieName} || $self->id->generate;
$sessionId = $self->id->generate unless $self->id->valid($sessionId);
my $noFuss = shift;

View file

@ -95,10 +95,14 @@ sub print {
print $handle $content;
}
elsif ($self->session->response) {
if ($self->session->response->streaming) {
$self->session->response->stream_write($content);
my $response = $self->session->response;
if ($response->streaming) {
$response->stream_write($content);
} else {
# Not streaming, so buffer the response instead
# warn "buffering output";
$response->body([]) unless $response->body && ref $response->body eq 'ARRAY';
push @{$response->body}, $content;
}
}
else {