annotate src/http/v3/ngx_http_v3.c @ 8006:79125ef2e39f quic

HTTP/3: header encoding functions.
author Roman Arutyunyan <arut@nginx.com>
date Mon, 13 Jul 2020 16:00:00 +0300
parents b0e81f49d7c0
children
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
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
103 ngx_http_v3_encode_header_block_prefix(u_char *p, ngx_uint_t insert_count,
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
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
122 ngx_http_v3_encode_header_ri(u_char *p, ngx_uint_t dynamic, ngx_uint_t index)
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
123 {
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
124 /* Indexed Header Field */
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
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
137 ngx_http_v3_encode_header_lri(u_char *p, ngx_uint_t dynamic, ngx_uint_t index,
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 {
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
140 /* Literal Header Field With Name Reference */
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
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
148 *p = dynamic ? 0x60 : 0x70;
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
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
163 ngx_http_v3_encode_header_l(u_char *p, ngx_str_t *name, ngx_str_t *value)
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
164 {
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
165 /* Literal Header Field Without Name Reference */
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
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
174 *p = 0x30;
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
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
190 ngx_http_v3_encode_header_pbi(u_char *p, ngx_uint_t index)
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
191 {
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
192 /* Indexed Header Field With Post-Base Index */
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
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
205 ngx_http_v3_encode_header_lpbi(u_char *p, ngx_uint_t index, u_char *data,
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 {
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
208 /* Literal Header Field With Post-Base Name Reference */
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
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
216 *p = 0x08;
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 }