lsquic_hq.h revision a74702c6
1/* Copyright (c) 2017 - 2022 LiteSpeed Technologies Inc.  See LICENSE. */
2/*
3 * lsquic_hq.h -- HTTP/3 (originally "HTTP over QUIC" or HQ) types
4 */
5
6#ifndef LSQUIC_HQ_H
7#define LSQUIC_HQ_H 1
8
9struct lsquic_ext_http_prio;
10
11/* [draft-ietf-quic-http-27] Section 11.2.1 */
12enum hq_frame_type
13{
14    HQFT_DATA           = 0,
15    HQFT_HEADERS        = 1,
16    HQFT_CANCEL_PUSH    = 3,
17    HQFT_SETTINGS       = 4,
18    HQFT_PUSH_PROMISE   = 5,
19    HQFT_GOAWAY         = 7,
20    HQFT_MAX_PUSH_ID    = 0xD,
21    /* These made me expand shf_frame_type to 4 bytes from 1.  If at some
22     * point we have to support a frame that is wider than 4 byte, it will
23     * be time to bite the bullet and use our own enum for these types
24     * (just like we do for transport parameters).  A simpler alternative
25     * would be to drop the enum and use #define's, but it would stink...
26     */
27    HQFT_PRIORITY_UPDATE_STREAM= 0xF0700,
28    HQFT_PRIORITY_UPDATE_PUSH  = 0xF0701,
29    /* This frame is made up and its type is never written to stream.
30     * Nevertheless, just to be on the safe side, give it a value as
31     * described in [draft-ietf-quic-http-20] Section 4.2.10.
32     */
33    HQFT_PUSH_PREAMBLE  = 0x1F * 3 + 0x21,
34};
35
36
37enum hq_setting_id
38{
39    HQSID_QPACK_MAX_TABLE_CAPACITY  = 1,
40    HQSID_MAX_HEADER_LIST_SIZE      = 6,
41    HQSID_QPACK_BLOCKED_STREAMS     = 7,
42};
43
44/* As of 12/18/2018: */
45#define HQ_DF_QPACK_MAX_TABLE_CAPACITY 0
46#define HQ_DF_MAX_HEADER_LIST_SIZE 0
47#define HQ_DF_QPACK_BLOCKED_STREAMS 0
48
49
50/* [draft-ietf-quic-http-19] Section 10.6,
51 * [draft-ietf-quic-qpack-07] Section 8.2
52 */
53enum hq_uni_stream_type
54{
55    HQUST_CONTROL   = 0,
56    HQUST_PUSH      = 1,
57    HQUST_QPACK_ENC = 2,
58    HQUST_QPACK_DEC = 3,
59};
60
61
62/* [draft-ietf-quic-http-23] Section 8.1 and
63 * [draft-ietf-quic-qpack-08], Section 8.3
64 */
65enum http_error_code
66{
67    HEC_NO_ERROR                =  0x100,
68    HEC_GENERAL_PROTOCOL_ERROR  =  0x101,
69    HEC_INTERNAL_ERROR          =  0x102,
70    HEC_STREAM_CREATION_ERROR   =  0x103,
71    HEC_CLOSED_CRITICAL_STREAM  =  0x104,
72    HEC_FRAME_UNEXPECTED        =  0x105,
73    HEC_FRAME_ERROR             =  0x106,
74    HEC_EXCESSIVE_LOAD          =  0x107,
75    HEC_ID_ERROR                =  0x108,
76    HEC_SETTINGS_ERROR          =  0x109,
77    HEC_MISSING_SETTINGS        =  0x10A,
78    HEC_REQUEST_REJECTED        =  0x10B,
79    HEC_REQUEST_CANCELLED       =  0x10C,
80    HEC_REQUEST_INCOMPLETE      =  0x10D,
81    HEC_MESSAGE_ERROR           =  0x10E,
82    HEC_CONNECT_ERROR           =  0x10F,
83    HEC_VERSION_FALLBACK        =  0x110,
84    HEC_QPACK_DECOMPRESSION_FAILED  = 0x200,
85    HEC_QPACK_ENCODER_STREAM_ERROR  = 0x201,
86    HEC_QPACK_DECODER_STREAM_ERROR  = 0x202,
87};
88
89
90enum ppc_flags
91{
92    PPC_URG_NAME = 1 << 0,
93    PPC_INC_NAME = 1 << 1,
94    PPC_URG_SET  = 1 << 2,      /* 'urgency' is set */
95    PPC_INC_SET  = 1 << 3,      /* 'incremental' is set */
96};
97
98
99int
100lsquic_http_parse_pfv (const char *, size_t, enum ppc_flags * /* optional */,
101                           struct lsquic_ext_http_prio *, char *str, size_t);
102
103#endif
104