16bool pc_h3_frame_parse(
const uint8_t *buf,
size_t len, H3Frame *out)
22 if (!pc_quic_varint_decode(buf, len, &type, &c1))
26 if (!pc_quic_varint_decode(buf + c1, len - c1, &length, &c2))
32 out->header_len = c1 + c2;
36size_t pc_h3_frame_write_header(uint8_t *out,
size_t cap, uint64_t type, uint64_t length)
38 size_t n = pc_quic_varint_encode(out, cap, type);
43 size_t m = pc_quic_varint_encode(out + n, cap - n, length);
51bool pc_h3_frame_type_reserved(uint64_t type)
54 return type == 0x02 || type == 0x06 || type == 0x08 || type == 0x09;
57void pc_h3_settings_defaults(H3Settings *s)
59 s->pc_qpack_max_table_capacity = 0;
60 s->max_field_section_size = 0xFFFFFFFFFFFFFFFFULL;
61 s->pc_qpack_blocked_streams = 0;
64bool pc_h3_parse_settings(
const uint8_t *payload,
size_t len, H3Settings *s)
73 if (!pc_quic_varint_decode(payload + off, len - off, &
id, &c1))
78 if (!pc_quic_varint_decode(payload + off, len - off, &val, &c2))
85 case H3Setting::H3_SETTINGS_QPACK_MAX_TABLE_CAPACITY:
86 s->pc_qpack_max_table_capacity = val;
88 case H3Setting::H3_SETTINGS_MAX_FIELD_SECTION_SIZE:
89 s->max_field_section_size = val;
91 case H3Setting::H3_SETTINGS_QPACK_BLOCKED_STREAMS:
92 s->pc_qpack_blocked_streams = val;
106size_t pc_h3_build_data(uint8_t *out,
size_t cap,
const uint8_t *data,
size_t len)
108 size_t hn = pc_h3_frame_write_header(out, cap, H3FrameType::H3_DATA, len);
109 if (!hn || hn + len > cap)
115 memcpy(out + hn, data, len);
120size_t pc_h3_build_headers(uint8_t *out,
size_t cap,
const uint8_t *block,
size_t len)
122 size_t hn = pc_h3_frame_write_header(out, cap, H3FrameType::H3_HEADERS, len);
123 if (!hn || hn + len > cap)
129 memcpy(out + hn, block, len);
134size_t pc_h3_build_settings(uint8_t *out,
size_t cap,
const uint64_t *ids,
const uint64_t *vals,
size_t n)
137 for (
size_t i = 0; i < n; i++)
139 plen += pc_quic_varint_len(ids[i]) + pc_quic_varint_len(vals[i]);
141 size_t o = pc_h3_frame_write_header(out, cap, H3FrameType::H3_SETTINGS, plen);
146 for (
size_t i = 0; i < n; i++)
148 size_t a = pc_quic_varint_encode(out + o, cap - o, ids[i]);
154 size_t b = pc_quic_varint_encode(out + o, cap - o, vals[i]);
164size_t pc_h3_build_goaway(uint8_t *out,
size_t cap, uint64_t stream_id)
166 size_t plen = pc_quic_varint_len(stream_id);
167 size_t o = pc_h3_frame_write_header(out, cap, H3FrameType::H3_GOAWAY, plen);
172 size_t a = pc_quic_varint_encode(out + o, cap - o, stream_id);