NAME
HTTP::Parser::XS - a fast, primitive HTTP request parser
SYNOPSIS
use HTTP::Parser::XS qw(parse_http_request);
# for HTTP servers
my $ret = parse_http_request(
"GET / HTTP/1.0\r\nHost: ...\r\n\r\n",
\%env,
);
if ($ret == -2) {
# request is incomplete
...
} elsif ($ret == -1) {
# request is broken
...
} else {
# $ret includes the size of the request, %env now contains a PSGI
# request, if it is a POST / PUT request, read request content by
# yourself
...
}
# for HTTP clients
use HTTP::Parser::XS qw(parse_http_response HEADERS_AS_ARRAYREF);
my %special_headers = (
'content-length' => undef,
);
my($ret, $minor_version, $status, $message, $headers)
= parse_http_response($response, HEADERS_AS_ARRAYREF, \%special_headers);
if($ret == -1) }
# response is incomplete
}
elsif($ret == -2) {
# response is broken
}
else {
# $ret is the length of the headers, starting the content body
# the other values are the response messages. For example:
# $status = 200
# $message = "OK"
# $headers = [ 'content-type' => 'text/html', ... ]
# and $special_headers{'content-length'} will be filled in
}
DESCRIPTION
HTTP::Parser::XS is a fast, primitive HTTP request/response parser.
The request parser can be used either for writing a synchronous HTTP
server or a event-driven server.
The response parser can be used for writing HTTP clients.
Note that even if this distribution name ends "::XS", pure Perl
implementation is supported, so you can use this module on compiler-less
environments.
FUNCTIONS
parse_http_request($request_string, \%env)
Tries to parse given request string, and if successful, inserts
variables into %env. For the name of the variables inserted, please
refer to the PSGI specification. The return values are:
>=0 length of the request (request line and the request
headers), in bytes
-1 given request is corrupt
-2 given request is incomplete
Note that the semantics of PATH_INFO is somewhat different from
Apache. First, HTTP::Parser::XS does not validate the variable; it
does not raise an error even if PATH_INFO does not start with "/".
Second, the variable is conformant to RFC 3875 (and PSGI / Plack) in
the fact that "//" and ".." appearing in PATH_INFO are preserved
whereas Apache transcodes them.
parse_http_response($response_string, $header_format, \%special_headers)
Tries to parse given response string. *$header_format* must be
"HEADERS_AS_ARRAYREF", "HEADERS_AS_HASHREF", or "HEADERS_NONE",
which are exportable constants.
The optional *%special_headers* is for headers you specifically
require. You can set any HTTP response header names, which must be
lower-cased, and their default values, and then the values are
filled in by "parse_http_response()". For example, if you want the
"Cointent-Length" field, set its name with default values like "%h =
('content-length' => undef)" and pass it as *%special_headers*.
After parsing, $h{'content-length'} is set if the response has the
"Content-Length" field, otherwise it's not touched.
The return values are:
$ret The parsering status, which is the same as
"parse_http_response()". i.e. the length of the response
headers in bytes, -1 for incomplete headers, or -2 for
errors.
If the given response string is broken or imcomplete,
"parse_http_response()" returns only this value.
$minor_version
The minor version of the given response. i.e. 1 for
HTTP/1.1, 0 for HTTP/1.0.
$status The HTTP status of the given response. e.g. 200 for success.
$message
The HTTP status message. e.g. "OK" for success.
$headers
The HTTP headers for the given response. It is an ARRAY
reference if *$header_format* is "HEADERS_AS_ARRAYREF", a
HASH reference on "HEADERS_AS_HASHREF", an "undef" on
"HEADERS_NONE".
The names of the headers are normalized to lower-cased.
LIMITATIONS
Both "parse_http_request()" and "parse_http_response()" in XS
implementation have some size limitations.
The number of headers
The number of headers is limited to 128. If it exceeds, both parsing
routines report parsing errors, i.e. return -1 for $ret.
The size of header names
The size of header names is limited to 1024, but the parsers do not the
same action.
"parse_http_request()" returns -1 if too-long header names exist.
"parse_http_request()" simply ignores too-long header names.
COPYRIGHT
Copyright 2009- Kazuho Oku
AUTHORS
* Kazuho Oku <https://metacpan.org/author/KAZUHO>
* gfx <https://metacpan.org/author/GFUJI>
* mala <https://metacpan.org/author/MALA>
* tokuhirom <https://metacpan.org/author/TOKUHIROM>
THANKS TO
* nothingmuch <https://metacpan.org/author/NUFFIN>
* charsbar <https://metacpan.org/author/CHARSBAR>
* DOLMEN <https://metacpan.org/author/DOLMEN>
SEE ALSO
* <http://github.com/kazuho/picohttpparser>
* HTTP::Parser
* HTTP::HeaderParser::XS
* Plack
* PSGI
LICENSE
This library is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.