NAME
HTTP::Parser::XS - a fast, primitive HTTP request parser
SYNOPSIS
use HTTP::Parser::XS qw(parse_http_request);# for HTTP serversmy $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 clientsuse 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,-1for incomplete headers, or-2for 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.
1for HTTP/1.1,0for HTTP/1.0.
- $status
-
The HTTP status of the given response. e.g.
200for 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.