NAME
Protocol::HTTP2::Client - HTTP/2 client
SYNOPSIS
# Create client object
my
$client
= Protocol::HTTP2::Client->new;
# Prepare first request
$client
->request(
# HTTP/2 headers
':scheme'
=>
'http'
,
':authority'
=>
'localhost:8000'
,
':path'
=>
'/'
,
':method'
=>
'GET'
,
# HTTP/1.1 headers
headers
=> [
'accept'
=>
'*/*'
,
'user-agent'
=>
'perl-Protocol-HTTP2/0.13'
,
],
# Callback when receive server's response
on_done
=>
sub
{
my
(
$headers
,
$data
) =
@_
;
...
},
);
# Protocol::HTTP2 is just HTTP/2 protocol decoder/encoder
# so you must create connection yourself
use
AnyEvent;
use
AnyEvent::Socket;
use
AnyEvent::Handle;
my
$w
= AnyEvent->condvar;
# Plain-text HTTP/2 connection
tcp_connect
'localhost'
, 8000,
sub
{
my
(
$fh
) =
@_
or
die
"connection failed: $!\n"
;
my
$handle
;
$handle
= AnyEvent::Handle->new(
fh
=>
$fh
,
autocork
=> 1,
on_error
=>
sub
{
$_
[0]->destroy;
"connection error\n"
;
$w
->
send
;
},
on_eof
=>
sub
{
$handle
->destroy;
$w
->
send
;
}
);
# First write preface to peer
while
(
my
$frame
=
$client
->next_frame ) {
$handle
->push_write(
$frame
);
}
# Receive servers frames
# Reply to server
$handle
->on_read(
sub
{
my
$handle
=
shift
;
$client
->feed(
$handle
->{rbuf} );
$handle
->{rbuf} =
undef
;
while
(
my
$frame
=
$client
->next_frame ) {
$handle
->push_write(
$frame
);
}
# Terminate connection if all done
$handle
->push_shutdown
if
$client
->
shutdown
;
}
);
};
$w
->
recv
;
DESCRIPTION
Protocol::HTTP2::Client is HTTP/2 client library. It's intended to make http2-client implementations on top of your favorite event-loop.
METHODS
new
Initialize new client object
my
$client
= Protocol::HTTP2::Client->new(
%options
);
Available options:
- on_push => sub {...}
-
If server send push promise this callback will be invoked
on_push
=>
sub
{
# received PUSH PROMISE headers
my
$pp_header
=
shift
;
...
# if we want reject this push
# return undef
# if we want to accept pushed resource
# return callback to receive data
return
sub
{
my
(
$headers
,
$data
) =
@_
;
...
}
},
- upgrade => 0|1
-
Use HTTP/1.1 Upgrade to upgrade protocol from HTTP/1.1 to HTTP/2. Upgrade possible only on plain (non-tls) connection. Default value is 0.
- keepalive => 0|1
-
Keep connection alive after requests. Default value is 0. Don't forget to explicitly call close method if set this to true.
- on_error => sub {...}
-
Callback invoked on protocol errors
on_error
=>
sub
{
my
$error
=
shift
;
...
},
- on_change_state => sub {...}
-
Callback invoked every time when http/2 streams change their state. See Stream States
on_change_state
=>
sub
{
my
(
$stream_id
,
$previous_state
,
$current_state
) =
@_
;
...
},
request
Prepare HTTP/2 request.
$client
->request(
# HTTP/2 headers
':scheme'
=>
'http'
,
':authority'
=>
'localhost:8000'
,
':path'
=>
'/items'
,
':method'
=>
'POST'
,
# HTTP/1.1 headers
headers
=> [
'content-type'
=>
'application/x-www-form-urlencoded'
,
'user-agent'
=>
'perl-Protocol-HTTP2/0.06'
,
],
# Callback when receive server's response
on_done
=>
sub
{
my
(
$headers
,
$data
) =
@_
;
...
},
# Callback when receive stream reset
on_error
=>
sub
{
my
$error_code
=
shift
;
},
# Body of POST request
data
=>
"hello=world&test=done"
,
);
You can chaining request one by one:
$client
->request( 1-st request )->request( 2-nd request );
Available callbacks:
- on_done => sub {...}
-
Invoked when full servers response is available
on_done
=>
sub
{
my
(
$headers
,
$data
) =
@_
;
...
},
- on_headers => sub {...}
-
Invoked as soon as headers have been successfully received from the server
on_headers
=>
sub
{
my
$headers
=
shift
;
...
# if we want reject any data
# return undef
# continue
return
1
}
- on_data => sub {...}
-
If specified all data will be passed to this callback instead if on_done. on_done will receive empty string.
on_data
=>
sub
{
my
(
$partial_data
,
$headers
) =
@_
;
...
# if we want cancel download
# return undef
# continue downloading
return
1
}
- on_error => sub {...}
-
Callback invoked on stream errors
on_error
=>
sub
{
my
$error
=
shift
;
...
}
keepalive
Keep connection alive after requests
my
$bool
=
$client
->keepalive;
$client
=
$client
->keepalive(
$bool
);
shutdown
Get connection status:
close
Explicitly close connection (send GOAWAY frame). This is required if client has keepalive option enabled.
next_frame
get next frame to send over connection to server. Returns:
# Example
while
(
my
$frame
=
$client
->next_frame ) {
syswrite
$fh
,
$frame
;
}
feed
Feed decoder with chunks of server's response
sysread
$fh
,
$binary_data
, 4096;
$client
->feed(
$binary_data
);
ping
Send ping frame to server (to keep connection alive)
$client
->ping
or
$client
->ping(
$payload
);
Payload can be arbitrary binary string and must contain 8 octets. If payload argument is omitted client will send random data.