annotate src/http/v3/ngx_http_v3_encode.c @ 8546:d80365ca678d quic

HTTP/3: require mandatory uni streams before additional ones. As per quic-http-34: Endpoints SHOULD create the HTTP control stream as well as the unidirectional streams required by mandatory extensions (such as the QPACK encoder and decoder streams) first, and then create additional streams as allowed by their peer. Previously, client could create and destroy additional uni streams unlimited number of times before creating mandatory streams.
author Roman Arutyunyan <arut@nginx.com>
date Thu, 29 Jul 2021 10:03:36 +0300
parents 0ac25efb2da3
children b5a305db30e0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
2 /*
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
3 * Copyright (C) Roman Arutyunyan
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
4 * Copyright (C) Nginx, Inc.
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
5 */
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
6
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
7
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
8 #include <ngx_config.h>
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
9 #include <ngx_core.h>
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
10 #include <ngx_http.h>
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
11
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
12
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
13 uintptr_t
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
14 ngx_http_v3_encode_varlen_int(u_char *p, uint64_t value)
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
15 {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
16 if (value <= 63) {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
17 if (p == NULL) {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
18 return 1;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
19 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
20
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
21 *p++ = value;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
22 return (uintptr_t) p;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
23 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
24
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
25 if (value <= 16383) {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
26 if (p == NULL) {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
27 return 2;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
28 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
29
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
30 *p++ = 0x40 | (value >> 8);
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
31 *p++ = value;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
32 return (uintptr_t) p;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
33 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
34
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
35 if (value <= 1073741823) {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
36 if (p == NULL) {
7826
b13176e717ba HTTP/3: fixed encoding variable-length integers.
Roman Arutyunyan <arut@nginx.com>
parents: 7692
diff changeset
37 return 4;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
38 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
39
7826
b13176e717ba HTTP/3: fixed encoding variable-length integers.
Roman Arutyunyan <arut@nginx.com>
parents: 7692
diff changeset
40 *p++ = 0x80 | (value >> 24);
b13176e717ba HTTP/3: fixed encoding variable-length integers.
Roman Arutyunyan <arut@nginx.com>
parents: 7692
diff changeset
41 *p++ = (value >> 16);
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
42 *p++ = (value >> 8);
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
43 *p++ = value;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
44 return (uintptr_t) p;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
45 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
46
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
47 if (p == NULL) {
7826
b13176e717ba HTTP/3: fixed encoding variable-length integers.
Roman Arutyunyan <arut@nginx.com>
parents: 7692
diff changeset
48 return 8;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
49 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
50
7826
b13176e717ba HTTP/3: fixed encoding variable-length integers.
Roman Arutyunyan <arut@nginx.com>
parents: 7692
diff changeset
51 *p++ = 0xc0 | (value >> 56);
b13176e717ba HTTP/3: fixed encoding variable-length integers.
Roman Arutyunyan <arut@nginx.com>
parents: 7692
diff changeset
52 *p++ = (value >> 48);
b13176e717ba HTTP/3: fixed encoding variable-length integers.
Roman Arutyunyan <arut@nginx.com>
parents: 7692
diff changeset
53 *p++ = (value >> 40);
b13176e717ba HTTP/3: fixed encoding variable-length integers.
Roman Arutyunyan <arut@nginx.com>
parents: 7692
diff changeset
54 *p++ = (value >> 32);
b13176e717ba HTTP/3: fixed encoding variable-length integers.
Roman Arutyunyan <arut@nginx.com>
parents: 7692
diff changeset
55 *p++ = (value >> 24);
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
56 *p++ = (value >> 16);
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
57 *p++ = (value >> 8);
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
58 *p++ = value;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
59 return (uintptr_t) p;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
60 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
61
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
62
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
63 uintptr_t
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
64 ngx_http_v3_encode_prefix_int(u_char *p, uint64_t value, ngx_uint_t prefix)
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
65 {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
66 ngx_uint_t thresh, n;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
67
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
68 thresh = (1 << prefix) - 1;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
69
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
70 if (value < thresh) {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
71 if (p == NULL) {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
72 return 1;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
73 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
74
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
75 *p++ |= value;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
76 return (uintptr_t) p;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
77 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
78
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
79 value -= thresh;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
80
7950
b0e81f49d7c0 HTTP/3: fixed prefixed integer encoding and decoding.
Roman Arutyunyan <arut@nginx.com>
parents: 7826
diff changeset
81 if (p == NULL) {
b0e81f49d7c0 HTTP/3: fixed prefixed integer encoding and decoding.
Roman Arutyunyan <arut@nginx.com>
parents: 7826
diff changeset
82 for (n = 2; value >= 128; n++) {
b0e81f49d7c0 HTTP/3: fixed prefixed integer encoding and decoding.
Roman Arutyunyan <arut@nginx.com>
parents: 7826
diff changeset
83 value >>= 7;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
84 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
85
7950
b0e81f49d7c0 HTTP/3: fixed prefixed integer encoding and decoding.
Roman Arutyunyan <arut@nginx.com>
parents: 7826
diff changeset
86 return n;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
87 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
88
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
89 *p++ |= thresh;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
90
7950
b0e81f49d7c0 HTTP/3: fixed prefixed integer encoding and decoding.
Roman Arutyunyan <arut@nginx.com>
parents: 7826
diff changeset
91 while (value >= 128) {
b0e81f49d7c0 HTTP/3: fixed prefixed integer encoding and decoding.
Roman Arutyunyan <arut@nginx.com>
parents: 7826
diff changeset
92 *p++ = 0x80 | value;
b0e81f49d7c0 HTTP/3: fixed prefixed integer encoding and decoding.
Roman Arutyunyan <arut@nginx.com>
parents: 7826
diff changeset
93 value >>= 7;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
94 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
95
7950
b0e81f49d7c0 HTTP/3: fixed prefixed integer encoding and decoding.
Roman Arutyunyan <arut@nginx.com>
parents: 7826
diff changeset
96 *p++ = value;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
97
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
98 return (uintptr_t) p;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
99 }
8006
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
100
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
101
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
102 uintptr_t
8508
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8072
diff changeset
103 ngx_http_v3_encode_field_section_prefix(u_char *p, ngx_uint_t insert_count,
8006
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
104 ngx_uint_t sign, ngx_uint_t delta_base)
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
105 {
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
106 if (p == NULL) {
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
107 return ngx_http_v3_encode_prefix_int(NULL, insert_count, 8)
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
108 + ngx_http_v3_encode_prefix_int(NULL, delta_base, 7);
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
109 }
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
110
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
111 *p = 0;
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
112 p = (u_char *) ngx_http_v3_encode_prefix_int(p, insert_count, 8);
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
113
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
114 *p = sign ? 0x80 : 0;
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
115 p = (u_char *) ngx_http_v3_encode_prefix_int(p, delta_base, 7);
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
116
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
117 return (uintptr_t) p;
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
118 }
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
119
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
120
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
121 uintptr_t
8508
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8072
diff changeset
122 ngx_http_v3_encode_field_ri(u_char *p, ngx_uint_t dynamic, ngx_uint_t index)
8006
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
123 {
8508
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8072
diff changeset
124 /* Indexed Field Line */
8006
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
125
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
126 if (p == NULL) {
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
127 return ngx_http_v3_encode_prefix_int(NULL, index, 6);
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
128 }
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
129
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
130 *p = dynamic ? 0x80 : 0xc0;
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
131
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
132 return ngx_http_v3_encode_prefix_int(p, index, 6);
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
133 }
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
134
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
135
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
136 uintptr_t
8508
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8072
diff changeset
137 ngx_http_v3_encode_field_lri(u_char *p, ngx_uint_t dynamic, ngx_uint_t index,
8006
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
138 u_char *data, size_t len)
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
139 {
8508
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8072
diff changeset
140 /* Literal Field Line With Name Reference */
8006
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
141
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
142 if (p == NULL) {
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
143 return ngx_http_v3_encode_prefix_int(NULL, index, 4)
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
144 + ngx_http_v3_encode_prefix_int(NULL, len, 7)
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
145 + len;
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
146 }
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
147
8072
985f9351dd87 HTTP/3: do not set the never-indexed literal bit by default.
Roman Arutyunyan <arut@nginx.com>
parents: 8009
diff changeset
148 *p = dynamic ? 0x40 : 0x50;
8006
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
149 p = (u_char *) ngx_http_v3_encode_prefix_int(p, index, 4);
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
150
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
151 *p = 0;
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
152 p = (u_char *) ngx_http_v3_encode_prefix_int(p, len, 7);
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
153
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
154 if (data) {
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
155 p = ngx_cpymem(p, data, len);
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
156 }
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
157
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
158 return (uintptr_t) p;
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
159 }
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
160
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
161
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
162 uintptr_t
8508
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8072
diff changeset
163 ngx_http_v3_encode_field_l(u_char *p, ngx_str_t *name, ngx_str_t *value)
8006
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
164 {
8508
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8072
diff changeset
165 /* Literal Field Line With Literal Name */
8006
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
166
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
167 if (p == NULL) {
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
168 return ngx_http_v3_encode_prefix_int(NULL, name->len, 3)
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
169 + name->len
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
170 + ngx_http_v3_encode_prefix_int(NULL, value->len, 7)
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
171 + value->len;
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
172 }
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
173
8072
985f9351dd87 HTTP/3: do not set the never-indexed literal bit by default.
Roman Arutyunyan <arut@nginx.com>
parents: 8009
diff changeset
174 *p = 0x20;
8006
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
175 p = (u_char *) ngx_http_v3_encode_prefix_int(p, name->len, 3);
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
176
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
177 ngx_strlow(p, name->data, name->len);
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
178 p += name->len;
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
179
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
180 *p = 0;
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
181 p = (u_char *) ngx_http_v3_encode_prefix_int(p, value->len, 7);
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
182
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
183 p = ngx_cpymem(p, value->data, value->len);
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
184
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
185 return (uintptr_t) p;
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
186 }
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
187
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
188
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
189 uintptr_t
8508
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8072
diff changeset
190 ngx_http_v3_encode_field_pbi(u_char *p, ngx_uint_t index)
8006
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
191 {
8508
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8072
diff changeset
192 /* Indexed Field Line With Post-Base Index */
8006
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
193
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
194 if (p == NULL) {
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
195 return ngx_http_v3_encode_prefix_int(NULL, index, 4);
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
196 }
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
197
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
198 *p = 0x10;
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
199
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
200 return ngx_http_v3_encode_prefix_int(p, index, 4);
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
201 }
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
202
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
203
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
204 uintptr_t
8508
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8072
diff changeset
205 ngx_http_v3_encode_field_lpbi(u_char *p, ngx_uint_t index, u_char *data,
8006
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
206 size_t len)
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
207 {
8508
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8072
diff changeset
208 /* Literal Field Line With Post-Base Name Reference */
8006
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
209
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
210 if (p == NULL) {
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
211 return ngx_http_v3_encode_prefix_int(NULL, index, 3)
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
212 + ngx_http_v3_encode_prefix_int(NULL, len, 7)
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
213 + len;
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
214 }
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
215
8072
985f9351dd87 HTTP/3: do not set the never-indexed literal bit by default.
Roman Arutyunyan <arut@nginx.com>
parents: 8009
diff changeset
216 *p = 0;
8006
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
217 p = (u_char *) ngx_http_v3_encode_prefix_int(p, index, 3);
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
218
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
219 *p = 0;
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
220 p = (u_char *) ngx_http_v3_encode_prefix_int(p, len, 7);
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
221
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
222 if (data) {
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
223 p = ngx_cpymem(p, data, len);
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
224 }
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
225
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
226 return (uintptr_t) p;
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
227 }