annotate src/http/v3/ngx_http_v3_parse.c @ 8496:278ab0ed24f2 quic

HTTP/3: generate more H3_FRAME_UNEXPECTED. As per quic-http-34, these are the cases when this error should be generated: If an endpoint receives a second SETTINGS frame on the control stream, the endpoint MUST respond with a connection error of type H3_FRAME_UNEXPECTED SETTINGS frames MUST NOT be sent on any stream other than the control stream. If an endpoint receives a SETTINGS frame on a different stream, the endpoint MUST respond with a connection error of type H3_FRAME_UNEXPECTED. A client MUST NOT send a PUSH_PROMISE frame. A server MUST treat the receipt of a PUSH_PROMISE frame as a connection error of type H3_FRAME_UNEXPECTED; see Section 8. The MAX_PUSH_ID frame is always sent on the control stream. Receipt of a MAX_PUSH_ID frame on any other stream MUST be treated as a connection error of type H3_FRAME_UNEXPECTED. Receipt of an invalid sequence of frames MUST be treated as a connection error of type H3_FRAME_UNEXPECTED; see Section 8. In particular, a DATA frame before any HEADERS frame, or a HEADERS or DATA frame after the trailing HEADERS frame, is considered invalid. A CANCEL_PUSH frame is sent on the control stream. Receiving a CANCEL_PUSH frame on a stream other than the control stream MUST be treated as a connection error of type H3_FRAME_UNEXPECTED. The GOAWAY frame is always sent on the control stream.
author Roman Arutyunyan <arut@nginx.com>
date Fri, 11 Jun 2021 12:11:08 +0300
parents ba5977b38b2e
children 1fec68e322d0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
2 /*
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
3 * Copyright (C) Roman Arutyunyan
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
4 * Copyright (C) Nginx, Inc.
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
5 */
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
6
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
7
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
8 #include <ngx_config.h>
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
9 #include <ngx_core.h>
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
10 #include <ngx_http.h>
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
11
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
12
8088
234e9d89ff7f HTTP/3: reject HTTP/2 frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8087
diff changeset
13 #define ngx_http_v3_is_v2_frame(type) \
234e9d89ff7f HTTP/3: reject HTTP/2 frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8087
diff changeset
14 ((type) == 0x02 || (type) == 0x06 || (type) == 0x08 || (type) == 0x09)
234e9d89ff7f HTTP/3: reject HTTP/2 frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8087
diff changeset
15
234e9d89ff7f HTTP/3: reject HTTP/2 frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8087
diff changeset
16
8259
ab6aaa8e86b0 HTTP/3: staticize internal parsing functions.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8233
diff changeset
17 static ngx_int_t ngx_http_v3_parse_varlen_int(ngx_connection_t *c,
ab6aaa8e86b0 HTTP/3: staticize internal parsing functions.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8233
diff changeset
18 ngx_http_v3_parse_varlen_int_t *st, u_char ch);
ab6aaa8e86b0 HTTP/3: staticize internal parsing functions.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8233
diff changeset
19 static ngx_int_t ngx_http_v3_parse_prefix_int(ngx_connection_t *c,
ab6aaa8e86b0 HTTP/3: staticize internal parsing functions.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8233
diff changeset
20 ngx_http_v3_parse_prefix_int_t *st, ngx_uint_t prefix, u_char ch);
ab6aaa8e86b0 HTTP/3: staticize internal parsing functions.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8233
diff changeset
21
ab6aaa8e86b0 HTTP/3: staticize internal parsing functions.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8233
diff changeset
22 static ngx_int_t ngx_http_v3_parse_header_block_prefix(ngx_connection_t *c,
ab6aaa8e86b0 HTTP/3: staticize internal parsing functions.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8233
diff changeset
23 ngx_http_v3_parse_header_block_prefix_t *st, u_char ch);
ab6aaa8e86b0 HTTP/3: staticize internal parsing functions.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8233
diff changeset
24 static ngx_int_t ngx_http_v3_parse_header_rep(ngx_connection_t *c,
ab6aaa8e86b0 HTTP/3: staticize internal parsing functions.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8233
diff changeset
25 ngx_http_v3_parse_header_rep_t *st, ngx_uint_t base, u_char ch);
ab6aaa8e86b0 HTTP/3: staticize internal parsing functions.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8233
diff changeset
26 static ngx_int_t ngx_http_v3_parse_literal(ngx_connection_t *c,
ab6aaa8e86b0 HTTP/3: staticize internal parsing functions.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8233
diff changeset
27 ngx_http_v3_parse_literal_t *st, u_char ch);
ab6aaa8e86b0 HTTP/3: staticize internal parsing functions.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8233
diff changeset
28 static ngx_int_t ngx_http_v3_parse_header_ri(ngx_connection_t *c,
ab6aaa8e86b0 HTTP/3: staticize internal parsing functions.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8233
diff changeset
29 ngx_http_v3_parse_header_t *st, u_char ch);
ab6aaa8e86b0 HTTP/3: staticize internal parsing functions.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8233
diff changeset
30 static ngx_int_t ngx_http_v3_parse_header_lri(ngx_connection_t *c,
ab6aaa8e86b0 HTTP/3: staticize internal parsing functions.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8233
diff changeset
31 ngx_http_v3_parse_header_t *st, u_char ch);
ab6aaa8e86b0 HTTP/3: staticize internal parsing functions.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8233
diff changeset
32 static ngx_int_t ngx_http_v3_parse_header_l(ngx_connection_t *c,
ab6aaa8e86b0 HTTP/3: staticize internal parsing functions.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8233
diff changeset
33 ngx_http_v3_parse_header_t *st, u_char ch);
ab6aaa8e86b0 HTTP/3: staticize internal parsing functions.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8233
diff changeset
34 static ngx_int_t ngx_http_v3_parse_header_pbi(ngx_connection_t *c,
ab6aaa8e86b0 HTTP/3: staticize internal parsing functions.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8233
diff changeset
35 ngx_http_v3_parse_header_t *st, u_char ch);
ab6aaa8e86b0 HTTP/3: staticize internal parsing functions.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8233
diff changeset
36 static ngx_int_t ngx_http_v3_parse_header_lpbi(ngx_connection_t *c,
ab6aaa8e86b0 HTTP/3: staticize internal parsing functions.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8233
diff changeset
37 ngx_http_v3_parse_header_t *st, u_char ch);
ab6aaa8e86b0 HTTP/3: staticize internal parsing functions.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8233
diff changeset
38
8432
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
39 static ngx_int_t ngx_http_v3_parse_control(ngx_connection_t *c,
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
40 ngx_http_v3_parse_control_t *st, u_char ch);
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
41 static ngx_int_t ngx_http_v3_parse_settings(ngx_connection_t *c,
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
42 ngx_http_v3_parse_settings_t *st, u_char ch);
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
43
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
44 static ngx_int_t ngx_http_v3_parse_encoder(ngx_connection_t *c,
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
45 ngx_http_v3_parse_encoder_t *st, u_char ch);
8259
ab6aaa8e86b0 HTTP/3: staticize internal parsing functions.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8233
diff changeset
46 static ngx_int_t ngx_http_v3_parse_header_inr(ngx_connection_t *c,
ab6aaa8e86b0 HTTP/3: staticize internal parsing functions.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8233
diff changeset
47 ngx_http_v3_parse_header_t *st, u_char ch);
ab6aaa8e86b0 HTTP/3: staticize internal parsing functions.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8233
diff changeset
48 static ngx_int_t ngx_http_v3_parse_header_iwnr(ngx_connection_t *c,
ab6aaa8e86b0 HTTP/3: staticize internal parsing functions.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8233
diff changeset
49 ngx_http_v3_parse_header_t *st, u_char ch);
ab6aaa8e86b0 HTTP/3: staticize internal parsing functions.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8233
diff changeset
50
8432
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
51 static ngx_int_t ngx_http_v3_parse_decoder(ngx_connection_t *c,
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
52 ngx_http_v3_parse_decoder_t *st, u_char ch);
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
53
7951
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
54 static ngx_int_t ngx_http_v3_parse_lookup(ngx_connection_t *c,
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
55 ngx_uint_t dynamic, ngx_uint_t index, ngx_str_t *name, ngx_str_t *value);
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
56
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
57
8259
ab6aaa8e86b0 HTTP/3: staticize internal parsing functions.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8233
diff changeset
58 static ngx_int_t
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
59 ngx_http_v3_parse_varlen_int(ngx_connection_t *c,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
60 ngx_http_v3_parse_varlen_int_t *st, u_char ch)
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
61 {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
62 enum {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
63 sw_start = 0,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
64 sw_length_2,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
65 sw_length_3,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
66 sw_length_4,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
67 sw_length_5,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
68 sw_length_6,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
69 sw_length_7,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
70 sw_length_8
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
71 };
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
72
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
73 switch (st->state) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
74
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
75 case sw_start:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
76
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
77 st->value = ch;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
78 if (st->value & 0xc0) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
79 st->state = sw_length_2;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
80 break;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
81 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
82
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
83 goto done;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
84
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
85 case sw_length_2:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
86
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
87 st->value = (st->value << 8) + ch;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
88 if ((st->value & 0xc000) == 0x4000) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
89 st->value &= 0x3fff;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
90 goto done;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
91 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
92
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
93 st->state = sw_length_3;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
94 break;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
95
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
96 case sw_length_4:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
97
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
98 st->value = (st->value << 8) + ch;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
99 if ((st->value & 0xc0000000) == 0x80000000) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
100 st->value &= 0x3fffffff;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
101 goto done;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
102 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
103
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
104 st->state = sw_length_5;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
105 break;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
106
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
107 case sw_length_3:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
108 case sw_length_5:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
109 case sw_length_6:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
110 case sw_length_7:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
111
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
112 st->value = (st->value << 8) + ch;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
113 st->state++;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
114 break;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
115
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
116 case sw_length_8:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
117
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
118 st->value = (st->value << 8) + ch;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
119 st->value &= 0x3fffffffffffffff;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
120 goto done;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
121 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
122
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
123 return NGX_AGAIN;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
124
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
125 done:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
126
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
127 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
128 "http3 parse varlen int %uL", st->value);
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
129
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
130 st->state = sw_start;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
131 return NGX_DONE;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
132 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
133
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
134
8259
ab6aaa8e86b0 HTTP/3: staticize internal parsing functions.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8233
diff changeset
135 static ngx_int_t
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
136 ngx_http_v3_parse_prefix_int(ngx_connection_t *c,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
137 ngx_http_v3_parse_prefix_int_t *st, ngx_uint_t prefix, u_char ch)
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
138 {
7950
b0e81f49d7c0 HTTP/3: fixed prefixed integer encoding and decoding.
Roman Arutyunyan <arut@nginx.com>
parents: 7949
diff changeset
139 ngx_uint_t mask;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
140 enum {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
141 sw_start = 0,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
142 sw_value
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
143 };
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
144
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
145 switch (st->state) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
146
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
147 case sw_start:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
148
7950
b0e81f49d7c0 HTTP/3: fixed prefixed integer encoding and decoding.
Roman Arutyunyan <arut@nginx.com>
parents: 7949
diff changeset
149 mask = (1 << prefix) - 1;
b0e81f49d7c0 HTTP/3: fixed prefixed integer encoding and decoding.
Roman Arutyunyan <arut@nginx.com>
parents: 7949
diff changeset
150 st->value = ch & mask;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
151
7950
b0e81f49d7c0 HTTP/3: fixed prefixed integer encoding and decoding.
Roman Arutyunyan <arut@nginx.com>
parents: 7949
diff changeset
152 if (st->value != mask) {
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
153 goto done;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
154 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
155
7950
b0e81f49d7c0 HTTP/3: fixed prefixed integer encoding and decoding.
Roman Arutyunyan <arut@nginx.com>
parents: 7949
diff changeset
156 st->shift = 0;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
157 st->state = sw_value;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
158 break;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
159
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
160 case sw_value:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
161
7958
2576485b93d4 HTTP/3: fixed overflow in prefixed integer parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7957
diff changeset
162 st->value += (uint64_t) (ch & 0x7f) << st->shift;
7959
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
163
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
164 if (st->shift == 56
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
165 && ((ch & 0x80) || (st->value & 0xc000000000000000)))
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
166 {
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
167 ngx_log_error(NGX_LOG_INFO, c->log, 0,
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
168 "client exceeded integer size limit");
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
169 return NGX_HTTP_V3_ERR_EXCESSIVE_LOAD;
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
170 }
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
171
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
172 if (ch & 0x80) {
7950
b0e81f49d7c0 HTTP/3: fixed prefixed integer encoding and decoding.
Roman Arutyunyan <arut@nginx.com>
parents: 7949
diff changeset
173 st->shift += 7;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
174 break;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
175 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
176
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
177 goto done;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
178 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
179
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
180 return NGX_AGAIN;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
181
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
182 done:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
183
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
184 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
185 "http3 parse prefix int %uL", st->value);
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
186
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
187 st->state = sw_start;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
188 return NGX_DONE;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
189 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
190
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
191
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
192 ngx_int_t
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
193 ngx_http_v3_parse_headers(ngx_connection_t *c, ngx_http_v3_parse_headers_t *st,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
194 u_char ch)
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
195 {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
196 ngx_int_t rc;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
197 enum {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
198 sw_start = 0,
8087
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
199 sw_type,
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
200 sw_length,
8087
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
201 sw_skip,
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
202 sw_prefix,
7951
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
203 sw_verify,
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
204 sw_header_rep,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
205 sw_done
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
206 };
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
207
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
208 switch (st->state) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
209
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
210 case sw_start:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
211
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
212 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 parse headers");
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
213
8087
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
214 st->state = sw_type;
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
215
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
216 /* fall through */
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
217
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
218 case sw_type:
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
219
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
220 rc = ngx_http_v3_parse_varlen_int(c, &st->vlint, ch);
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
221 if (rc != NGX_DONE) {
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
222 return rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
223 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
224
8087
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
225 st->type = st->vlint.value;
8088
234e9d89ff7f HTTP/3: reject HTTP/2 frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8087
diff changeset
226
8496
278ab0ed24f2 HTTP/3: generate more H3_FRAME_UNEXPECTED.
Roman Arutyunyan <arut@nginx.com>
parents: 8495
diff changeset
227 if (ngx_http_v3_is_v2_frame(st->type)
278ab0ed24f2 HTTP/3: generate more H3_FRAME_UNEXPECTED.
Roman Arutyunyan <arut@nginx.com>
parents: 8495
diff changeset
228 || st->type == NGX_HTTP_V3_FRAME_DATA
278ab0ed24f2 HTTP/3: generate more H3_FRAME_UNEXPECTED.
Roman Arutyunyan <arut@nginx.com>
parents: 8495
diff changeset
229 || st->type == NGX_HTTP_V3_FRAME_GOAWAY
278ab0ed24f2 HTTP/3: generate more H3_FRAME_UNEXPECTED.
Roman Arutyunyan <arut@nginx.com>
parents: 8495
diff changeset
230 || st->type == NGX_HTTP_V3_FRAME_SETTINGS
278ab0ed24f2 HTTP/3: generate more H3_FRAME_UNEXPECTED.
Roman Arutyunyan <arut@nginx.com>
parents: 8495
diff changeset
231 || st->type == NGX_HTTP_V3_FRAME_MAX_PUSH_ID
278ab0ed24f2 HTTP/3: generate more H3_FRAME_UNEXPECTED.
Roman Arutyunyan <arut@nginx.com>
parents: 8495
diff changeset
232 || st->type == NGX_HTTP_V3_FRAME_CANCEL_PUSH
278ab0ed24f2 HTTP/3: generate more H3_FRAME_UNEXPECTED.
Roman Arutyunyan <arut@nginx.com>
parents: 8495
diff changeset
233 || st->type == NGX_HTTP_V3_FRAME_PUSH_PROMISE)
278ab0ed24f2 HTTP/3: generate more H3_FRAME_UNEXPECTED.
Roman Arutyunyan <arut@nginx.com>
parents: 8495
diff changeset
234 {
8088
234e9d89ff7f HTTP/3: reject HTTP/2 frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8087
diff changeset
235 return NGX_HTTP_V3_ERR_FRAME_UNEXPECTED;
234e9d89ff7f HTTP/3: reject HTTP/2 frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8087
diff changeset
236 }
234e9d89ff7f HTTP/3: reject HTTP/2 frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8087
diff changeset
237
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
238 st->state = sw_length;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
239 break;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
240
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
241 case sw_length:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
242
7961
4fd709540daf HTTP/3: put ngx_http_v3_parse_varlen_int() return code in variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7960
diff changeset
243 rc = ngx_http_v3_parse_varlen_int(c, &st->vlint, ch);
4fd709540daf HTTP/3: put ngx_http_v3_parse_varlen_int() return code in variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7960
diff changeset
244 if (rc != NGX_DONE) {
4fd709540daf HTTP/3: put ngx_http_v3_parse_varlen_int() return code in variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7960
diff changeset
245 return rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
246 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
247
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
248 st->length = st->vlint.value;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
249
8087
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
250 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
251 "http3 parse headers type:%ui, len:%ui",
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
252 st->type, st->length);
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
253
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
254 if (st->type != NGX_HTTP_V3_FRAME_HEADERS) {
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
255 st->state = st->length > 0 ? sw_skip : sw_type;
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
256 break;
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
257 }
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
258
8090
351d62300832 HTTP/3: rearranged length check when parsing header.
Roman Arutyunyan <arut@nginx.com>
parents: 8088
diff changeset
259 if (st->length == 0) {
351d62300832 HTTP/3: rearranged length check when parsing header.
Roman Arutyunyan <arut@nginx.com>
parents: 8088
diff changeset
260 return NGX_HTTP_V3_ERR_FRAME_ERROR;
351d62300832 HTTP/3: rearranged length check when parsing header.
Roman Arutyunyan <arut@nginx.com>
parents: 8088
diff changeset
261 }
351d62300832 HTTP/3: rearranged length check when parsing header.
Roman Arutyunyan <arut@nginx.com>
parents: 8088
diff changeset
262
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
263 st->state = sw_prefix;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
264 break;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
265
8087
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
266 case sw_skip:
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
267
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
268 if (--st->length == 0) {
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
269 st->state = sw_type;
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
270 }
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
271
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
272 break;
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
273
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
274 case sw_prefix:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
275
8090
351d62300832 HTTP/3: rearranged length check when parsing header.
Roman Arutyunyan <arut@nginx.com>
parents: 8088
diff changeset
276 if (--st->length == 0) {
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
277 return NGX_HTTP_V3_ERR_FRAME_ERROR;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
278 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
279
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
280 rc = ngx_http_v3_parse_header_block_prefix(c, &st->prefix, ch);
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
281 if (rc != NGX_DONE) {
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
282 return rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
283 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
284
7951
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
285 st->state = sw_verify;
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
286 break;
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
287
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
288 case sw_verify:
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
289
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
290 rc = ngx_http_v3_check_insert_count(c, st->prefix.insert_count);
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
291 if (rc != NGX_OK) {
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
292 return rc;
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
293 }
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
294
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
295 st->state = sw_header_rep;
7951
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
296
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
297 /* fall through */
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
298
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
299 case sw_header_rep:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
300
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
301 rc = ngx_http_v3_parse_header_rep(c, &st->header_rep, st->prefix.base,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
302 ch);
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
303
7962
e02250b55b17 HTTP/3: simplified handling return codes from parse functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7961
diff changeset
304 if (--st->length == 0 && rc == NGX_AGAIN) {
e02250b55b17 HTTP/3: simplified handling return codes from parse functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7961
diff changeset
305 return NGX_HTTP_V3_ERR_FRAME_ERROR;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
306 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
307
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
308 if (rc != NGX_DONE) {
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
309 return rc;
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
310 }
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
311
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
312 if (st->length == 0) {
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
313 goto done;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
314 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
315
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
316 return NGX_OK;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
317 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
318
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
319 return NGX_AGAIN;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
320
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
321 done:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
322
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
323 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 parse headers done");
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
324
7951
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
325 if (st->prefix.insert_count > 0) {
8431
0981329169ea HTTP/3: renamed ngx_http_v3_client_XXX() functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8425
diff changeset
326 if (ngx_http_v3_send_ack_header(c, c->quic->id) != NGX_OK) {
7951
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
327 return NGX_ERROR;
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
328 }
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
329 }
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
330
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
331 st->state = sw_start;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
332 return NGX_DONE;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
333 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
334
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
335
8259
ab6aaa8e86b0 HTTP/3: staticize internal parsing functions.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8233
diff changeset
336 static ngx_int_t
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
337 ngx_http_v3_parse_header_block_prefix(ngx_connection_t *c,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
338 ngx_http_v3_parse_header_block_prefix_t *st, u_char ch)
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
339 {
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
340 ngx_int_t rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
341 enum {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
342 sw_start = 0,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
343 sw_req_insert_count,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
344 sw_delta_base,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
345 sw_read_delta_base
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
346 };
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
347
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
348 switch (st->state) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
349
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
350 case sw_start:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
351
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
352 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
353 "http3 parse header block prefix");
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
354
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
355 st->state = sw_req_insert_count;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
356
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
357 /* fall through */
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
358
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
359 case sw_req_insert_count:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
360
7959
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
361 rc = ngx_http_v3_parse_prefix_int(c, &st->pint, 8, ch);
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
362 if (rc != NGX_DONE) {
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
363 return rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
364 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
365
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
366 st->insert_count = st->pint.value;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
367 st->state = sw_delta_base;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
368 break;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
369
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
370 case sw_delta_base:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
371
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
372 st->sign = (ch & 0x80) ? 1 : 0;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
373 st->state = sw_read_delta_base;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
374
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
375 /* fall through */
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
376
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
377 case sw_read_delta_base:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
378
7959
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
379 rc = ngx_http_v3_parse_prefix_int(c, &st->pint, 7, ch);
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
380 if (rc != NGX_DONE) {
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
381 return rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
382 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
383
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
384 st->delta_base = st->pint.value;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
385 goto done;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
386 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
387
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
388 return NGX_AGAIN;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
389
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
390 done:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
391
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
392 rc = ngx_http_v3_decode_insert_count(c, &st->insert_count);
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
393 if (rc != NGX_OK) {
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
394 return rc;
7951
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
395 }
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
396
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
397 if (st->sign) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
398 st->base = st->insert_count - st->delta_base - 1;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
399 } else {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
400 st->base = st->insert_count + st->delta_base;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
401 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
402
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
403 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, c->log, 0,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
404 "http3 parse header block prefix done "
7996
d2f716e668e8 Fixed format specifiers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7962
diff changeset
405 "insert_count:%ui, sign:%ui, delta_base:%ui, base:%ui",
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
406 st->insert_count, st->sign, st->delta_base, st->base);
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
407
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
408 st->state = sw_start;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
409 return NGX_DONE;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
410 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
411
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
412
8259
ab6aaa8e86b0 HTTP/3: staticize internal parsing functions.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8233
diff changeset
413 static ngx_int_t
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
414 ngx_http_v3_parse_header_rep(ngx_connection_t *c,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
415 ngx_http_v3_parse_header_rep_t *st, ngx_uint_t base, u_char ch)
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
416 {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
417 ngx_int_t rc;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
418 enum {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
419 sw_start = 0,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
420 sw_header_ri,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
421 sw_header_lri,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
422 sw_header_l,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
423 sw_header_pbi,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
424 sw_header_lpbi
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
425 };
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
426
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
427 if (st->state == sw_start) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
428
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
429 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
430 "http3 parse header representation");
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
431
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
432 ngx_memzero(&st->header, sizeof(ngx_http_v3_parse_header_t));
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
433
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
434 st->header.base = base;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
435
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
436 if (ch & 0x80) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
437 /* Indexed Header Field */
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
438
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
439 st->state = sw_header_ri;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
440
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
441 } else if (ch & 0x40) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
442 /* Literal Header Field With Name Reference */
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
443
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
444 st->state = sw_header_lri;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
445
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
446 } else if (ch & 0x20) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
447 /* Literal Header Field Without Name Reference */
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
448
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
449 st->state = sw_header_l;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
450
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
451 } else if (ch & 0x10) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
452 /* Indexed Header Field With Post-Base Index */
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
453
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
454 st->state = sw_header_pbi;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
455
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
456 } else {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
457 /* Literal Header Field With Post-Base Name Reference */
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
458
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
459 st->state = sw_header_lpbi;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
460 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
461 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
462
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
463 switch (st->state) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
464
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
465 case sw_header_ri:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
466 rc = ngx_http_v3_parse_header_ri(c, &st->header, ch);
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
467 break;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
468
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
469 case sw_header_lri:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
470 rc = ngx_http_v3_parse_header_lri(c, &st->header, ch);
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
471 break;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
472
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
473 case sw_header_l:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
474 rc = ngx_http_v3_parse_header_l(c, &st->header, ch);
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
475 break;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
476
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
477 case sw_header_pbi:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
478 rc = ngx_http_v3_parse_header_pbi(c, &st->header, ch);
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
479 break;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
480
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
481 case sw_header_lpbi:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
482 rc = ngx_http_v3_parse_header_lpbi(c, &st->header, ch);
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
483 break;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
484
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
485 default:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
486 rc = NGX_OK;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
487 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
488
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
489 if (rc != NGX_DONE) {
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
490 return rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
491 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
492
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
493 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
494 "http3 parse header representation done");
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
495
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
496 st->state = sw_start;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
497 return NGX_DONE;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
498 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
499
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
500
8259
ab6aaa8e86b0 HTTP/3: staticize internal parsing functions.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8233
diff changeset
501 static ngx_int_t
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
502 ngx_http_v3_parse_literal(ngx_connection_t *c, ngx_http_v3_parse_literal_t *st,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
503 u_char ch)
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
504 {
8317
ae2e68f206f9 HTTP/3: removed http3_max_field_size.
Roman Arutyunyan <arut@nginx.com>
parents: 8259
diff changeset
505 ngx_uint_t n;
ae2e68f206f9 HTTP/3: removed http3_max_field_size.
Roman Arutyunyan <arut@nginx.com>
parents: 8259
diff changeset
506 ngx_http_core_srv_conf_t *cscf;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
507 enum {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
508 sw_start = 0,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
509 sw_value
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
510 };
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
511
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
512 switch (st->state) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
513
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
514 case sw_start:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
515
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
516 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
517 "http3 parse literal huff:%ui, len:%ui",
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
518 st->huffman, st->length);
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
519
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
520 n = st->length;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
521
8317
ae2e68f206f9 HTTP/3: removed http3_max_field_size.
Roman Arutyunyan <arut@nginx.com>
parents: 8259
diff changeset
522 cscf = ngx_http_v3_get_module_srv_conf(c, ngx_http_core_module);
7949
032cb35ce758 HTTP/3: http3_max_field_size directive to limit string size.
Roman Arutyunyan <arut@nginx.com>
parents: 7761
diff changeset
523
8317
ae2e68f206f9 HTTP/3: removed http3_max_field_size.
Roman Arutyunyan <arut@nginx.com>
parents: 8259
diff changeset
524 if (n > cscf->large_client_header_buffers.size) {
7952
a7f64438aa3c HTTP/3: downgraded literal size error level to NGX_LOG_INFO.
Roman Arutyunyan <arut@nginx.com>
parents: 7951
diff changeset
525 ngx_log_error(NGX_LOG_INFO, c->log, 0,
8317
ae2e68f206f9 HTTP/3: removed http3_max_field_size.
Roman Arutyunyan <arut@nginx.com>
parents: 8259
diff changeset
526 "client sent too large header field");
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
527 return NGX_HTTP_V3_ERR_EXCESSIVE_LOAD;
7949
032cb35ce758 HTTP/3: http3_max_field_size directive to limit string size.
Roman Arutyunyan <arut@nginx.com>
parents: 7761
diff changeset
528 }
032cb35ce758 HTTP/3: http3_max_field_size directive to limit string size.
Roman Arutyunyan <arut@nginx.com>
parents: 7761
diff changeset
529
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
530 if (st->huffman) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
531 n = n * 8 / 5;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
532 st->huffstate = 0;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
533 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
534
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
535 st->last = ngx_pnalloc(c->pool, n + 1);
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
536 if (st->last == NULL) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
537 return NGX_ERROR;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
538 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
539
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
540 st->value.data = st->last;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
541 st->state = sw_value;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
542
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
543 /* fall through */
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
544
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
545 case sw_value:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
546
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
547 if (st->huffman) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
548 if (ngx_http_v2_huff_decode(&st->huffstate, &ch, 1, &st->last,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
549 st->length == 1, c->log)
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
550 != NGX_OK)
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
551 {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
552 return NGX_ERROR;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
553 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
554
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
555 } else {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
556 *st->last++ = ch;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
557 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
558
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
559 if (--st->length) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
560 break;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
561 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
562
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
563 st->value.len = st->last - st->value.data;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
564 *st->last = '\0';
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
565 goto done;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
566 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
567
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
568 return NGX_AGAIN;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
569
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
570 done:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
571
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
572 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
573 "http3 parse literal done \"%V\"", &st->value);
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
574
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
575 st->state = sw_start;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
576 return NGX_DONE;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
577 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
578
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
579
8259
ab6aaa8e86b0 HTTP/3: staticize internal parsing functions.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8233
diff changeset
580 static ngx_int_t
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
581 ngx_http_v3_parse_header_ri(ngx_connection_t *c, ngx_http_v3_parse_header_t *st,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
582 u_char ch)
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
583 {
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
584 ngx_int_t rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
585 enum {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
586 sw_start = 0,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
587 sw_index
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
588 };
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
589
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
590 switch (st->state) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
591
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
592 case sw_start:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
593
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
594 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 parse header ri");
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
595
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
596 st->dynamic = (ch & 0x40) ? 0 : 1;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
597 st->state = sw_index;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
598
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
599 /* fall through */
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
600
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
601 case sw_index:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
602
7959
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
603 rc = ngx_http_v3_parse_prefix_int(c, &st->pint, 6, ch);
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
604 if (rc != NGX_DONE) {
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
605 return rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
606 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
607
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
608 st->index = st->pint.value;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
609 goto done;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
610 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
611
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
612 return NGX_AGAIN;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
613
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
614 done:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
615
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
616 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
617 "http3 parse header ri done %s%ui]",
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
618 st->dynamic ? "dynamic[-" : "static[", st->index);
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
619
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
620 if (st->dynamic) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
621 st->index = st->base - st->index - 1;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
622 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
623
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
624 rc = ngx_http_v3_parse_lookup(c, st->dynamic, st->index, &st->name,
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
625 &st->value);
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
626 if (rc != NGX_OK) {
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
627 return rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
628 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
629
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
630 st->state = sw_start;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
631 return NGX_DONE;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
632 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
633
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
634
8259
ab6aaa8e86b0 HTTP/3: staticize internal parsing functions.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8233
diff changeset
635 static ngx_int_t
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
636 ngx_http_v3_parse_header_lri(ngx_connection_t *c,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
637 ngx_http_v3_parse_header_t *st, u_char ch)
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
638 {
7951
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
639 ngx_int_t rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
640 enum {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
641 sw_start = 0,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
642 sw_index,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
643 sw_value_len,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
644 sw_read_value_len,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
645 sw_value
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
646 };
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
647
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
648 switch (st->state) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
649
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
650 case sw_start:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
651
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
652 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 parse header lri");
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
653
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
654 st->dynamic = (ch & 0x10) ? 0 : 1;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
655 st->state = sw_index;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
656
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
657 /* fall through */
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
658
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
659 case sw_index:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
660
7959
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
661 rc = ngx_http_v3_parse_prefix_int(c, &st->pint, 4, ch);
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
662 if (rc != NGX_DONE) {
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
663 return rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
664 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
665
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
666 st->index = st->pint.value;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
667 st->state = sw_value_len;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
668 break;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
669
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
670 case sw_value_len:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
671
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
672 st->literal.huffman = (ch & 0x80) ? 1 : 0;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
673 st->state = sw_read_value_len;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
674
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
675 /* fall through */
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
676
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
677 case sw_read_value_len:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
678
7959
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
679 rc = ngx_http_v3_parse_prefix_int(c, &st->pint, 7, ch);
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
680 if (rc != NGX_DONE) {
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
681 return rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
682 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
683
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
684 st->literal.length = st->pint.value;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
685 if (st->literal.length == 0) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
686 goto done;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
687 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
688
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
689 st->state = sw_value;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
690 break;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
691
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
692 case sw_value:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
693
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
694 rc = ngx_http_v3_parse_literal(c, &st->literal, ch);
7960
5611bbb852ce HTTP/3: simplifed handling ngx_http_v3_parse_literal() return code.
Roman Arutyunyan <arut@nginx.com>
parents: 7959
diff changeset
695 if (rc != NGX_DONE) {
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
696 return rc;
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
697 }
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
698
7960
5611bbb852ce HTTP/3: simplifed handling ngx_http_v3_parse_literal() return code.
Roman Arutyunyan <arut@nginx.com>
parents: 7959
diff changeset
699 st->value = st->literal.value;
5611bbb852ce HTTP/3: simplifed handling ngx_http_v3_parse_literal() return code.
Roman Arutyunyan <arut@nginx.com>
parents: 7959
diff changeset
700 goto done;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
701 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
702
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
703 return NGX_AGAIN;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
704
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
705 done:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
706
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
707 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, c->log, 0,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
708 "http3 parse header lri done %s%ui] \"%V\"",
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
709 st->dynamic ? "dynamic[-" : "static[",
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
710 st->index, &st->value);
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
711
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
712 if (st->dynamic) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
713 st->index = st->base - st->index - 1;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
714 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
715
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
716 rc = ngx_http_v3_parse_lookup(c, st->dynamic, st->index, &st->name, NULL);
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
717 if (rc != NGX_OK) {
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
718 return rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
719 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
720
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
721 st->state = sw_start;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
722 return NGX_DONE;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
723 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
724
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
725
8259
ab6aaa8e86b0 HTTP/3: staticize internal parsing functions.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8233
diff changeset
726 static ngx_int_t
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
727 ngx_http_v3_parse_header_l(ngx_connection_t *c,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
728 ngx_http_v3_parse_header_t *st, u_char ch)
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
729 {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
730 ngx_int_t rc;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
731 enum {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
732 sw_start = 0,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
733 sw_name_len,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
734 sw_name,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
735 sw_value_len,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
736 sw_read_value_len,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
737 sw_value
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
738 };
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
739
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
740 switch (st->state) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
741
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
742 case sw_start:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
743
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
744 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 parse header l");
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
745
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
746 st->literal.huffman = (ch & 0x08) ? 1 : 0;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
747 st->state = sw_name_len;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
748
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
749 /* fall through */
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
750
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
751 case sw_name_len:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
752
7959
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
753 rc = ngx_http_v3_parse_prefix_int(c, &st->pint, 3, ch);
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
754 if (rc != NGX_DONE) {
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
755 return rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
756 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
757
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
758 st->literal.length = st->pint.value;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
759 if (st->literal.length == 0) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
760 return NGX_ERROR;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
761 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
762
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
763 st->state = sw_name;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
764 break;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
765
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
766 case sw_name:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
767
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
768 rc = ngx_http_v3_parse_literal(c, &st->literal, ch);
7960
5611bbb852ce HTTP/3: simplifed handling ngx_http_v3_parse_literal() return code.
Roman Arutyunyan <arut@nginx.com>
parents: 7959
diff changeset
769 if (rc != NGX_DONE) {
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
770 return rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
771 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
772
7960
5611bbb852ce HTTP/3: simplifed handling ngx_http_v3_parse_literal() return code.
Roman Arutyunyan <arut@nginx.com>
parents: 7959
diff changeset
773 st->name = st->literal.value;
5611bbb852ce HTTP/3: simplifed handling ngx_http_v3_parse_literal() return code.
Roman Arutyunyan <arut@nginx.com>
parents: 7959
diff changeset
774 st->state = sw_value_len;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
775 break;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
776
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
777 case sw_value_len:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
778
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
779 st->literal.huffman = (ch & 0x80) ? 1 : 0;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
780 st->state = sw_read_value_len;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
781
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
782 /* fall through */
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
783
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
784 case sw_read_value_len:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
785
7959
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
786 rc = ngx_http_v3_parse_prefix_int(c, &st->pint, 7, ch);
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
787 if (rc != NGX_DONE) {
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
788 return rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
789 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
790
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
791 st->literal.length = st->pint.value;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
792 if (st->literal.length == 0) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
793 goto done;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
794 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
795
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
796 st->state = sw_value;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
797 break;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
798
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
799 case sw_value:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
800
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
801 rc = ngx_http_v3_parse_literal(c, &st->literal, ch);
7960
5611bbb852ce HTTP/3: simplifed handling ngx_http_v3_parse_literal() return code.
Roman Arutyunyan <arut@nginx.com>
parents: 7959
diff changeset
802 if (rc != NGX_DONE) {
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
803 return rc;
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
804 }
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
805
7960
5611bbb852ce HTTP/3: simplifed handling ngx_http_v3_parse_literal() return code.
Roman Arutyunyan <arut@nginx.com>
parents: 7959
diff changeset
806 st->value = st->literal.value;
5611bbb852ce HTTP/3: simplifed handling ngx_http_v3_parse_literal() return code.
Roman Arutyunyan <arut@nginx.com>
parents: 7959
diff changeset
807 goto done;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
808 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
809
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
810 return NGX_AGAIN;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
811
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
812 done:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
813
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
814 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
815 "http3 parse header l done \"%V\" \"%V\"",
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
816 &st->name, &st->value);
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
817
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
818 st->state = sw_start;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
819 return NGX_DONE;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
820 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
821
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
822
8259
ab6aaa8e86b0 HTTP/3: staticize internal parsing functions.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8233
diff changeset
823 static ngx_int_t
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
824 ngx_http_v3_parse_header_pbi(ngx_connection_t *c,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
825 ngx_http_v3_parse_header_t *st, u_char ch)
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
826 {
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
827 ngx_int_t rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
828 enum {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
829 sw_start = 0,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
830 sw_index
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
831 };
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
832
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
833 switch (st->state) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
834
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
835 case sw_start:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
836
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
837 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 parse header pbi");
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
838
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
839 st->state = sw_index;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
840
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
841 /* fall through */
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
842
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
843 case sw_index:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
844
7959
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
845 rc = ngx_http_v3_parse_prefix_int(c, &st->pint, 4, ch);
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
846 if (rc != NGX_DONE) {
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
847 return rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
848 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
849
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
850 st->index = st->pint.value;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
851 goto done;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
852 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
853
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
854 return NGX_AGAIN;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
855
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
856 done:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
857
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
858 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
859 "http3 parse header pbi done dynamic[+%ui]", st->index);
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
860
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
861 rc = ngx_http_v3_parse_lookup(c, 1, st->base + st->index, &st->name,
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
862 &st->value);
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
863 if (rc != NGX_OK) {
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
864 return rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
865 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
866
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
867 st->state = sw_start;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
868 return NGX_DONE;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
869 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
870
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
871
8259
ab6aaa8e86b0 HTTP/3: staticize internal parsing functions.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8233
diff changeset
872 static ngx_int_t
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
873 ngx_http_v3_parse_header_lpbi(ngx_connection_t *c,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
874 ngx_http_v3_parse_header_t *st, u_char ch)
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
875 {
7951
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
876 ngx_int_t rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
877 enum {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
878 sw_start = 0,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
879 sw_index,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
880 sw_value_len,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
881 sw_read_value_len,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
882 sw_value
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
883 };
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
884
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
885 switch (st->state) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
886
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
887 case sw_start:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
888
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
889 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
890 "http3 parse header lpbi");
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
891
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
892 st->state = sw_index;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
893
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
894 /* fall through */
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
895
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
896 case sw_index:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
897
7959
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
898 rc = ngx_http_v3_parse_prefix_int(c, &st->pint, 3, ch);
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
899 if (rc != NGX_DONE) {
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
900 return rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
901 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
902
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
903 st->index = st->pint.value;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
904 st->state = sw_value_len;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
905 break;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
906
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
907 case sw_value_len:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
908
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
909 st->literal.huffman = (ch & 0x80) ? 1 : 0;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
910 st->state = sw_read_value_len;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
911
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
912 /* fall through */
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
913
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
914 case sw_read_value_len:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
915
7959
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
916 rc = ngx_http_v3_parse_prefix_int(c, &st->pint, 7, ch);
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
917 if (rc != NGX_DONE) {
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
918 return rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
919 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
920
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
921 st->literal.length = st->pint.value;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
922 if (st->literal.length == 0) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
923 goto done;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
924 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
925
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
926 st->state = sw_value;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
927 break;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
928
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
929 case sw_value:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
930
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
931 rc = ngx_http_v3_parse_literal(c, &st->literal, ch);
7960
5611bbb852ce HTTP/3: simplifed handling ngx_http_v3_parse_literal() return code.
Roman Arutyunyan <arut@nginx.com>
parents: 7959
diff changeset
932 if (rc != NGX_DONE) {
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
933 return rc;
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
934 }
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
935
7960
5611bbb852ce HTTP/3: simplifed handling ngx_http_v3_parse_literal() return code.
Roman Arutyunyan <arut@nginx.com>
parents: 7959
diff changeset
936 st->value = st->literal.value;
5611bbb852ce HTTP/3: simplifed handling ngx_http_v3_parse_literal() return code.
Roman Arutyunyan <arut@nginx.com>
parents: 7959
diff changeset
937 goto done;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
938 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
939
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
940 return NGX_AGAIN;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
941
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
942 done:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
943
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
944 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
945 "http3 parse header lpbi done dynamic[+%ui] \"%V\"",
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
946 st->index, &st->value);
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
947
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
948 rc = ngx_http_v3_parse_lookup(c, 1, st->base + st->index, &st->name, NULL);
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
949 if (rc != NGX_OK) {
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
950 return rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
951 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
952
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
953 st->state = sw_start;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
954 return NGX_DONE;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
955 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
956
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
957
7951
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
958 static ngx_int_t
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
959 ngx_http_v3_parse_lookup(ngx_connection_t *c, ngx_uint_t dynamic,
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
960 ngx_uint_t index, ngx_str_t *name, ngx_str_t *value)
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
961 {
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
962 u_char *p;
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
963
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
964 if (!dynamic) {
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
965 if (ngx_http_v3_lookup_static(c, index, name, value) != NGX_OK) {
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
966 return NGX_HTTP_V3_ERR_DECOMPRESSION_FAILED;
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
967 }
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
968
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
969 return NGX_OK;
7951
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
970 }
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
971
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
972 if (ngx_http_v3_lookup(c, index, name, value) != NGX_OK) {
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
973 return NGX_HTTP_V3_ERR_DECOMPRESSION_FAILED;
7951
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
974 }
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
975
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
976 if (name) {
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
977 p = ngx_pnalloc(c->pool, name->len + 1);
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
978 if (p == NULL) {
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
979 return NGX_ERROR;
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
980 }
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
981
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
982 ngx_memcpy(p, name->data, name->len);
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
983 p[name->len] = '\0';
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
984 name->data = p;
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
985 }
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
986
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
987 if (value) {
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
988 p = ngx_pnalloc(c->pool, value->len + 1);
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
989 if (p == NULL) {
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
990 return NGX_ERROR;
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
991 }
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
992
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
993 ngx_memcpy(p, value->data, value->len);
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
994 p[value->len] = '\0';
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
995 value->data = p;
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
996 }
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
997
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
998 return NGX_OK;
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
999 }
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
1000
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
1001
8432
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1002 static ngx_int_t
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1003 ngx_http_v3_parse_control(ngx_connection_t *c, ngx_http_v3_parse_control_t *st,
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1004 u_char ch)
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1005 {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1006 ngx_int_t rc;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1007 enum {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1008 sw_start = 0,
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
1009 sw_first_type,
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1010 sw_type,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1011 sw_length,
8015
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8010
diff changeset
1012 sw_cancel_push,
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1013 sw_settings,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1014 sw_max_push_id,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1015 sw_skip
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1016 };
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1017
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1018 switch (st->state) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1019
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1020 case sw_start:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1021
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1022 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 parse control");
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1023
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
1024 st->state = sw_first_type;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1025
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1026 /* fall through */
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1027
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
1028 case sw_first_type:
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1029 case sw_type:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1030
7961
4fd709540daf HTTP/3: put ngx_http_v3_parse_varlen_int() return code in variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7960
diff changeset
1031 rc = ngx_http_v3_parse_varlen_int(c, &st->vlint, ch);
4fd709540daf HTTP/3: put ngx_http_v3_parse_varlen_int() return code in variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7960
diff changeset
1032 if (rc != NGX_DONE) {
4fd709540daf HTTP/3: put ngx_http_v3_parse_varlen_int() return code in variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7960
diff changeset
1033 return rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1034 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1035
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1036 st->type = st->vlint.value;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1037
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1038 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1039 "http3 parse frame type:%ui", st->type);
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1040
8495
ba5977b38b2e HTTP/3: reordered H3_MISSING_SETTINGS and H3_FRAME_UNEXPECTED.
Roman Arutyunyan <arut@nginx.com>
parents: 8491
diff changeset
1041 if (st->state == sw_first_type
ba5977b38b2e HTTP/3: reordered H3_MISSING_SETTINGS and H3_FRAME_UNEXPECTED.
Roman Arutyunyan <arut@nginx.com>
parents: 8491
diff changeset
1042 && st->type != NGX_HTTP_V3_FRAME_SETTINGS)
ba5977b38b2e HTTP/3: reordered H3_MISSING_SETTINGS and H3_FRAME_UNEXPECTED.
Roman Arutyunyan <arut@nginx.com>
parents: 8491
diff changeset
1043 {
ba5977b38b2e HTTP/3: reordered H3_MISSING_SETTINGS and H3_FRAME_UNEXPECTED.
Roman Arutyunyan <arut@nginx.com>
parents: 8491
diff changeset
1044 return NGX_HTTP_V3_ERR_MISSING_SETTINGS;
ba5977b38b2e HTTP/3: reordered H3_MISSING_SETTINGS and H3_FRAME_UNEXPECTED.
Roman Arutyunyan <arut@nginx.com>
parents: 8491
diff changeset
1045 }
ba5977b38b2e HTTP/3: reordered H3_MISSING_SETTINGS and H3_FRAME_UNEXPECTED.
Roman Arutyunyan <arut@nginx.com>
parents: 8491
diff changeset
1046
8496
278ab0ed24f2 HTTP/3: generate more H3_FRAME_UNEXPECTED.
Roman Arutyunyan <arut@nginx.com>
parents: 8495
diff changeset
1047 if (st->state != sw_first_type
278ab0ed24f2 HTTP/3: generate more H3_FRAME_UNEXPECTED.
Roman Arutyunyan <arut@nginx.com>
parents: 8495
diff changeset
1048 && st->type == NGX_HTTP_V3_FRAME_SETTINGS)
278ab0ed24f2 HTTP/3: generate more H3_FRAME_UNEXPECTED.
Roman Arutyunyan <arut@nginx.com>
parents: 8495
diff changeset
1049 {
278ab0ed24f2 HTTP/3: generate more H3_FRAME_UNEXPECTED.
Roman Arutyunyan <arut@nginx.com>
parents: 8495
diff changeset
1050 return NGX_HTTP_V3_ERR_FRAME_UNEXPECTED;
278ab0ed24f2 HTTP/3: generate more H3_FRAME_UNEXPECTED.
Roman Arutyunyan <arut@nginx.com>
parents: 8495
diff changeset
1051 }
278ab0ed24f2 HTTP/3: generate more H3_FRAME_UNEXPECTED.
Roman Arutyunyan <arut@nginx.com>
parents: 8495
diff changeset
1052
8425
687445803d0f HTTP/3: reject empty DATA and HEADERS frames on control stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8422
diff changeset
1053 if (ngx_http_v3_is_v2_frame(st->type)
687445803d0f HTTP/3: reject empty DATA and HEADERS frames on control stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8422
diff changeset
1054 || st->type == NGX_HTTP_V3_FRAME_DATA
8496
278ab0ed24f2 HTTP/3: generate more H3_FRAME_UNEXPECTED.
Roman Arutyunyan <arut@nginx.com>
parents: 8495
diff changeset
1055 || st->type == NGX_HTTP_V3_FRAME_HEADERS
278ab0ed24f2 HTTP/3: generate more H3_FRAME_UNEXPECTED.
Roman Arutyunyan <arut@nginx.com>
parents: 8495
diff changeset
1056 || st->type == NGX_HTTP_V3_FRAME_PUSH_PROMISE)
8425
687445803d0f HTTP/3: reject empty DATA and HEADERS frames on control stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8422
diff changeset
1057 {
8088
234e9d89ff7f HTTP/3: reject HTTP/2 frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8087
diff changeset
1058 return NGX_HTTP_V3_ERR_FRAME_UNEXPECTED;
234e9d89ff7f HTTP/3: reject HTTP/2 frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8087
diff changeset
1059 }
234e9d89ff7f HTTP/3: reject HTTP/2 frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8087
diff changeset
1060
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1061 st->state = sw_length;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1062 break;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1063
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1064 case sw_length:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1065
7961
4fd709540daf HTTP/3: put ngx_http_v3_parse_varlen_int() return code in variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7960
diff changeset
1066 rc = ngx_http_v3_parse_varlen_int(c, &st->vlint, ch);
4fd709540daf HTTP/3: put ngx_http_v3_parse_varlen_int() return code in variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7960
diff changeset
1067 if (rc != NGX_DONE) {
4fd709540daf HTTP/3: put ngx_http_v3_parse_varlen_int() return code in variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7960
diff changeset
1068 return rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1069 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1070
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1071 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1072 "http3 parse frame len:%uL", st->vlint.value);
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1073
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1074 st->length = st->vlint.value;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1075 if (st->length == 0) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1076 st->state = sw_type;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1077 break;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1078 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1079
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1080 switch (st->type) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1081
8015
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8010
diff changeset
1082 case NGX_HTTP_V3_FRAME_CANCEL_PUSH:
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8010
diff changeset
1083 st->state = sw_cancel_push;
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8010
diff changeset
1084 break;
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8010
diff changeset
1085
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1086 case NGX_HTTP_V3_FRAME_SETTINGS:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1087 st->state = sw_settings;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1088 break;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1089
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1090 case NGX_HTTP_V3_FRAME_MAX_PUSH_ID:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1091 st->state = sw_max_push_id;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1092 break;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1093
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1094 default:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1095 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1096 "http3 parse skip unknown frame");
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1097 st->state = sw_skip;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1098 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1099
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1100 break;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1101
8015
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8010
diff changeset
1102 case sw_cancel_push:
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8010
diff changeset
1103
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8010
diff changeset
1104 rc = ngx_http_v3_parse_varlen_int(c, &st->vlint, ch);
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8010
diff changeset
1105
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8010
diff changeset
1106 if (--st->length == 0 && rc == NGX_AGAIN) {
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8010
diff changeset
1107 return NGX_HTTP_V3_ERR_FRAME_ERROR;
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8010
diff changeset
1108 }
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8010
diff changeset
1109
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8010
diff changeset
1110 if (rc != NGX_DONE) {
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8010
diff changeset
1111 return rc;
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8010
diff changeset
1112 }
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8010
diff changeset
1113
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8010
diff changeset
1114 rc = ngx_http_v3_cancel_push(c, st->vlint.value);
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8010
diff changeset
1115 if (rc != NGX_OK) {
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8010
diff changeset
1116 return rc;
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8010
diff changeset
1117 }
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8010
diff changeset
1118
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8010
diff changeset
1119 st->state = sw_type;
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8010
diff changeset
1120 break;
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8010
diff changeset
1121
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1122 case sw_settings:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1123
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1124 rc = ngx_http_v3_parse_settings(c, &st->settings, ch);
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1125
7962
e02250b55b17 HTTP/3: simplified handling return codes from parse functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7961
diff changeset
1126 if (--st->length == 0 && rc == NGX_AGAIN) {
e02250b55b17 HTTP/3: simplified handling return codes from parse functions.
Roman Arutyunyan <arut@nginx.com>
parents: 7961
diff changeset
1127 return NGX_HTTP_V3_ERR_SETTINGS_ERROR;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1128 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1129
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1130 if (rc != NGX_DONE) {
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
1131 return rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1132 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1133
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
1134 if (st->length == 0) {
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
1135 st->state = sw_type;
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
1136 }
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
1137
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1138 break;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1139
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1140 case sw_max_push_id:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1141
7961
4fd709540daf HTTP/3: put ngx_http_v3_parse_varlen_int() return code in variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7960
diff changeset
1142 rc = ngx_http_v3_parse_varlen_int(c, &st->vlint, ch);
8015
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8010
diff changeset
1143
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8010
diff changeset
1144 if (--st->length == 0 && rc == NGX_AGAIN) {
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8010
diff changeset
1145 return NGX_HTTP_V3_ERR_FRAME_ERROR;
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8010
diff changeset
1146 }
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8010
diff changeset
1147
7961
4fd709540daf HTTP/3: put ngx_http_v3_parse_varlen_int() return code in variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7960
diff changeset
1148 if (rc != NGX_DONE) {
4fd709540daf HTTP/3: put ngx_http_v3_parse_varlen_int() return code in variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7960
diff changeset
1149 return rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1150 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1151
8015
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8010
diff changeset
1152 rc = ngx_http_v3_set_max_push_id(c, st->vlint.value);
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8010
diff changeset
1153 if (rc != NGX_OK) {
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8010
diff changeset
1154 return rc;
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8010
diff changeset
1155 }
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1156
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1157 st->state = sw_type;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1158 break;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1159
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1160 case sw_skip:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1161
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1162 if (--st->length == 0) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1163 st->state = sw_type;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1164 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1165
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1166 break;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1167 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1168
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1169 return NGX_AGAIN;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1170 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1171
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1172
8259
ab6aaa8e86b0 HTTP/3: staticize internal parsing functions.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8233
diff changeset
1173 static ngx_int_t
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1174 ngx_http_v3_parse_settings(ngx_connection_t *c,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1175 ngx_http_v3_parse_settings_t *st, u_char ch)
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1176 {
7961
4fd709540daf HTTP/3: put ngx_http_v3_parse_varlen_int() return code in variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7960
diff changeset
1177 ngx_int_t rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1178 enum {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1179 sw_start = 0,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1180 sw_id,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1181 sw_value
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1182 };
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1183
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1184 switch (st->state) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1185
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1186 case sw_start:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1187
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1188 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 parse settings");
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1189
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1190 st->state = sw_id;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1191
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1192 /* fall through */
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1193
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1194 case sw_id:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1195
7961
4fd709540daf HTTP/3: put ngx_http_v3_parse_varlen_int() return code in variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7960
diff changeset
1196 rc = ngx_http_v3_parse_varlen_int(c, &st->vlint, ch);
4fd709540daf HTTP/3: put ngx_http_v3_parse_varlen_int() return code in variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7960
diff changeset
1197 if (rc != NGX_DONE) {
4fd709540daf HTTP/3: put ngx_http_v3_parse_varlen_int() return code in variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7960
diff changeset
1198 return rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1199 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1200
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1201 st->id = st->vlint.value;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1202 st->state = sw_value;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1203 break;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1204
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1205 case sw_value:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1206
7961
4fd709540daf HTTP/3: put ngx_http_v3_parse_varlen_int() return code in variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7960
diff changeset
1207 rc = ngx_http_v3_parse_varlen_int(c, &st->vlint, ch);
4fd709540daf HTTP/3: put ngx_http_v3_parse_varlen_int() return code in variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7960
diff changeset
1208 if (rc != NGX_DONE) {
4fd709540daf HTTP/3: put ngx_http_v3_parse_varlen_int() return code in variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7960
diff changeset
1209 return rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1210 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1211
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1212 if (ngx_http_v3_set_param(c, st->id, st->vlint.value) != NGX_OK) {
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
1213 return NGX_HTTP_V3_ERR_SETTINGS_ERROR;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1214 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1215
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1216 goto done;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1217 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1218
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1219 return NGX_AGAIN;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1220
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1221 done:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1222
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1223 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 parse settings done");
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1224
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1225 st->state = sw_start;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1226 return NGX_DONE;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1227 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1228
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1229
8432
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1230 static ngx_int_t
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1231 ngx_http_v3_parse_encoder(ngx_connection_t *c, ngx_http_v3_parse_encoder_t *st,
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1232 u_char ch)
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1233 {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1234 ngx_int_t rc;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1235 enum {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1236 sw_start = 0,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1237 sw_inr,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1238 sw_iwnr,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1239 sw_capacity,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1240 sw_duplicate
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1241 };
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1242
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1243 if (st->state == sw_start) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1244
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1245 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1246 "http3 parse encoder instruction");
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1247
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1248 if (ch & 0x80) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1249 /* Insert With Name Reference */
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1250
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1251 st->state = sw_inr;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1252
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1253 } else if (ch & 0x40) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1254 /* Insert Without Name Reference */
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1255
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1256 st->state = sw_iwnr;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1257
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1258 } else if (ch & 0x20) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1259 /* Set Dynamic Table Capacity */
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1260
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1261 st->state = sw_capacity;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1262
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1263 } else {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1264 /* Duplicate */
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1265
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1266 st->state = sw_duplicate;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1267 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1268 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1269
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1270 switch (st->state) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1271
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1272 case sw_inr:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1273
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1274 rc = ngx_http_v3_parse_header_inr(c, &st->header, ch);
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1275 if (rc != NGX_DONE) {
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
1276 return rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1277 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1278
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1279 goto done;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1280
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1281 case sw_iwnr:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1282
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1283 rc = ngx_http_v3_parse_header_iwnr(c, &st->header, ch);
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1284 if (rc != NGX_DONE) {
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
1285 return rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1286 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1287
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1288 goto done;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1289
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1290 case sw_capacity:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1291
7959
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
1292 rc = ngx_http_v3_parse_prefix_int(c, &st->pint, 5, ch);
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
1293 if (rc != NGX_DONE) {
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
1294 return rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1295 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1296
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
1297 rc = ngx_http_v3_set_capacity(c, st->pint.value);
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
1298 if (rc != NGX_OK) {
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
1299 return rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1300 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1301
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1302 goto done;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1303
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1304 case sw_duplicate:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1305
7959
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
1306 rc = ngx_http_v3_parse_prefix_int(c, &st->pint, 5, ch);
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
1307 if (rc != NGX_DONE) {
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
1308 return rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1309 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1310
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
1311 rc = ngx_http_v3_duplicate(c, st->pint.value);
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
1312 if (rc != NGX_OK) {
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
1313 return rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1314 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1315
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1316 goto done;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1317 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1318
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1319 return NGX_AGAIN;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1320
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1321 done:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1322
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1323 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1324 "http3 parse encoder instruction done");
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1325
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1326 st->state = sw_start;
7951
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
1327 return NGX_AGAIN;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1328 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1329
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1330
8259
ab6aaa8e86b0 HTTP/3: staticize internal parsing functions.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8233
diff changeset
1331 static ngx_int_t
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1332 ngx_http_v3_parse_header_inr(ngx_connection_t *c,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1333 ngx_http_v3_parse_header_t *st, u_char ch)
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1334 {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1335 ngx_int_t rc;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1336 enum {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1337 sw_start = 0,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1338 sw_name_index,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1339 sw_value_len,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1340 sw_read_value_len,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1341 sw_value
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1342 };
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1343
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1344 switch (st->state) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1345
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1346 case sw_start:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1347
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1348 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 parse header inr");
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1349
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1350 st->dynamic = (ch & 0x40) ? 0 : 1;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1351 st->state = sw_name_index;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1352
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1353 /* fall through */
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1354
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1355 case sw_name_index:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1356
7959
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
1357 rc = ngx_http_v3_parse_prefix_int(c, &st->pint, 6, ch);
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
1358 if (rc != NGX_DONE) {
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
1359 return rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1360 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1361
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1362 st->index = st->pint.value;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1363 st->state = sw_value_len;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1364 break;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1365
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1366 case sw_value_len:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1367
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1368 st->literal.huffman = (ch & 0x80) ? 1 : 0;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1369 st->state = sw_read_value_len;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1370
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1371 /* fall through */
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1372
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1373 case sw_read_value_len:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1374
7959
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
1375 rc = ngx_http_v3_parse_prefix_int(c, &st->pint, 7, ch);
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
1376 if (rc != NGX_DONE) {
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
1377 return rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1378 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1379
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1380 st->literal.length = st->pint.value;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1381 if (st->literal.length == 0) {
8490
3509b9dcfb47 HTTP/3: fixed parsing encoder insertions with empty header value.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8432
diff changeset
1382 st->value.len = 0;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1383 goto done;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1384 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1385
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1386 st->state = sw_value;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1387 break;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1388
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1389 case sw_value:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1390
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1391 rc = ngx_http_v3_parse_literal(c, &st->literal, ch);
7960
5611bbb852ce HTTP/3: simplifed handling ngx_http_v3_parse_literal() return code.
Roman Arutyunyan <arut@nginx.com>
parents: 7959
diff changeset
1392 if (rc != NGX_DONE) {
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
1393 return rc;
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
1394 }
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
1395
7960
5611bbb852ce HTTP/3: simplifed handling ngx_http_v3_parse_literal() return code.
Roman Arutyunyan <arut@nginx.com>
parents: 7959
diff changeset
1396 st->value = st->literal.value;
5611bbb852ce HTTP/3: simplifed handling ngx_http_v3_parse_literal() return code.
Roman Arutyunyan <arut@nginx.com>
parents: 7959
diff changeset
1397 goto done;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1398 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1399
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1400 return NGX_AGAIN;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1401
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1402 done:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1403
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1404 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, c->log, 0,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1405 "http3 parse header inr done %s[%ui] \"%V\"",
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1406 st->dynamic ? "dynamic" : "static",
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1407 st->index, &st->value);
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1408
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
1409 rc = ngx_http_v3_ref_insert(c, st->dynamic, st->index, &st->value);
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
1410 if (rc != NGX_OK) {
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
1411 return rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1412 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1413
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1414 st->state = sw_start;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1415 return NGX_DONE;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1416 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1417
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1418
8259
ab6aaa8e86b0 HTTP/3: staticize internal parsing functions.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8233
diff changeset
1419 static ngx_int_t
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1420 ngx_http_v3_parse_header_iwnr(ngx_connection_t *c,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1421 ngx_http_v3_parse_header_t *st, u_char ch)
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1422 {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1423 ngx_int_t rc;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1424 enum {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1425 sw_start = 0,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1426 sw_name_len,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1427 sw_name,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1428 sw_value_len,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1429 sw_read_value_len,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1430 sw_value
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1431 };
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1432
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1433 switch (st->state) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1434
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1435 case sw_start:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1436
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1437 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1438 "http3 parse header iwnr");
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1439
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1440 st->literal.huffman = (ch & 0x20) ? 1 : 0;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1441 st->state = sw_name_len;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1442
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1443 /* fall through */
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1444
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1445 case sw_name_len:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1446
7959
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
1447 rc = ngx_http_v3_parse_prefix_int(c, &st->pint, 5, ch);
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
1448 if (rc != NGX_DONE) {
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
1449 return rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1450 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1451
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1452 st->literal.length = st->pint.value;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1453 if (st->literal.length == 0) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1454 return NGX_ERROR;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1455 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1456
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1457 st->state = sw_name;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1458 break;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1459
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1460 case sw_name:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1461
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1462 rc = ngx_http_v3_parse_literal(c, &st->literal, ch);
7960
5611bbb852ce HTTP/3: simplifed handling ngx_http_v3_parse_literal() return code.
Roman Arutyunyan <arut@nginx.com>
parents: 7959
diff changeset
1463 if (rc != NGX_DONE) {
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
1464 return rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1465 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1466
7960
5611bbb852ce HTTP/3: simplifed handling ngx_http_v3_parse_literal() return code.
Roman Arutyunyan <arut@nginx.com>
parents: 7959
diff changeset
1467 st->name = st->literal.value;
5611bbb852ce HTTP/3: simplifed handling ngx_http_v3_parse_literal() return code.
Roman Arutyunyan <arut@nginx.com>
parents: 7959
diff changeset
1468 st->state = sw_value_len;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1469 break;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1470
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1471 case sw_value_len:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1472
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1473 st->literal.huffman = (ch & 0x80) ? 1 : 0;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1474 st->state = sw_read_value_len;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1475
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1476 /* fall through */
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1477
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1478 case sw_read_value_len:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1479
7959
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
1480 rc = ngx_http_v3_parse_prefix_int(c, &st->pint, 7, ch);
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
1481 if (rc != NGX_DONE) {
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
1482 return rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1483 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1484
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1485 st->literal.length = st->pint.value;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1486 if (st->literal.length == 0) {
8490
3509b9dcfb47 HTTP/3: fixed parsing encoder insertions with empty header value.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8432
diff changeset
1487 st->value.len = 0;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1488 goto done;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1489 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1490
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1491 st->state = sw_value;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1492 break;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1493
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1494 case sw_value:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1495
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1496 rc = ngx_http_v3_parse_literal(c, &st->literal, ch);
7960
5611bbb852ce HTTP/3: simplifed handling ngx_http_v3_parse_literal() return code.
Roman Arutyunyan <arut@nginx.com>
parents: 7959
diff changeset
1497 if (rc != NGX_DONE) {
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
1498 return rc;
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
1499 }
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
1500
7960
5611bbb852ce HTTP/3: simplifed handling ngx_http_v3_parse_literal() return code.
Roman Arutyunyan <arut@nginx.com>
parents: 7959
diff changeset
1501 st->value = st->literal.value;
5611bbb852ce HTTP/3: simplifed handling ngx_http_v3_parse_literal() return code.
Roman Arutyunyan <arut@nginx.com>
parents: 7959
diff changeset
1502 goto done;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1503 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1504
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1505 return NGX_AGAIN;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1506
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1507 done:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1508
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1509 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1510 "http3 parse header iwnr done \"%V\":\"%V\"",
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1511 &st->name, &st->value);
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1512
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
1513 rc = ngx_http_v3_insert(c, &st->name, &st->value);
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
1514 if (rc != NGX_OK) {
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
1515 return rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1516 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1517
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1518 st->state = sw_start;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1519 return NGX_DONE;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1520 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1521
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1522
8432
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1523 static ngx_int_t
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1524 ngx_http_v3_parse_decoder(ngx_connection_t *c, ngx_http_v3_parse_decoder_t *st,
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1525 u_char ch)
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1526 {
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
1527 ngx_int_t rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1528 enum {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1529 sw_start = 0,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1530 sw_ack_header,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1531 sw_cancel_stream,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1532 sw_inc_insert_count
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1533 };
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1534
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1535 if (st->state == sw_start) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1536
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1537 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1538 "http3 parse decoder instruction");
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1539
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1540 if (ch & 0x80) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1541 /* Header Acknowledgement */
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1542
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1543 st->state = sw_ack_header;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1544
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1545 } else if (ch & 0x40) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1546 /* Stream Cancellation */
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1547
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1548 st->state = sw_cancel_stream;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1549
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1550 } else {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1551 /* Insert Count Increment */
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1552
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1553 st->state = sw_inc_insert_count;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1554 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1555 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1556
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1557 switch (st->state) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1558
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1559 case sw_ack_header:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1560
7959
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
1561 rc = ngx_http_v3_parse_prefix_int(c, &st->pint, 7, ch);
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
1562 if (rc != NGX_DONE) {
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
1563 return rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1564 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1565
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
1566 rc = ngx_http_v3_ack_header(c, st->pint.value);
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
1567 if (rc != NGX_OK) {
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
1568 return rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1569 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1570
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1571 goto done;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1572
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1573 case sw_cancel_stream:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1574
7959
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
1575 rc = ngx_http_v3_parse_prefix_int(c, &st->pint, 6, ch);
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
1576 if (rc != NGX_DONE) {
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
1577 return rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1578 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1579
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
1580 rc = ngx_http_v3_cancel_stream(c, st->pint.value);
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
1581 if (rc != NGX_OK) {
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
1582 return rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1583 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1584
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1585 goto done;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1586
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1587 case sw_inc_insert_count:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1588
7959
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
1589 rc = ngx_http_v3_parse_prefix_int(c, &st->pint, 6, ch);
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
1590 if (rc != NGX_DONE) {
fdb8edc8e496 HTTP/3: limited prefixed integer size by 62 bits.
Roman Arutyunyan <arut@nginx.com>
parents: 7958
diff changeset
1591 return rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1592 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1593
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
1594 rc = ngx_http_v3_inc_insert_count(c, st->pint.value);
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
1595 if (rc != NGX_OK) {
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7952
diff changeset
1596 return rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1597 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1598
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1599 goto done;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1600 }
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1601
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1602 return NGX_AGAIN;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1603
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1604 done:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1605
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1606 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1607 "http3 parse decoder instruction done");
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1608
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1609 st->state = sw_start;
7951
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7950
diff changeset
1610 return NGX_AGAIN;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1611 }
7761
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1612
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1613
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1614 ngx_int_t
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1615 ngx_http_v3_parse_data(ngx_connection_t *c, ngx_http_v3_parse_data_t *st,
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1616 u_char ch)
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1617 {
7961
4fd709540daf HTTP/3: put ngx_http_v3_parse_varlen_int() return code in variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7960
diff changeset
1618 ngx_int_t rc;
7761
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1619 enum {
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1620 sw_start = 0,
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1621 sw_type,
8087
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
1622 sw_length,
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
1623 sw_skip
7761
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1624 };
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1625
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1626 switch (st->state) {
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1627
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1628 case sw_start:
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1629
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1630 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 parse data");
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1631
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1632 st->state = sw_type;
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1633
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1634 /* fall through */
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1635
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1636 case sw_type:
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1637
7961
4fd709540daf HTTP/3: put ngx_http_v3_parse_varlen_int() return code in variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7960
diff changeset
1638 rc = ngx_http_v3_parse_varlen_int(c, &st->vlint, ch);
4fd709540daf HTTP/3: put ngx_http_v3_parse_varlen_int() return code in variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7960
diff changeset
1639 if (rc != NGX_DONE) {
4fd709540daf HTTP/3: put ngx_http_v3_parse_varlen_int() return code in variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7960
diff changeset
1640 return rc;
7761
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1641 }
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1642
8087
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
1643 st->type = st->vlint.value;
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
1644
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
1645 if (st->type == NGX_HTTP_V3_FRAME_HEADERS) {
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
1646 /* trailers */
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
1647 goto done;
7761
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1648 }
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1649
8496
278ab0ed24f2 HTTP/3: generate more H3_FRAME_UNEXPECTED.
Roman Arutyunyan <arut@nginx.com>
parents: 8495
diff changeset
1650 if (ngx_http_v3_is_v2_frame(st->type)
278ab0ed24f2 HTTP/3: generate more H3_FRAME_UNEXPECTED.
Roman Arutyunyan <arut@nginx.com>
parents: 8495
diff changeset
1651 || st->type == NGX_HTTP_V3_FRAME_GOAWAY
278ab0ed24f2 HTTP/3: generate more H3_FRAME_UNEXPECTED.
Roman Arutyunyan <arut@nginx.com>
parents: 8495
diff changeset
1652 || st->type == NGX_HTTP_V3_FRAME_SETTINGS
278ab0ed24f2 HTTP/3: generate more H3_FRAME_UNEXPECTED.
Roman Arutyunyan <arut@nginx.com>
parents: 8495
diff changeset
1653 || st->type == NGX_HTTP_V3_FRAME_MAX_PUSH_ID
278ab0ed24f2 HTTP/3: generate more H3_FRAME_UNEXPECTED.
Roman Arutyunyan <arut@nginx.com>
parents: 8495
diff changeset
1654 || st->type == NGX_HTTP_V3_FRAME_CANCEL_PUSH
278ab0ed24f2 HTTP/3: generate more H3_FRAME_UNEXPECTED.
Roman Arutyunyan <arut@nginx.com>
parents: 8495
diff changeset
1655 || st->type == NGX_HTTP_V3_FRAME_PUSH_PROMISE)
278ab0ed24f2 HTTP/3: generate more H3_FRAME_UNEXPECTED.
Roman Arutyunyan <arut@nginx.com>
parents: 8495
diff changeset
1656 {
8088
234e9d89ff7f HTTP/3: reject HTTP/2 frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8087
diff changeset
1657 return NGX_HTTP_V3_ERR_FRAME_UNEXPECTED;
234e9d89ff7f HTTP/3: reject HTTP/2 frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8087
diff changeset
1658 }
234e9d89ff7f HTTP/3: reject HTTP/2 frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8087
diff changeset
1659
7761
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1660 st->state = sw_length;
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1661 break;
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1662
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1663 case sw_length:
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1664
7961
4fd709540daf HTTP/3: put ngx_http_v3_parse_varlen_int() return code in variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7960
diff changeset
1665 rc = ngx_http_v3_parse_varlen_int(c, &st->vlint, ch);
4fd709540daf HTTP/3: put ngx_http_v3_parse_varlen_int() return code in variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7960
diff changeset
1666 if (rc != NGX_DONE) {
4fd709540daf HTTP/3: put ngx_http_v3_parse_varlen_int() return code in variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7960
diff changeset
1667 return rc;
7761
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1668 }
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1669
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1670 st->length = st->vlint.value;
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1671
8087
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
1672 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
1673 "http3 parse data type:%ui, len:%ui",
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
1674 st->type, st->length);
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
1675
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
1676 if (st->type != NGX_HTTP_V3_FRAME_DATA && st->length > 0) {
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
1677 st->state = sw_skip;
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
1678 break;
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
1679 }
7761
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1680
8087
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
1681 st->state = sw_type;
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
1682 return NGX_OK;
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
1683
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
1684 case sw_skip:
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
1685
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
1686 if (--st->length == 0) {
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
1687 st->state = sw_type;
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
1688 }
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
1689
d70a38acaea0 HTTP/3: skip unknown frames on request stream.
Roman Arutyunyan <arut@nginx.com>
parents: 8015
diff changeset
1690 break;
7761
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1691 }
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1692
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1693 return NGX_AGAIN;
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1694
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1695 done:
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1696
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1697 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 parse data done");
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1698
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1699 st->state = sw_start;
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1700 return NGX_DONE;
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 7693
diff changeset
1701 }
8432
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1702
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1703
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1704 ngx_int_t
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1705 ngx_http_v3_parse_uni(ngx_connection_t *c, ngx_http_v3_parse_uni_t *st,
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1706 u_char ch)
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1707 {
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1708 ngx_int_t rc;
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1709 enum {
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1710 sw_start = 0,
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1711 sw_type,
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1712 sw_control,
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1713 sw_encoder,
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1714 sw_decoder,
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1715 sw_unknown
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1716 };
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1717
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1718 switch (st->state) {
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1719 case sw_start:
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1720
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1721 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 parse uni");
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1722
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1723 st->state = sw_type;
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1724
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1725 /* fall through */
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1726
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1727 case sw_type:
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1728
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1729 rc = ngx_http_v3_parse_varlen_int(c, &st->vlint, ch);
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1730 if (rc != NGX_DONE) {
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1731 return rc;
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1732 }
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1733
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1734 rc = ngx_http_v3_register_uni_stream(c, st->vlint.value);
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1735 if (rc != NGX_OK) {
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1736 return rc;
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1737 }
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1738
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1739 switch (st->vlint.value) {
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1740 case NGX_HTTP_V3_STREAM_CONTROL:
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1741 st->state = sw_control;
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1742 break;
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1743
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1744 case NGX_HTTP_V3_STREAM_ENCODER:
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1745 st->state = sw_encoder;
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1746 break;
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1747
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1748 case NGX_HTTP_V3_STREAM_DECODER:
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1749 st->state = sw_decoder;
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1750 break;
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1751
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1752 default:
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1753 st->state = sw_unknown;
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1754 }
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1755
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1756 break;
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1757
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1758 case sw_control:
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1759
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1760 rc = ngx_http_v3_parse_control(c, &st->u.control, ch);
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1761 if (rc != NGX_OK) {
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1762 return rc;
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1763 }
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1764
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1765 break;
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1766
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1767 case sw_encoder:
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1768
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1769 rc = ngx_http_v3_parse_encoder(c, &st->u.encoder, ch);
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1770 if (rc != NGX_OK) {
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1771 return rc;
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1772 }
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1773
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1774 break;
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1775
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1776 case sw_decoder:
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1777
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1778 rc = ngx_http_v3_parse_decoder(c, &st->u.decoder, ch);
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1779 if (rc != NGX_OK) {
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1780 return rc;
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1781 }
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1782
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1783 break;
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1784
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1785 case sw_unknown:
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1786 break;
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1787 }
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1788
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1789 return NGX_AGAIN;
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
1790 }