Blame lib/Net/HTTP/NB.pm

Packit 03f954
package Net::HTTP::NB;
Packit 03f954
$Net::HTTP::NB::VERSION = '6.17';
Packit 03f954
use strict;
Packit 03f954
use warnings;
Packit 03f954
Packit 03f954
use base 'Net::HTTP';
Packit 03f954
Packit 03f954
sub can_read {
Packit 03f954
    return 1;
Packit 03f954
}
Packit 03f954
Packit 03f954
sub sysread {
Packit 03f954
    my $self = $_[0];
Packit 03f954
    if (${*$self}{'httpnb_read_count'}++) {
Packit 03f954
	${*$self}{'http_buf'} = ${*$self}{'httpnb_save'};
Packit 03f954
	die "Multi-read\n";
Packit 03f954
    }
Packit 03f954
    my $buf;
Packit 03f954
    my $offset = $_[3] || 0;
Packit 03f954
    my $n = sysread($self, $_[1], $_[2], $offset);
Packit 03f954
    ${*$self}{'httpnb_save'} .= substr($_[1], $offset);
Packit 03f954
    return $n;
Packit 03f954
}
Packit 03f954
Packit 03f954
sub read_response_headers {
Packit 03f954
    my $self = shift;
Packit 03f954
    ${*$self}{'httpnb_read_count'} = 0;
Packit 03f954
    ${*$self}{'httpnb_save'} = ${*$self}{'http_buf'};
Packit 03f954
    my @h = eval { $self->SUPER::read_response_headers(@_) };
Packit 03f954
    if ($@) {
Packit 03f954
	return if $@ eq "Multi-read\n";
Packit 03f954
	die;
Packit 03f954
    }
Packit 03f954
    return @h;
Packit 03f954
}
Packit 03f954
Packit 03f954
sub read_entity_body {
Packit 03f954
    my $self = shift;
Packit 03f954
    ${*$self}{'httpnb_read_count'} = 0;
Packit 03f954
    ${*$self}{'httpnb_save'} = ${*$self}{'http_buf'};
Packit 03f954
    # XXX I'm not so sure this does the correct thing in case of
Packit 03f954
    # transfer-encoding transforms
Packit 03f954
    my $n = eval { $self->SUPER::read_entity_body(@_); };
Packit 03f954
    if ($@) {
Packit 03f954
	$_[0] = "";
Packit 03f954
	return -1;
Packit 03f954
    }
Packit 03f954
    return $n;
Packit 03f954
}
Packit 03f954
Packit 03f954
1;
Packit 03f954
Packit 03f954
=pod
Packit 03f954
Packit 03f954
=encoding UTF-8
Packit 03f954
Packit 03f954
=head1 NAME
Packit 03f954
Packit 03f954
Net::HTTP::NB - Non-blocking HTTP client
Packit 03f954
Packit 03f954
=head1 VERSION
Packit 03f954
Packit 03f954
version 6.17
Packit 03f954
Packit 03f954
=head1 SYNOPSIS
Packit 03f954
Packit 03f954
 use Net::HTTP::NB;
Packit 03f954
 my $s = Net::HTTP::NB->new(Host => "www.perl.com") || die $@;
Packit 03f954
 $s->write_request(GET => "/");
Packit 03f954
Packit 03f954
 use IO::Select;
Packit 03f954
 my $sel = IO::Select->new($s);
Packit 03f954
Packit 03f954
 READ_HEADER: {
Packit 03f954
    die "Header timeout" unless $sel->can_read(10);
Packit 03f954
    my($code, $mess, %h) = $s->read_response_headers;
Packit 03f954
    redo READ_HEADER unless $code;
Packit 03f954
 }
Packit 03f954
Packit 03f954
 while (1) {
Packit 03f954
    die "Body timeout" unless $sel->can_read(10);
Packit 03f954
    my $buf;
Packit 03f954
    my $n = $s->read_entity_body($buf, 1024);
Packit 03f954
    last unless $n;
Packit 03f954
    print $buf;
Packit 03f954
 }
Packit 03f954
Packit 03f954
=head1 DESCRIPTION
Packit 03f954
Packit 03f954
Same interface as C<Net::HTTP> but it will never try multiple reads
Packit 03f954
when the read_response_headers() or read_entity_body() methods are
Packit 03f954
invoked.  This make it possible to multiplex multiple Net::HTTP::NB
Packit 03f954
using select without risk blocking.
Packit 03f954
Packit 03f954
If read_response_headers() did not see enough data to complete the
Packit 03f954
headers an empty list is returned.
Packit 03f954
Packit 03f954
If read_entity_body() did not see new entity data in its read
Packit 03f954
the value -1 is returned.
Packit 03f954
Packit 03f954
=head1 SEE ALSO
Packit 03f954
Packit 03f954
L<Net::HTTP>
Packit 03f954
Packit 03f954
=head1 AUTHOR
Packit 03f954
Packit 03f954
Gisle Aas <gisle@activestate.com>
Packit 03f954
Packit 03f954
=head1 COPYRIGHT AND LICENSE
Packit 03f954
Packit 03f954
This software is copyright (c) 2001-2017 by Gisle Aas.
Packit 03f954
Packit 03f954
This is free software; you can redistribute it and/or modify it under
Packit 03f954
the same terms as the Perl 5 programming language system itself.
Packit 03f954
Packit 03f954
=cut
Packit 03f954
Packit 03f954
__END__
Packit 03f954
Packit 03f954
#ABSTRACT: Non-blocking HTTP client
Packit 03f954