The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

HTTP::Parser - parse HTTP/1.1 request into HTTP::Request object

SYNOPSIS

my $parser = HTTP::Parser->new();

...

my $status = $parser->add($text);

if(0 == $status) {
  print "request: ".$parser->request()->as_string();  # HTTP::Request
} elsif(-2 == $status) {
  print "need a line of data\n";
} elsif(-1 == $status) {
  print "need more data\n";
} else {  # $status > 0
  print "need $status byte(s)\n";
}

DESCRIPTION

This is an HTTP request parser. It takes chunks of text as received and returns a 'hint' as to what is required, or returns the HTTP::Request when a complete request has been read. HTTP/1.1 chunking is supported. It dies if it finds an error.

new

Create a new HTTP::Parser object.

add ( string )

Parse request. Returns:

0

if finished (call request() to get an HTTP::Request object)

-1

if not finished but not sure how many bytes remain

-2

if waiting for a line (like 0 with a hint)

count

if waiting for that many bytes

Dies on error.

This method of parsing makes it easier to parse a request from an event-based system, on the other hand, it's quite alright to pass in the whole request. Ideally, the first chunk passed in is the header (up to the double newline), then whatever byte counts are requested.

When a request object is returned, the X-HTTP-Version header has the HTTP version, the uri() method will always return a URI object, not a string.

Note that a nonzero return is just a hint, and any amount of data can be passed in to a subsequent add() call.

data

Returns current data not parsed. Mainly useful after a request has been parsed. The data is not removed from the object's buffer, and will be seen before the data next passed to add().

extra

Returns the count of extra bytes (length of data()) after a request.

request

Returns the current request. Only useful after a request has been parsed.

AUTHOR

David Robins <dbrobins@davidrobins.net>

SEE ALSO

HTTP::Request.