annotate src/http/v3/ngx_http_v3_encode.c @ 8922:be08b858086a quic

HTTP/3: http3_hq directive and NGX_HTTP_V3_HQ macro. Listen quic parameter is no longer supported.
author Roman Arutyunyan <arut@nginx.com>
date Sat, 04 Dec 2021 10:52:55 +0300
parents b5a305db30e0
children 5c86189a1c1b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8215
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) {
8349
b13176e717ba HTTP/3: fixed encoding variable-length integers.
Roman Arutyunyan <arut@nginx.com>
parents: 8226
diff changeset
37 return 4;
8215
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
38 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
39
8349
b13176e717ba HTTP/3: fixed encoding variable-length integers.
Roman Arutyunyan <arut@nginx.com>
parents: 8226
diff changeset
40 *p++ = 0x80 | (value >> 24);
b13176e717ba HTTP/3: fixed encoding variable-length integers.
Roman Arutyunyan <arut@nginx.com>
parents: 8226
diff changeset
41 *p++ = (value >> 16);
8215
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) {
8349
b13176e717ba HTTP/3: fixed encoding variable-length integers.
Roman Arutyunyan <arut@nginx.com>
parents: 8226
diff changeset
48 return 8;
8215
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
49 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
50
8349
b13176e717ba HTTP/3: fixed encoding variable-length integers.
Roman Arutyunyan <arut@nginx.com>
parents: 8226
diff changeset
51 *p++ = 0xc0 | (value >> 56);
b13176e717ba HTTP/3: fixed encoding variable-length integers.
Roman Arutyunyan <arut@nginx.com>
parents: 8226
diff changeset
52 *p++ = (value >> 48);
b13176e717ba HTTP/3: fixed encoding variable-length integers.
Roman Arutyunyan <arut@nginx.com>
parents: 8226
diff changeset
53 *p++ = (value >> 40);
b13176e717ba HTTP/3: fixed encoding variable-length integers.
Roman Arutyunyan <arut@nginx.com>
parents: 8226
diff changeset
54 *p++ = (value >> 32);
b13176e717ba HTTP/3: fixed encoding variable-length integers.
Roman Arutyunyan <arut@nginx.com>
parents: 8226
diff changeset
55 *p++ = (value >> 24);
8215
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
8455
b0e81f49d7c0 HTTP/3: fixed prefixed integer encoding and decoding.
Roman Arutyunyan <arut@nginx.com>
parents: 8349
diff changeset
81 if (p == NULL) {
b0e81f49d7c0 HTTP/3: fixed prefixed integer encoding and decoding.
Roman Arutyunyan <arut@nginx.com>
parents: 8349
diff changeset
82 for (n = 2; value >= 128; n++) {
b0e81f49d7c0 HTTP/3: fixed prefixed integer encoding and decoding.
Roman Arutyunyan <arut@nginx.com>
parents: 8349
diff changeset
83 value >>= 7;
8215
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
84 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
85
8455
b0e81f49d7c0 HTTP/3: fixed prefixed integer encoding and decoding.
Roman Arutyunyan <arut@nginx.com>
parents: 8349
diff changeset
86 return n;
8215
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
8455
b0e81f49d7c0 HTTP/3: fixed prefixed integer encoding and decoding.
Roman Arutyunyan <arut@nginx.com>
parents: 8349
diff changeset
91 while (value >= 128) {
b0e81f49d7c0 HTTP/3: fixed prefixed integer encoding and decoding.
Roman Arutyunyan <arut@nginx.com>
parents: 8349
diff changeset
92 *p++ = 0x80 | value;
b0e81f49d7c0 HTTP/3: fixed prefixed integer encoding and decoding.
Roman Arutyunyan <arut@nginx.com>
parents: 8349
diff changeset
93 value >>= 7;
8215
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
94 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
95
8455
b0e81f49d7c0 HTTP/3: fixed prefixed integer encoding and decoding.
Roman Arutyunyan <arut@nginx.com>
parents: 8349
diff changeset
96 *p++ = value;
8215
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 }
8488
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
100
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
101
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
102 uintptr_t
8807
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8534
diff changeset
103 ngx_http_v3_encode_field_section_prefix(u_char *p, ngx_uint_t insert_count,
8488
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
104 ngx_uint_t sign, ngx_uint_t delta_base)
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
105 {
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
106 if (p == NULL) {
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
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: 8455
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: 8455
diff changeset
109 }
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
110
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
111 *p = 0;
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
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: 8455
diff changeset
113
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
114 *p = sign ? 0x80 : 0;
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
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: 8455
diff changeset
116
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
117 return (uintptr_t) p;
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
118 }
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
119
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
120
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
121 uintptr_t
8807
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8534
diff changeset
122 ngx_http_v3_encode_field_ri(u_char *p, ngx_uint_t dynamic, ngx_uint_t index)
8488
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
123 {
8807
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8534
diff changeset
124 /* Indexed Field Line */
8488
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
125
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
126 if (p == NULL) {
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
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: 8455
diff changeset
128 }
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
129
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
130 *p = dynamic ? 0x80 : 0xc0;
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
131
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
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: 8455
diff changeset
133 }
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
134
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
135
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
136 uintptr_t
8807
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8534
diff changeset
137 ngx_http_v3_encode_field_lri(u_char *p, ngx_uint_t dynamic, ngx_uint_t index,
8488
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
138 u_char *data, size_t len)
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
139 {
8848
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
140 size_t hlen;
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
141 u_char *p1, *p2;
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
142
8807
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8534
diff changeset
143 /* Literal Field Line With Name Reference */
8488
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
144
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
145 if (p == NULL) {
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
146 return ngx_http_v3_encode_prefix_int(NULL, index, 4)
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
147 + ngx_http_v3_encode_prefix_int(NULL, len, 7)
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
148 + len;
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
149 }
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
150
8534
985f9351dd87 HTTP/3: do not set the never-indexed literal bit by default.
Roman Arutyunyan <arut@nginx.com>
parents: 8491
diff changeset
151 *p = dynamic ? 0x40 : 0x50;
8488
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
152 p = (u_char *) ngx_http_v3_encode_prefix_int(p, index, 4);
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
153
8848
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
154 p1 = p;
8488
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
155 *p = 0;
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
156 p = (u_char *) ngx_http_v3_encode_prefix_int(p, len, 7);
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
157
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
158 if (data) {
8848
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
159 p2 = p;
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
160 hlen = ngx_http_v2_huff_encode(data, len, p, 0);
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
161
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
162 if (hlen) {
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
163 p = p1;
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
164 *p = 0x80;
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
165 p = (u_char *) ngx_http_v3_encode_prefix_int(p, hlen, 7);
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
166
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
167 if (p != p2) {
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
168 ngx_memmove(p, p2, hlen);
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
169 }
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
170
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
171 p += hlen;
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
172
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
173 } else {
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
174 p = ngx_cpymem(p, data, len);
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
175 }
8488
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
176 }
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
177
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
178 return (uintptr_t) p;
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
179 }
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
180
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
181
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
182 uintptr_t
8807
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8534
diff changeset
183 ngx_http_v3_encode_field_l(u_char *p, ngx_str_t *name, ngx_str_t *value)
8488
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
184 {
8848
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
185 size_t hlen;
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
186 u_char *p1, *p2;
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
187
8807
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8534
diff changeset
188 /* Literal Field Line With Literal Name */
8488
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
189
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
190 if (p == NULL) {
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
191 return ngx_http_v3_encode_prefix_int(NULL, name->len, 3)
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
192 + name->len
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
193 + ngx_http_v3_encode_prefix_int(NULL, value->len, 7)
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
194 + value->len;
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
195 }
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
196
8848
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
197 p1 = p;
8534
985f9351dd87 HTTP/3: do not set the never-indexed literal bit by default.
Roman Arutyunyan <arut@nginx.com>
parents: 8491
diff changeset
198 *p = 0x20;
8488
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
199 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: 8455
diff changeset
200
8848
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
201 p2 = p;
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
202 hlen = ngx_http_v2_huff_encode(name->data, name->len, p, 1);
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
203
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
204 if (hlen) {
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
205 p = p1;
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
206 *p = 0x28;
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
207 p = (u_char *) ngx_http_v3_encode_prefix_int(p, hlen, 3);
8488
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
208
8848
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
209 if (p != p2) {
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
210 ngx_memmove(p, p2, hlen);
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
211 }
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
212
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
213 p += hlen;
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
214
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
215 } else {
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
216 ngx_strlow(p, name->data, name->len);
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
217 p += name->len;
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
218 }
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
219
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
220 p1 = p;
8488
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
221 *p = 0;
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
222 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: 8455
diff changeset
223
8848
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
224 p2 = p;
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
225 hlen = ngx_http_v2_huff_encode(value->data, value->len, p, 0);
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
226
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
227 if (hlen) {
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
228 p = p1;
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
229 *p = 0x80;
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
230 p = (u_char *) ngx_http_v3_encode_prefix_int(p, hlen, 7);
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
231
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
232 if (p != p2) {
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
233 ngx_memmove(p, p2, hlen);
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
234 }
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
235
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
236 p += hlen;
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
237
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
238 } else {
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
239 p = ngx_cpymem(p, value->data, value->len);
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
240 }
8488
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
241
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
242 return (uintptr_t) p;
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
243 }
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
244
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
245
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
246 uintptr_t
8807
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8534
diff changeset
247 ngx_http_v3_encode_field_pbi(u_char *p, ngx_uint_t index)
8488
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
248 {
8807
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8534
diff changeset
249 /* Indexed Field Line With Post-Base Index */
8488
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
250
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
251 if (p == NULL) {
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
252 return ngx_http_v3_encode_prefix_int(NULL, index, 4);
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
253 }
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
254
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
255 *p = 0x10;
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
256
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
257 return ngx_http_v3_encode_prefix_int(p, index, 4);
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
258 }
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
259
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
260
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
261 uintptr_t
8807
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8534
diff changeset
262 ngx_http_v3_encode_field_lpbi(u_char *p, ngx_uint_t index, u_char *data,
8488
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
263 size_t len)
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
264 {
8848
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
265 size_t hlen;
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
266 u_char *p1, *p2;
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
267
8807
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8534
diff changeset
268 /* Literal Field Line With Post-Base Name Reference */
8488
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
269
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
270 if (p == NULL) {
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
271 return ngx_http_v3_encode_prefix_int(NULL, index, 3)
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
272 + ngx_http_v3_encode_prefix_int(NULL, len, 7)
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
273 + len;
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
274 }
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
275
8534
985f9351dd87 HTTP/3: do not set the never-indexed literal bit by default.
Roman Arutyunyan <arut@nginx.com>
parents: 8491
diff changeset
276 *p = 0;
8488
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
277 p = (u_char *) ngx_http_v3_encode_prefix_int(p, index, 3);
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
278
8848
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
279 p1 = p;
8488
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
280 *p = 0;
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
281 p = (u_char *) ngx_http_v3_encode_prefix_int(p, len, 7);
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
282
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
283 if (data) {
8848
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
284 p2 = p;
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
285 hlen = ngx_http_v2_huff_encode(data, len, p, 0);
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
286
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
287 if (hlen) {
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
288 p = p1;
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
289 *p = 0x80;
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
290 p = (u_char *) ngx_http_v3_encode_prefix_int(p, hlen, 7);
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
291
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
292 if (p != p2) {
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
293 ngx_memmove(p, p2, hlen);
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
294 }
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
295
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
296 p += hlen;
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
297
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
298 } else {
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
299 p = ngx_cpymem(p, data, len);
b5a305db30e0 HTTP/3: implemented QPACK Huffman encoding for response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8807
diff changeset
300 }
8488
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
301 }
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
302
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
303 return (uintptr_t) p;
79125ef2e39f HTTP/3: header encoding functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8455
diff changeset
304 }