Net-HTTP2
view release on metacpan or search on metacpan
lib/Net/HTTP2/Client/Connection/Mojo.pm view on Meta::CPAN
package Net::HTTP2::Client::Connection::Mojo;
use strict;
use warnings;
=encoding utf-8
=head1 NAME
Net::HTTP2::Client::Connection::Mojo
=head1 SYNOPSIS
my $h2 = Net::HTTP2::Client::Connection::Mojo->new("perl.org");
$h2->request("GET", "/")->then(
sub ($resp) {
print $resp->content();
},
)->wait();
=head1 DESCRIPTION
This class extends L<Net::HTTP2::Client::Connection> to work with L<Mojolicious>.
=head1 PROMISES
This classâs returned promises are instances of L<Mojo::Promise> rather than
L<Promise::ES6>.
=cut
#----------------------------------------------------------------------
use parent 'Net::HTTP2::Client::Connection';
use Scalar::Util ();
use Mojo::IOLoop::Client ();
use Mojo::Promise ();
use Net::HTTP2::IOSocketSSL;
use constant _PROMISE_CLASS => 'Mojo::Promise';
# perl -I ../p5-X-Tiny/lib -MCarp::Always -MData::Dumper -I ../p5-Promise-ES6/lib -Ilib -MNet::HTTP2::Client::Connection::Mojo -e'my $h2 = Net::HTTP2::Client::Connection::Mojo->new("google.com"); $h2->request("GET", "/")->then( sub { print Dumper shi...
#$IO::Socket::SSL::DEBUG = 5;
#$Net::SSLeay::trace = 8;
use constant _INIT_OPTS => (
__PACKAGE__->SUPER::_INIT_OPTS(),
'reactor',
);
sub _parse_event_args {
my ($self, %opts) = @_;
return ( reactor => $opts{'reactor'} );
}
sub _start_io_if_needed {
my ($self, $host, $port, $h2) = @_;
$self->{'client'} ||= do {
my $stream_sr = \$self->{'stream'};
my $prebuf_sr = \$self->{'prebuf'};
my $reactor = $self->{'reactor'};
my $client = Mojo::IOLoop::Client->new();
$client->reactor($reactor) if $reactor;
Scalar::Util::weaken($h2);
my $weak_self = $self;
Scalar::Util::weaken($weak_self);
my $rejectors = $self->{'rejectors'} or die 'no rejectors';
$client->on( connect => sub {
$$stream_sr = Mojo::IOLoop::Stream->new(pop);
$$stream_sr->reactor($reactor) if $reactor;
$$stream_sr->start();
$$stream_sr->on( error => sub {
my ($stream, $err) = @_;
$weak_self->_on_stream_error($err);
} );
$$stream_sr->on( close => sub {
# At global destruction $weak_self might no longer exist.
#
$weak_self->_on_stream_close() if $weak_self;
} );
$$stream_sr->on( read => sub {
my ($stream) = @_;
$h2->feed(pop);
while ( my $frame = $h2->next_frame() ) {
$stream->write($frame);
}
} );
$$stream_sr->write($$prebuf_sr) if $$prebuf_sr;
( run in 2.284 seconds using v1.01-cache-2.11-cpan-5735350b133 )