h1_message (h1 v0.2.0)

View Source

HTTP/1.1 message encoder.

Builds iolists suitable for direct use with gen_tcp:send / ssl:send. Covers: request line, status line, header block, chunked body frames, trailer block. Also helpers for Content-Length / Transfer-Encoding auto-selection.

Based on livery_resp.erl (enki-multimedia) with additions for client-side request building.

Summary

Types

headers/0

-type headers() :: [{binary(), iodata()}].

version/0

-type version() :: {non_neg_integer(), non_neg_integer()}.

Functions

choose_framing(Body, Headers)

-spec choose_framing(iodata() | chunked | no_body, headers()) ->
                        {content_length, non_neg_integer(), headers()} |
                        {chunked, headers()} |
                        {no_body, headers()}.

Decide how to frame an outgoing message body.

Returns {content_length, N, Headers} when Content-Length will be used (body is a fully-known binary/iodata), {chunked, Headers} when caller opted into streaming, or {no_body, Headers} for bodyless messages.

encode(Head, Headers, Body)

-spec encode(iodata(), headers(), iodata()) -> iodata().

Assemble a message from a head line, headers and body. Adds Content-Length when missing and body is not chunked.

encode(Head, Headers, Body, Opts)

-spec encode(iodata(), headers(), iodata(), map()) -> iodata().

encode_chunk(Data)

-spec encode_chunk(iodata()) -> iodata().

encode_last_chunk()

-spec encode_last_chunk() -> binary().

encode_last_chunk(Trailers)

-spec encode_last_chunk(headers()) -> iodata().

encode_request(Method, Path, Headers)

-spec encode_request(binary(), binary(), headers()) -> iodata().

Build a full request: request line + headers + body.

encode_request(Method, Path, Headers, Body)

-spec encode_request(binary(), binary(), headers(), iodata()) -> iodata().

encode_response(Status, Headers, Body)

-spec encode_response(non_neg_integer(), headers(), iodata()) -> iodata().

Build a full response: status line + headers + body. Auto-adds Content-Length when the body is fully known.

encode_response(Status, Headers, Body, Version)

-spec encode_response(non_neg_integer(), headers(), iodata(), version()) -> iodata().

headers(Headers)

-spec headers(headers()) -> iodata().

is_valid_header_name(Bin)

-spec is_valid_header_name(iodata()) -> boolean().

is_valid_header_value(Bin)

-spec is_valid_header_value(iodata()) -> boolean().

is_valid_reason_phrase(Bin)

-spec is_valid_reason_phrase(iodata()) -> boolean().

is_valid_request_target(Bin)

-spec is_valid_request_target(iodata()) -> boolean().

is_valid_token(Bin)

-spec is_valid_token(iodata()) -> boolean().

request_line(Method, Path, Version)

-spec request_line(binary(), binary(), version()) -> iodata().

request_line(Method, Path, Qs, Version)

-spec request_line(binary(), binary(), binary(), version()) -> iodata().

status_line(Status, Version)

-spec status_line(non_neg_integer(), version()) -> iodata().

status_line(Status, Reason, Version)

-spec status_line(non_neg_integer(), binary(), version()) -> iodata().

status_text(_)

-spec status_text(non_neg_integer()) -> binary().