NAME

Protocol::HTTP - very fast HTTP protocol incremental parser and serializer

SYNOPSIS

use Protocol::HTTP;

# client api - make request
my $request = Protocol::HTTP::Request->new({
    uri     => "http://crazypanda.ru/hello/world",
    headers => {MyHeader => "my value"},
    cookies => {coo1 => "val1", coo2 => "val2"},
    body    => "my body",
});

my $req_str = $request->to_string; # => like qr|GET /hello/world HTTP/1.1|

# server api - parse request
my ($state, $position, $error);
my $req_parser = Protocol::HTTP::RequestParser->new;
($request, $state, $position, $error) = $req_parser->parse($req_str);

if ($state == Protocol::HTTP::Message::STATE_DONE) {
    say $request->uri;
    say $request->method;
    say $request->body;
}

# server api - make response
my $response = Protocol::HTTP::Response->new({
    code    => 200,
    headers => {Lang => 'Perl'},
    body    => "Lorem ipsum dolor",
});

my $res_str = $response->to_string($request);

# client api - parse response
my $res_parser = Protocol::HTTP::ResponseParser->new;
$res_parser->set_context_request($request);
($response, $state, $position, $error) = $res_parser->parse($res_str);
say $response->code;
say $response->status;
say $response->body;


# compression with chunks

use Protocol::HTTP::Request 'METHOD_POST';

$request = Protocol::HTTP::Request->new({
    method   => METHOD_POST,
    uri      => "https://images.example.com/upload",
    chunked  => 1,
    compress => Protocol::HTTP::Compression::gzip,
});
say $request->to_string;                    # only http headers
say $request->make_chunk('hello-world');    # outputs first chunk
say $request->final_chunk();                # outputs final chunk

DESCRIPTION

The Protocol::HTTP is a port of panda::protocol::http library, an RFC-compiant very fast HTTP protocol implementation, written in C++ with XS-adapters in perl. The module has dual Perl/C++ interface (see XS::Manifesto) so futher XS-bindings can be written on the top of Protocol::HTTP.

The following features are supported in the Protocol::HTTP: cookies, transparent (un)compression with Gzip or Brotli, transparent chunked transfer encoding for body streaming, respecting request's preferences when making response.

The module is a protocol implementation, by itself it does not perform any I/O activity.

Currenly supported HTTP versions are 1.0 and 1.1

REFERENCE

Protocol::HTTP::Request

Protocol::HTTP::Response

Protocol::HTTP::Message

Protocol::HTTP::RequestParser

Protocol::HTTP::ResponseParser

Protocol::HTTP::Compression

Protocol::HTTP::errc

CONSTANTS

error_category

The error category that all of Protocol::HTTP::errc errors have.

SEE ALSO

Protocol::HTTP::Compression::Brotli

URI::XS

Protocol::WebSocket::XS

rfc2616 (http 1.1)

rfc6265 (HTTP State Management Mechanism)

rfc7932 (brotli compression)

rfc1952 (gzip compression)

AUTHOR

Pronin Oleg <syber@cpan.org>

Ivan Baidakou <dmol@cpan.org>

Grigory Smorkalov <g.smorkalov@crazypanda.ru>

Andrew Selivanov <andrew.selivanov@gmail.com>

Crazy Panda LTD

LICENSE

You may distribute this code under the same terms as Perl itself.