h3 only.Expand description
QPACK decoder (RFC 9204 Sections 2.2, 4.3 and 4.5).
Consumption: the HTTP/3 layer drives the decoder per connection (it feeds
encoder stream data and decoded field sections, and drains the decoder
stream); until that lands, the whole module is dead in non-test builds,
which is why dead_code is expected here. It errors again once the
decoder is used, reminding us to remove the expectation.
The decoder materializes the shared dynamic table (Section 4.2) from the encoder stream (Section 4.3): every instruction is parsed and mirrored as a table insertion or capacity change. Field sections (Section 4.5) are decoded against the table; a section whose Required Insert Count exceeds the decoder’s insert count is buffered as blocked (Section 2.2.1) until a later encoder stream update makes it decodable.
The decoder emits decoder stream instructions (Section 4.4): a Section Acknowledgment for every decoded field section with a positive Required Insert Count (Section 2.2.2.1), a Stream Cancellation for abandoned or timed-out blocked streams (Section 2.2.2.2), and coalesced Insert Count Increment instructions (Section 2.2.2.3).
Validation is strict: malformed instructions are QPACK_ENCODER_STREAM_ ERROR, malformed field sections are QPACK_DECOMPRESSION_FAILED, a
Required Insert Count that does not equal the largest referenced absolute
index plus one is rejected (Sections 2.1.2 and 2.2.1), evictions that
touch entries with an absolute index at or above the Known Received Count
are rejected (Sections 2.1.1 and 3.2.2), and field sections that push a
stream’s cumulative decoded size over the advertised
SETTINGS_MAX_FIELD_SECTION_SIZE are rejected (RFC 9114 Section
7.2.4.1).
Structs§
- Decoder
- QPACK decoder: dynamic table mirror and field section decoder.
- Unblocked
Section - A field section that was buffered as blocked and has since been decoded after an encoder stream update.