POEx-Role-PSGIServer

 view release on metacpan or  search on metacpan

lib/POEx/Role/PSGIServer/Streamer.pm  view on Meta::CPAN

package POEx::Role::PSGIServer::Streamer;
$POEx::Role::PSGIServer::Streamer::VERSION = '1.150280';
#ABSTRACT: (DEPRECATED) Provides streaming filehandle PSGI implementation
use MooseX::Declare;

class POEx::Role::PSGIServer::Streamer {
    use POE::Filter::Map;
    use POE::Filter::Stream;
    use MooseX::Types::Moose(':all');
    use POEx::Types::PSGIServer(':all');
    

    has server_context => (is => 'ro', isa => PSGIServerContext, required => 1);


    has closed_chunk => ( is => 'rw', isa => Bool, default => 0 );

    with 'POEx::Role::Streaming';


    method _build_filter {
        if($self->server_context->{chunked}) {
            POE::Filter::Map->new(
                Get => sub { $_ },
                Put => sub { 
                    my $data = shift;
                    return $data if $data =~ /0\r\n\r\n/;
                    my $len = sprintf "%X", do { use bytes; length($data) };
                    return "$len\r\n$data\r\n";
                }
            );
        }
        else {
            return POE::Filter::Stream->new();
        }
    }


    around done_writing {
        if($self->server_context->{chunked} && !$self->closed_chunk) {
            $self->closed_chunk(1);
            $self->put("0\r\n\r\n");
            return;
        }

        $self->$orig;
    }
}

1;

__END__

=pod

=head1 NAME

POEx::Role::PSGIServer::Streamer - (DEPRECATED) Provides streaming filehandle PSGI implementation

=head1 VERSION

version 1.150280

=head1 PUBLIC_ATTRIBUTES

=head2 server_context

    is: ro, isa: PSGIServerContext, required: 1

This is the server context from POEx::Role::PSGIServer. It is needed to determine the semantics of the current request

=head1 PRIVATE_ATTRIBUTES

=head2 closed_chunk

    is: rw, isa: Bool, default: 0

closed_chunk is a flag used by the advised L</around done_writing> to know whether the chunked transfer encoding needs a terminator or if the terminator has already been written to the output buffer

=head1 PROTECTED_METHODS

=head2 around done_writing

done_writing is advised to check if the context demands a chunked terminator and if one hasn't been sent yet. If so, it marks L</closed_chunk>, puts the terminator into the output buffer, and returns. Upon second invocation when the buffers are flush...

=head1 PRIVATE_METHODS

=head2 _build_filter

_build_filter is overridden to return a L<POE::Filter::Map> filter if the current response is to be chunk transfer encoded. 

=head1 AUTHOR

Nicholas Perez <nperez@cpan.org>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2015 by Infinity Interactive.

This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.

=cut



( run in 0.786 second using v1.01-cache-2.11-cpan-39bf76dae61 )