HTTP parser in pure Erlang This parser is able to parse HTTP responses and requests in a streaming fashion. If not set it will be autodetect the type of binary parsed, if it's a request or a response.
Internally it is keeping a buffer for intermediary steps but don't keep any state in memory.
The first time you initialise a parser using hackney_http:parser/0
or hackney_http:parser/1 you will receive an opaque record You can
then process it using the function hackney_http:execute/2.
hackney_http:execute/2 when
{more, ...} is returnned or hackney_http:execute/1 in other
cases:
{response, http_version(), status(), http_reason(), parser()}:
when the first line of a response is parsed{request, http_version(), http_method(), uri(), parser()}:
when the first line of a request (on servers) is parsed{more, parser()}: when the parser need more
data. The new data should be passed to hackney_http:execute/2 with
the new parser() state received.{header, {Name :: binary(), Value :: binary()}, parser()}:
when an header has been parsed. To continue the parsing you must
call the given parser() with hackney_http:execute/1.{headers_complete, parser()} : when all headers have been parsed.
To continue the parsing you must call the given parser() state
with hackney_http:execute/1.{more, parser(), binary()}: on body, when
the parser need more data. The new data should be passed to
hackney_http:execute/2 (with parser() ) when received. The binary at the end of the
tuple correspond to the actual buffer of the parser. It may be used
for other purpose, like start to parse a new request on pipeline
connections, for a proxy...{ok, binary(), parser()}: on body, when a chunk has been
parsed. To continue the parsing you must call
hackney_http:execute/1 with the given parser().{done, binary()}: when the parsing is done. The binary
given correpond to the non parsed part of the internal buffer.{error, term{}}: when an error happenbody_result() = {more, parser(), binary()} | {ok, binary(), parser()} | {done, binary()} | done
header_result() = {headers_complete, parser()} | {header, {binary(), binary()}, parser()}
http_method() = binary()
http_reason() = binary()
http_version() = {integer(), integer()}
parser() = #hparser{}
parser_option() = request | response | auto | {max_empty_lines, integer()} | {max_line_length, integer()}
parser_options() = [parser_option()]
parser_result() = {response, http_version(), status(), http_reason(), parser()} | {request, http_method(), uri(), http_version(), parser()} | {more, parser()} | header_result() | body_result() | {error, term()}
status() = integer()
uri() = binary()
| execute/1 | Execute the parser with the current buffer. |
| execute/2 | Execute the parser with the new buffer. |
| get/2 | retrieve a parser property. |
| parse_response_version/2 | |
| parser/0 | Create a new HTTP parser. |
| parser/1 | create a new HTTP parser with options. |
execute(Hparser::#hparser{}) -> parser_result()
Execute the parser with the current buffer.
execute(Hparser::#hparser{}, Bin::binary()) -> parser_result()
Execute the parser with the new buffer
get(Parser::parser(), Props::atom() | [atom()]) -> any()
retrieve a parser property. Properties are:
buffer: internal buffer of the parser (non parsed)state: the current state (on_status, on_header, on_body, done)version: HTTP versioncontent_length: content length header if anytransfer_encoding: transfer encoding header if anycontent_type: content type header if anylocation: location header if anyconnection: connection header if any.parse_response_version(X1, St) -> any()
parser() -> parser()
Create a new HTTP parser. The parser will autodetect if the parded binary is a response or a request.
parser(Options::parser_options()) -> parser()
create a new HTTP parser with options. By default the type of parsed binary will be detected.
Available options:auto : autodetect if the binary parsed is a response or a
request (default).response: set the parser to parse a responserequest: set the parser to parse a request (server){max_line_lenght, Max}: set the maximum size of a line parsed
before we give up.{max_lines_empty, Max}: the maximum number of empty line we
accept before the first line happenGenerated by EDoc