use strict; use warnings; use Protocol::HTTP2::Client; use IO::Socket::SSL; use IO::Select; my $host = 'example.com'; my $port = 443; # POST request my $h2_client = Protocol::HTTP2::Client->new->request( # HTTP/2-headers ':method' => 'POST', ':path' => '/api/datas', ':scheme' => 'https', ':authority' => $host . ':' . $port, # HTTP-headers headers => [ 'user-agent' => 'Protocol::HTTP2', 'content-type' => 'application/json' ], # do something useful with data on_done => sub { my ( $headers, $data ) = @_; }, # POST body data => '{ "data" : "test" }', ); # TLS transport socket my $client = IO::Socket::SSL->new( PeerHost => $host, PeerPort => $port, # openssl 1.0.1 support only NPN SSL_npn_protocols => ['h2'], # openssl 1.0.2 also have ALPN #SSL_alpn_protocols => ['h2'], ) or die $!; # non blocking $client->blocking(0); my $sel = IO::Select->new($client); # send/recv frames until request is done while ( !$h2_client->shutdown ) { $sel->can_write; while ( my $frame = $h2_client->next_frame ) { syswrite $client, $frame; } $sel->can_read; while ( sysread $client, my $data, 4096 ) { $h2_client->feed($data); } }