h2_frame (h2 v0.6.0)
View SourceHTTP/2 Frame Encoding and Decoding (RFC 7540 Section 4)
All frames begin with a fixed 9-octet header followed by a payload of variable length:
+-----------------------------------------------+ | Length (24) | +---------------+---------------+---------------+ | Type (8) | Flags (8) | +-+-------------+---------------+-------------------------------+ |R| Stream Identifier (31) | +=+=============================================================+ | Frame Payload (0...) | +---------------------------------------------------------------+
Summary
Functions
Create a CONTINUATION frame.
Create a DATA frame.
Create a DATA frame with padding.
Decode binary to frame. Returns {ok, Frame, Rest} | {more, N} | {error, Reason}
Decode binary to frame, rejecting frames larger than MaxFrameSize with frame_size_error (RFC 7540 §4.2).
Decode just the frame header (for peeking).
Encode a frame to binary.
Create a GOAWAY frame.
Create a HEADERS frame.
Create a HEADERS frame with end headers flag.
Create a HEADERS frame with priority.
Create a PING frame.
Create a PING ACK frame.
Create a PRIORITY frame.
Create a PUSH_PROMISE frame.
Create a RST_STREAM frame.
Create a SETTINGS frame.
Create a SETTINGS ACK frame.
Create a WINDOW_UPDATE frame.
Types
-type frame() :: #h2_frame{length :: non_neg_integer(), type :: 0..255, flags :: 0..255, stream_id :: non_neg_integer(), payload :: binary()} | frame_data().
-type frame_data() :: {data, StreamId :: non_neg_integer(), Data :: binary(), EndStream :: boolean()} | {data, StreamId :: non_neg_integer(), Data :: binary(), EndStream :: boolean(), FlowControlled :: non_neg_integer()} | {headers, StreamId :: non_neg_integer(), HeaderBlock :: binary(), EndStream :: boolean(), EndHeaders :: boolean()} | {headers, StreamId :: non_neg_integer(), HeaderBlock :: binary(), EndStream :: boolean(), EndHeaders :: boolean(), Priority :: {Exclusive :: boolean(), DependsOn :: non_neg_integer(), Weight :: 1..256}} | {priority, StreamId :: non_neg_integer(), Exclusive :: boolean(), DependsOn :: non_neg_integer(), Weight :: 1..256} | {rst_stream, StreamId :: non_neg_integer(), ErrorCode :: non_neg_integer()} | {settings, Settings :: [{non_neg_integer(), non_neg_integer()}]} | {settings_ack} | {push_promise, StreamId :: non_neg_integer(), PromisedId :: non_neg_integer(), HeaderBlock :: binary(), EndHeaders :: boolean()} | {ping, Data :: binary()} | {ping_ack, Data :: binary()} | {goaway, LastStreamId :: non_neg_integer(), ErrorCode :: non_neg_integer(), DebugData :: binary()} | {window_update, StreamId :: non_neg_integer(), Increment :: pos_integer()} | {continuation, StreamId :: non_neg_integer(), HeaderBlock :: binary(), EndHeaders :: boolean()} | {unknown_frame, Type :: non_neg_integer(), Flags :: non_neg_integer(), StreamId :: non_neg_integer(), Payload :: binary()}.
-type frame_type() ::
data | headers | priority | rst_stream | settings | push_promise | ping | goaway |
window_update | continuation |
{unknown, 0..255}.
Functions
-spec continuation(non_neg_integer(), binary(), boolean()) -> frame_data().
Create a CONTINUATION frame.
-spec data(non_neg_integer(), binary(), boolean()) -> frame_data().
Create a DATA frame.
-spec data(non_neg_integer(), binary(), boolean(), binary()) -> #h2_frame{length :: non_neg_integer(), type :: 0..255, flags :: 0..255, stream_id :: non_neg_integer(), payload :: binary()}.
Create a DATA frame with padding.
-spec decode(binary()) -> {ok, frame_data(), binary()} | {more, non_neg_integer()} | {error, term()} | {error, {stream_error, non_neg_integer(), atom()}, binary()}.
Decode binary to frame. Returns {ok, Frame, Rest} | {more, N} | {error, Reason}
-spec decode(binary(), pos_integer() | infinity) -> {ok, frame_data(), binary()} | {more, non_neg_integer()} | {error, term()} | {error, {stream_error, non_neg_integer(), atom()}, binary()}.
Decode binary to frame, rejecting frames larger than MaxFrameSize with frame_size_error (RFC 7540 §4.2).
-spec decode_header(binary()) -> {ok, {non_neg_integer(), frame_type(), 0..255, non_neg_integer()}, binary()} | {more, non_neg_integer()}.
Decode just the frame header (for peeking).
-spec encode(frame() | frame_data()) -> binary().
Encode a frame to binary.
-spec goaway(non_neg_integer(), non_neg_integer() | atom(), binary()) -> frame_data().
Create a GOAWAY frame.
-spec headers(non_neg_integer(), binary(), boolean()) -> frame_data().
Create a HEADERS frame.
-spec headers(non_neg_integer(), binary(), boolean(), boolean()) -> frame_data().
Create a HEADERS frame with end headers flag.
-spec headers(non_neg_integer(), binary(), boolean(), boolean(), {boolean(), non_neg_integer(), 1..256}) -> frame_data().
Create a HEADERS frame with priority.
-spec ping(binary()) -> frame_data().
Create a PING frame.
-spec ping_ack(binary()) -> frame_data().
Create a PING ACK frame.
-spec priority(non_neg_integer(), boolean(), non_neg_integer(), 1..256) -> frame_data().
Create a PRIORITY frame.
-spec push_promise(non_neg_integer(), non_neg_integer(), binary(), boolean()) -> frame_data().
Create a PUSH_PROMISE frame.
-spec rst_stream(non_neg_integer(), non_neg_integer() | atom()) -> frame_data().
Create a RST_STREAM frame.
-spec settings([{atom() | non_neg_integer(), non_neg_integer()}]) -> frame_data().
Create a SETTINGS frame.
-spec settings_ack() -> frame_data().
Create a SETTINGS ACK frame.
-spec window_update(non_neg_integer(), pos_integer()) -> frame_data().
Create a WINDOW_UPDATE frame.