nhttp_int (nhttp_lib v1.0.0)

View Source

Prefixed integer codec for HPACK and QPACK.

Implements the variable-length integer encoding defined in RFC 7541 Section 5.1 (HPACK) and RFC 9204 Section 4.1.1 (QPACK). Both protocols use the same encoding scheme with different prefix sizes.

A prefixed integer uses N bits of the first byte (the prefix). When the value fits in those N bits, encoding is a single byte. Larger values set all N prefix bits to 1 and encode the remainder in subsequent bytes using a 7-bit-per-byte continuation scheme.

This module provides per-prefix-size encode and decode functions for prefix sizes 3 through 8 bits.

Summary

Functions

Decode a 3-bit prefixed integer.

Decode a 4-bit prefixed integer.

Decode a 5-bit prefixed integer.

Decode a 6-bit prefixed integer.

Decode a 7-bit prefixed integer.

Decode an 8-bit prefixed integer (full byte prefix, no upper bits).

Encode a 3-bit prefixed integer. Prefix occupies the upper 5 bits.

Encode a 4-bit prefixed integer. Prefix occupies the upper 4 bits.

Encode a 5-bit prefixed integer. Prefix occupies the upper 3 bits.

Encode a 6-bit prefixed integer. Prefix occupies the upper 2 bits.

Encode a 7-bit prefixed integer. Prefix occupies the upper 1 bit.

Encode an 8-bit prefixed integer (full byte prefix, no upper bits).

Types

decode_error()

-type decode_error() :: incomplete | overflow.

Functions

dec3/1

-spec dec3(bitstring()) -> {ok, non_neg_integer(), bitstring()} | {error, decode_error()}.

Decode a 3-bit prefixed integer.

dec4/1

-spec dec4(bitstring()) -> {ok, non_neg_integer(), bitstring()} | {error, decode_error()}.

Decode a 4-bit prefixed integer.

dec5/1

-spec dec5(bitstring()) -> {ok, non_neg_integer(), bitstring()} | {error, decode_error()}.

Decode a 5-bit prefixed integer.

dec6/1

-spec dec6(bitstring()) -> {ok, non_neg_integer(), bitstring()} | {error, decode_error()}.

Decode a 6-bit prefixed integer.

dec7/1

-spec dec7(bitstring()) -> {ok, non_neg_integer(), bitstring()} | {error, decode_error()}.

Decode a 7-bit prefixed integer.

dec8/1

-spec dec8(bitstring()) -> {ok, non_neg_integer(), bitstring()} | {error, decode_error()}.

Decode an 8-bit prefixed integer (full byte prefix, no upper bits).

enc3/2

-spec enc3(non_neg_integer(), 0..31) -> binary().

Encode a 3-bit prefixed integer. Prefix occupies the upper 5 bits.

enc4/2

-spec enc4(non_neg_integer(), 0..15) -> binary().

Encode a 4-bit prefixed integer. Prefix occupies the upper 4 bits.

enc5/2

-spec enc5(non_neg_integer(), 0..7) -> binary().

Encode a 5-bit prefixed integer. Prefix occupies the upper 3 bits.

enc6/2

-spec enc6(non_neg_integer(), 0..3) -> binary().

Encode a 6-bit prefixed integer. Prefix occupies the upper 2 bits.

enc7/2

-spec enc7(non_neg_integer(), 0..1) -> binary().

Encode a 7-bit prefixed integer. Prefix occupies the upper 1 bit.

enc8/1

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

Encode an 8-bit prefixed integer (full byte prefix, no upper bits).