Frames
The frames layer implements the HTTP/2 wire format per RFC 9113: encoding and decoding the 9-byte frame header, the 10 frame types (DATA, HEADERS, PRIORITY, RSTSTREAM, SETTINGS, PUSHPROMISE, PING, GOAWAY, WINDOW_UPDATE, CONTINUATION), and a small set of per-frame-type parser/constructor helpers. All of these are pure Base-Julia operations on Vector{UInt8} — no C library dependency.
Wire format constants
PureHTTP2.FRAME_HEADER_SIZE — Constant
Size of the HTTP/2 frame header in bytes, per RFC 9113 §4.1.
PureHTTP2.CONNECTION_PREFACE — Constant
HTTP/2 client connection preface bytes sent over cleartext (h2c) and TLS (h2) connections, per RFC 9113 §3.4.
PureHTTP2.DEFAULT_INITIAL_WINDOW_SIZE — Constant
Default value of the HTTP/2 INITIAL_WINDOW_SIZE setting (65535 bytes), per RFC 9113 §6.9.2.
PureHTTP2.DEFAULT_MAX_FRAME_SIZE — Constant
Default value of the HTTP/2 MAX_FRAME_SIZE setting (16384 bytes), per RFC 9113 §6.5.2.
PureHTTP2.MIN_MAX_FRAME_SIZE — Constant
Minimum value a peer may advertise for MAX_FRAME_SIZE (16384 bytes), per RFC 9113 §6.5.2.
PureHTTP2.MAX_MAX_FRAME_SIZE — Constant
Maximum value a peer may advertise for MAX_FRAME_SIZE (2^24 − 1 bytes), per RFC 9113 §6.5.2.
PureHTTP2.DEFAULT_HEADER_TABLE_SIZE — Constant
Default value of the HPACK HEADER_TABLE_SIZE setting (4096 bytes), per RFC 7541 §4.2.
Namespace submodules
RFC 9113's frame types, flags, settings parameters, and error codes are each exposed as a submodule so callers can write PureHTTP2.FrameType.DATA, PureHTTP2.FrameFlags.END_STREAM, etc.
PureHTTP2.FrameType — Module
FrameTypeHTTP/2 frame types per RFC 7540 Section 6.
Frame Types
DATA(0x0): Conveys payload dataHEADERS(0x1): Opens a stream and carries header blockPRIORITY(0x2): Specifies stream priorityRST_STREAM(0x3): Terminates a streamSETTINGS(0x4): Configuration parametersPUSH_PROMISE(0x5): Server push notificationPING(0x6): Connectivity check and RTT measurementGOAWAY(0x7): Connection shutdown notificationWINDOW_UPDATE(0x8): Flow control window adjustmentCONTINUATION(0x9): Header block continuation
PureHTTP2.FrameFlags — Module
FrameFlagsHTTP/2 frame flags per RFC 7540.
Common Flags
END_STREAM(0x1): Last frame for stream (DATA, HEADERS)END_HEADERS(0x4): End of header block (HEADERS, PUSH_PROMISE, CONTINUATION)PADDED(0x8): Frame is padded (DATA, HEADERS, PUSH_PROMISE)PRIORITY(0x20): Stream dependency info present (HEADERS)ACK(0x1): Settings/Ping acknowledgment (SETTINGS, PING)
PureHTTP2.ErrorCode — Module
ErrorCodeHTTP/2 error codes per RFC 7540 Section 7.
Error Codes
NO_ERROR(0x0): No errorPROTOCOL_ERROR(0x1): Protocol error detectedINTERNAL_ERROR(0x2): Internal errorFLOW_CONTROL_ERROR(0x3): Flow control violationSETTINGS_TIMEOUT(0x4): Settings not acknowledgedSTREAM_CLOSED(0x5): Frame received for closed streamFRAME_SIZE_ERROR(0x6): Invalid frame sizeREFUSED_STREAM(0x7): Stream refusedCANCEL(0x8): Stream cancelledCOMPRESSION_ERROR(0x9): HPACK errorCONNECT_ERROR(0xa): Connection errorENHANCE_YOUR_CALM(0xb): Excessive loadINADEQUATE_SECURITY(0xc): Underlying transport inadequateHTTP_1_1_REQUIRED(0xd): Use HTTP/1.1
PureHTTP2.SettingsParameter — Module
SettingsParameterHTTP/2 SETTINGS parameters per RFC 7540 Section 6.5.2.
Parameters
HEADER_TABLE_SIZE(0x1): HPACK dynamic table size (default: 4096)ENABLE_PUSH(0x2): Server push enabled (default: 1)MAX_CONCURRENT_STREAMS(0x3): Maximum concurrent streams (default: unlimited)INITIAL_WINDOW_SIZE(0x4): Initial flow control window (default: 65535)MAX_FRAME_SIZE(0x5): Maximum frame payload size (default: 16384)MAX_HEADER_LIST_SIZE(0x6): Maximum header list size (default: unlimited)
Frame header
PureHTTP2.FrameHeader — Type
FrameHeaderHTTP/2 frame header (9 bytes).
Fields
length::UInt32: Payload length (24 bits)frame_type::UInt8: Frame typeflags::UInt8: Frame-specific flagsstream_id::UInt32: Stream identifier (31 bits)
PureHTTP2.encode_frame_header — Function
encode_frame_header(header::FrameHeader) -> Vector{UInt8}Encode a frame header to bytes.
PureHTTP2.decode_frame_header — Function
decode_frame_header(bytes::AbstractVector{UInt8}) -> FrameHeaderDecode a frame header from bytes.
PureHTTP2.has_flag — Function
has_flag(header::FrameHeader, flag::UInt8) -> BoolCheck if a frame header has a specific flag set.
Generic frame
PureHTTP2.Frame — Type
FrameHTTP/2 frame consisting of header and payload.
Fields
header::FrameHeader: Frame headerpayload::Vector{UInt8}: Frame payload
PureHTTP2.encode_frame — Function
encode_frame(frame::Frame) -> Vector{UInt8}Encode a complete frame to bytes.
PureHTTP2.decode_frame — Function
decode_frame(bytes::AbstractVector{UInt8}) -> Tuple{Frame, Int}Decode a complete frame from bytes. Returns the frame and the number of bytes consumed.
Per-type constructors and parsers
These helpers build or parse specific frame types while enforcing the type's invariants (e.g., ping_frame rejects non-8-byte payloads).
PureHTTP2.data_frame — Function
data_frame(stream_id, data; end_stream=false, padded=false) -> FrameCreate a DATA frame.
PureHTTP2.headers_frame — Function
headers_frame(stream_id, header_block; end_stream=false, end_headers=true) -> FrameCreate a HEADERS frame.
PureHTTP2.continuation_frame — Function
continuation_frame(stream_id, header_block; end_headers=true) -> FrameCreate a CONTINUATION frame.
PureHTTP2.settings_frame — Function
settings_frame(settings; ack=false) -> FrameCreate a SETTINGS frame.
Arguments
settings::Vector{Tuple{UInt16, UInt32}}: List of (parameter, value) pairsack::Bool: Whether this is a SETTINGS acknowledgment
PureHTTP2.parse_settings_frame — Function
parse_settings_frame(frame::Frame) -> Vector{Tuple{UInt16, UInt32}}Parse settings from a SETTINGS frame payload.
PureHTTP2.ping_frame — Function
ping_frame(opaque_data; ack=false) -> FrameCreate a PING frame.
Arguments
opaque_data::Vector{UInt8}: 8 bytes of opaque dataack::Bool: Whether this is a PING acknowledgment
PureHTTP2.goaway_frame — Function
goaway_frame(last_stream_id, error_code, debug_data=UInt8[]) -> FrameCreate a GOAWAY frame.
PureHTTP2.parse_goaway_frame — Function
parse_goaway_frame(frame::Frame) -> Tuple{UInt32, UInt32, Vector{UInt8}}Parse a GOAWAY frame. Returns (laststreamid, errorcode, debugdata).
PureHTTP2.rst_stream_frame — Function
rst_stream_frame(stream_id, error_code) -> FrameCreate a RST_STREAM frame.
PureHTTP2.window_update_frame — Function
window_update_frame(stream_id, increment) -> FrameCreate a WINDOW_UPDATE frame.
Arguments
stream_id::Integer: Stream ID (0 for connection-level)increment::Integer: Window size increment (1 to 2^31-1)
PureHTTP2.parse_window_update_frame — Function
parse_window_update_frame(frame::Frame) -> UInt32Parse a WINDOW_UPDATE frame and return the increment.