h2_frame (h2 v0.6.0)

View Source

HTTP/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 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 HEADERS frame with end headers flag.

Create a PING frame.

Create a PING ACK frame.

Create a RST_STREAM frame.

Create a SETTINGS frame.

Create a SETTINGS ACK frame.

Create a WINDOW_UPDATE frame.

Types

frame/0

-type frame() ::
          #h2_frame{length :: non_neg_integer(),
                    type :: 0..255,
                    flags :: 0..255,
                    stream_id :: non_neg_integer(),
                    payload :: binary()} |
          frame_data().

frame_data/0

-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()}.

frame_type/0

-type frame_type() ::
          data | headers | priority | rst_stream | settings | push_promise | ping | goaway |
          window_update | continuation |
          {unknown, 0..255}.

Functions

continuation(StreamId, HeaderBlock, EndHeaders)

-spec continuation(non_neg_integer(), binary(), boolean()) -> frame_data().

Create a CONTINUATION frame.

data(StreamId, Data, EndStream)

-spec data(non_neg_integer(), binary(), boolean()) -> frame_data().

Create a DATA frame.

data(StreamId, Data, EndStream, Padding)

-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.

decode(Bin)

-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}

decode(Bin, MaxFrameSize)

-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).

decode_header(Bin)

-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).

encode(H2_frame)

-spec encode(frame() | frame_data()) -> binary().

Encode a frame to binary.

goaway(LastStreamId, ErrorCode, DebugData)

-spec goaway(non_neg_integer(), non_neg_integer() | atom(), binary()) -> frame_data().

Create a GOAWAY frame.

headers(StreamId, HeaderBlock, EndStream)

-spec headers(non_neg_integer(), binary(), boolean()) -> frame_data().

Create a HEADERS frame.

headers(StreamId, HeaderBlock, EndStream, EndHeaders)

-spec headers(non_neg_integer(), binary(), boolean(), boolean()) -> frame_data().

Create a HEADERS frame with end headers flag.

headers(StreamId, HeaderBlock, EndStream, EndHeaders, Priority)

-spec headers(non_neg_integer(), binary(), boolean(), boolean(), {boolean(), non_neg_integer(), 1..256}) ->
                 frame_data().

Create a HEADERS frame with priority.

ping(Data)

-spec ping(binary()) -> frame_data().

Create a PING frame.

ping_ack(Data)

-spec ping_ack(binary()) -> frame_data().

Create a PING ACK frame.

priority(StreamId, Exclusive, DependsOn, Weight)

-spec priority(non_neg_integer(), boolean(), non_neg_integer(), 1..256) -> frame_data().

Create a PRIORITY frame.

push_promise(StreamId, PromisedId, HeaderBlock, EndHeaders)

-spec push_promise(non_neg_integer(), non_neg_integer(), binary(), boolean()) -> frame_data().

Create a PUSH_PROMISE frame.

rst_stream(StreamId, ErrorCode)

-spec rst_stream(non_neg_integer(), non_neg_integer() | atom()) -> frame_data().

Create a RST_STREAM frame.

settings(Settings)

-spec settings([{atom() | non_neg_integer(), non_neg_integer()}]) -> frame_data().

Create a SETTINGS frame.

settings_ack()

-spec settings_ack() -> frame_data().

Create a SETTINGS ACK frame.

window_update(StreamId, Increment)

-spec window_update(non_neg_integer(), pos_integer()) -> frame_data().

Create a WINDOW_UPDATE frame.