16bool h3_frame_parse(
const uint8_t *buf,
size_t len, H3Frame *out)
22 if (!quic_varint_decode(buf, len, &type, &c1))
24 if (!quic_varint_decode(buf + c1, len - c1, &length, &c2))
28 out->header_len = c1 + c2;
32size_t h3_frame_write_header(uint8_t *out,
size_t cap, uint64_t type, uint64_t length)
34 size_t n = quic_varint_encode(out, cap, type);
37 size_t m = quic_varint_encode(out + n, cap - n, length);
43bool h3_frame_type_reserved(uint64_t type)
46 return type == 0x02 || type == 0x06 || type == 0x08 || type == 0x09;
49void h3_settings_defaults(H3Settings *s)
51 s->qpack_max_table_capacity = 0;
52 s->max_field_section_size = 0xFFFFFFFFFFFFFFFFULL;
53 s->qpack_blocked_streams = 0;
56bool h3_parse_settings(
const uint8_t *payload,
size_t len, H3Settings *s)
65 if (!quic_varint_decode(payload + off, len - off, &
id, &c1))
68 if (!quic_varint_decode(payload + off, len - off, &val, &c2))
73 case H3Setting::H3_SETTINGS_QPACK_MAX_TABLE_CAPACITY:
74 s->qpack_max_table_capacity = val;
76 case H3Setting::H3_SETTINGS_MAX_FIELD_SECTION_SIZE:
77 s->max_field_section_size = val;
79 case H3Setting::H3_SETTINGS_QPACK_BLOCKED_STREAMS:
80 s->qpack_blocked_streams = val;
94size_t h3_build_data(uint8_t *out,
size_t cap,
const uint8_t *data,
size_t len)
96 size_t hn = h3_frame_write_header(out, cap, H3FrameType::H3_DATA, len);
97 if (!hn || hn + len > cap)
100 memcpy(out + hn, data, len);
104size_t h3_build_headers(uint8_t *out,
size_t cap,
const uint8_t *block,
size_t len)
106 size_t hn = h3_frame_write_header(out, cap, H3FrameType::H3_HEADERS, len);
107 if (!hn || hn + len > cap)
110 memcpy(out + hn, block, len);
114size_t h3_build_settings(uint8_t *out,
size_t cap,
const uint64_t *ids,
const uint64_t *vals,
size_t n)
117 for (
size_t i = 0; i < n; i++)
118 plen += quic_varint_len(ids[i]) + quic_varint_len(vals[i]);
119 size_t o = h3_frame_write_header(out, cap, H3FrameType::H3_SETTINGS, plen);
122 for (
size_t i = 0; i < n; i++)
124 size_t a = quic_varint_encode(out + o, cap - o, ids[i]);
128 size_t b = quic_varint_encode(out + o, cap - o, vals[i]);
136size_t h3_build_goaway(uint8_t *out,
size_t cap, uint64_t stream_id)
138 size_t plen = quic_varint_len(stream_id);
139 size_t o = h3_frame_write_header(out, cap, H3FrameType::H3_GOAWAY, plen);
142 size_t a = quic_varint_encode(out + o, cap - o, stream_id);
HTTP/3 framing (RFC 9114 sec 7) over QUIC varints.
QUIC variable-length integer coding (RFC 9000 sec 16).