View Source hackney_http (hackney v1.23.0)
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 tohackney_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 givenparser()
withhackney_http:execute/1
.{headers_complete, parser()}
: when all headers have been parsed. To continue the parsing you must call the givenparser()
state withhackney_http:execute/1
.{more, parser(), binary()}
: on body, when the parser need more data. The new data should be passed tohackney_http:execute/2
(withparser()
) 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 callhackney_http:execute/1
with the givenparser()
.{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 happen
Summary
Functions
Execute the parser with the current buffer.
Execute the parser with the new buffer
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.
Create a new HTTP parser. The parser will autodetect if the parded binary is a response or a request.
create a new HTTP parser with options. By default the type of parsed binary will be detected.
Types
-type http_method() :: binary().
-type http_reason() :: binary().
-type parser() :: #hparser{type :: atom(), max_line_length :: integer(), max_empty_lines :: integer(), empty_lines :: integer(), state :: atom(), buffer :: binary(), version :: {integer(), integer()} | undefined, method :: binary(), partial_headers :: list(), clen :: integer() | undefined | bad_int, te :: binary(), connection :: binary(), ctype :: binary(), location :: binary(), body_state :: atom() | tuple()}.
-type parser_options() :: [parser_option()].
-type parser_result() :: {response, http_version(), status(), http_reason(), parser()} | {request, http_method(), uri(), http_version(), parser()} | {more, parser()} | header_result() | body_result() | {error, term()}.
-type status() :: integer().
-type uri() :: binary().
Functions
-spec execute(#hparser{type :: atom(), max_line_length :: integer(), max_empty_lines :: integer(), empty_lines :: integer(), state :: atom(), buffer :: binary(), version :: {integer(), integer()} | undefined, method :: binary(), partial_headers :: list(), clen :: integer() | undefined | bad_int, te :: binary(), connection :: binary(), ctype :: binary(), location :: binary(), body_state :: atom() | tuple()}) -> parser_result().
-spec execute(#hparser{type :: atom(), max_line_length :: integer(), max_empty_lines :: integer(), empty_lines :: integer(), state :: atom(), buffer :: binary(), version :: {integer(), integer()} | undefined, method :: binary(), partial_headers :: list(), clen :: integer() | undefined | bad_int, te :: binary(), connection :: binary(), ctype :: binary(), location :: binary(), body_state :: atom() | tuple()}, binary()) -> parser_result().
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.
-spec parser() -> parser().
-spec parser(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 happen