Mercurial > hg > nginx-quic
annotate src/http/v3/ngx_http_v3.h @ 7949:032cb35ce758 quic
HTTP/3: http3_max_field_size directive to limit string size.
Client streams may send literal strings which are now limited in size by the
new directive. The default value is 4096.
The directive is similar to HTTP/2 directive http2_max_field_size.
author | Roman Arutyunyan <arut@nginx.com> |
---|---|
date | Mon, 29 Jun 2020 15:56:14 +0300 |
parents | c8cabb5d45f5 |
children | c9538aef3211 |
rev | line source |
---|---|
7681 | 1 |
2 /* | |
3 * Copyright (C) Roman Arutyunyan | |
4 * Copyright (C) Nginx, Inc. | |
5 */ | |
6 | |
7 | |
8 #ifndef _NGX_HTTP_V3_H_INCLUDED_ | |
9 #define _NGX_HTTP_V3_H_INCLUDED_ | |
10 | |
11 | |
12 #include <ngx_config.h> | |
13 #include <ngx_core.h> | |
14 #include <ngx_http.h> | |
7692
268f4389130d
Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
7681
diff
changeset
|
15 #include <ngx_http_v3_parse.h> |
7681 | 16 |
17 | |
7735
c9c3a73df6e8
Support for HTTP/3 ALPN.
Roman Arutyunyan <arut@nginx.com>
parents:
7713
diff
changeset
|
18 #define NGX_HTTP_V3_ALPN(s) NGX_HTTP_V3_ALPN_DRAFT(s) |
c9c3a73df6e8
Support for HTTP/3 ALPN.
Roman Arutyunyan <arut@nginx.com>
parents:
7713
diff
changeset
|
19 #define NGX_HTTP_V3_ALPN_DRAFT(s) "\x05h3-" #s |
c9c3a73df6e8
Support for HTTP/3 ALPN.
Roman Arutyunyan <arut@nginx.com>
parents:
7713
diff
changeset
|
20 #define NGX_HTTP_V3_ALPN_ADVERTISE NGX_HTTP_V3_ALPN(NGX_QUIC_DRAFT_VERSION) |
7681 | 21 |
7692
268f4389130d
Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
7681
diff
changeset
|
22 #define NGX_HTTP_V3_VARLEN_INT_LEN 4 |
268f4389130d
Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
7681
diff
changeset
|
23 #define NGX_HTTP_V3_PREFIX_INT_LEN 11 |
268f4389130d
Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
7681
diff
changeset
|
24 |
268f4389130d
Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
7681
diff
changeset
|
25 #define NGX_HTTP_V3_STREAM_CONTROL 0x00 |
268f4389130d
Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
7681
diff
changeset
|
26 #define NGX_HTTP_V3_STREAM_PUSH 0x01 |
268f4389130d
Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
7681
diff
changeset
|
27 #define NGX_HTTP_V3_STREAM_ENCODER 0x02 |
268f4389130d
Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
7681
diff
changeset
|
28 #define NGX_HTTP_V3_STREAM_DECODER 0x03 |
268f4389130d
Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
7681
diff
changeset
|
29 |
268f4389130d
Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
7681
diff
changeset
|
30 #define NGX_HTTP_V3_FRAME_DATA 0x00 |
268f4389130d
Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
7681
diff
changeset
|
31 #define NGX_HTTP_V3_FRAME_HEADERS 0x01 |
268f4389130d
Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
7681
diff
changeset
|
32 #define NGX_HTTP_V3_FRAME_CANCEL_PUSH 0x03 |
268f4389130d
Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
7681
diff
changeset
|
33 #define NGX_HTTP_V3_FRAME_SETTINGS 0x04 |
268f4389130d
Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
7681
diff
changeset
|
34 #define NGX_HTTP_V3_FRAME_PUSH_PROMISE 0x05 |
268f4389130d
Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
7681
diff
changeset
|
35 #define NGX_HTTP_V3_FRAME_GOAWAY 0x07 |
268f4389130d
Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
7681
diff
changeset
|
36 #define NGX_HTTP_V3_FRAME_MAX_PUSH_ID 0x0d |
268f4389130d
Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
7681
diff
changeset
|
37 |
268f4389130d
Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
7681
diff
changeset
|
38 #define NGX_HTTP_V3_PARAM_MAX_TABLE_CAPACITY 0x01 |
268f4389130d
Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
7681
diff
changeset
|
39 #define NGX_HTTP_V3_PARAM_MAX_HEADER_LIST_SIZE 0x06 |
268f4389130d
Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
7681
diff
changeset
|
40 #define NGX_HTTP_V3_PARAM_BLOCKED_STREAMS 0x07 |
7681 | 41 |
7749
dadbc66e9fca
Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents:
7735
diff
changeset
|
42 #define NGX_HTTP_V3_STREAM_CLIENT_CONTROL 0 |
dadbc66e9fca
Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents:
7735
diff
changeset
|
43 #define NGX_HTTP_V3_STREAM_SERVER_CONTROL 1 |
dadbc66e9fca
Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents:
7735
diff
changeset
|
44 #define NGX_HTTP_V3_STREAM_CLIENT_ENCODER 2 |
dadbc66e9fca
Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents:
7735
diff
changeset
|
45 #define NGX_HTTP_V3_STREAM_SERVER_ENCODER 3 |
dadbc66e9fca
Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents:
7735
diff
changeset
|
46 #define NGX_HTTP_V3_STREAM_CLIENT_DECODER 4 |
dadbc66e9fca
Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents:
7735
diff
changeset
|
47 #define NGX_HTTP_V3_STREAM_SERVER_DECODER 5 |
dadbc66e9fca
Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents:
7735
diff
changeset
|
48 #define NGX_HTTP_V3_MAX_KNOWN_STREAM 6 |
dadbc66e9fca
Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents:
7735
diff
changeset
|
49 |
7949
032cb35ce758
HTTP/3: http3_max_field_size directive to limit string size.
Roman Arutyunyan <arut@nginx.com>
parents:
7948
diff
changeset
|
50 #define NGX_HTTP_V3_DEFAULT_MAX_FIELD_SIZE 4096 |
032cb35ce758
HTTP/3: http3_max_field_size directive to limit string size.
Roman Arutyunyan <arut@nginx.com>
parents:
7948
diff
changeset
|
51 |
7681 | 52 |
53 typedef struct { | |
7713
e9891e8ee975
Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
7692
diff
changeset
|
54 ngx_quic_tp_t quic; |
7949
032cb35ce758
HTTP/3: http3_max_field_size directive to limit string size.
Roman Arutyunyan <arut@nginx.com>
parents:
7948
diff
changeset
|
55 size_t max_field_size; |
7713
e9891e8ee975
Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
7692
diff
changeset
|
56 } ngx_http_v3_srv_conf_t; |
e9891e8ee975
Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
7692
diff
changeset
|
57 |
e9891e8ee975
Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
7692
diff
changeset
|
58 |
e9891e8ee975
Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
7692
diff
changeset
|
59 typedef struct { |
7681 | 60 ngx_http_connection_t hc; |
61 | |
62 ngx_array_t *dynamic; | |
7749
dadbc66e9fca
Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents:
7735
diff
changeset
|
63 ngx_connection_t *known_streams[NGX_HTTP_V3_MAX_KNOWN_STREAM]; |
7681 | 64 } ngx_http_v3_connection_t; |
65 | |
66 | |
7948
c8cabb5d45f5
HTTP/3: introduced ngx_http_v3_get_module_srv_conf() macro.
Roman Arutyunyan <arut@nginx.com>
parents:
7883
diff
changeset
|
67 #define ngx_http_v3_get_module_srv_conf(c, module) \ |
c8cabb5d45f5
HTTP/3: introduced ngx_http_v3_get_module_srv_conf() macro.
Roman Arutyunyan <arut@nginx.com>
parents:
7883
diff
changeset
|
68 ngx_http_get_module_srv_conf( \ |
c8cabb5d45f5
HTTP/3: introduced ngx_http_v3_get_module_srv_conf() macro.
Roman Arutyunyan <arut@nginx.com>
parents:
7883
diff
changeset
|
69 ((ngx_http_v3_connection_t *) c->qs->parent->data)->hc.conf_ctx, \ |
c8cabb5d45f5
HTTP/3: introduced ngx_http_v3_get_module_srv_conf() macro.
Roman Arutyunyan <arut@nginx.com>
parents:
7883
diff
changeset
|
70 module) |
c8cabb5d45f5
HTTP/3: introduced ngx_http_v3_get_module_srv_conf() macro.
Roman Arutyunyan <arut@nginx.com>
parents:
7883
diff
changeset
|
71 |
c8cabb5d45f5
HTTP/3: introduced ngx_http_v3_get_module_srv_conf() macro.
Roman Arutyunyan <arut@nginx.com>
parents:
7883
diff
changeset
|
72 |
7681 | 73 typedef struct { |
74 ngx_str_t name; | |
75 ngx_str_t value; | |
76 } ngx_http_v3_header_t; | |
77 | |
78 | |
7882
d2759e4cc437
HTTP/3: split header parser in two functions.
Roman Arutyunyan <arut@nginx.com>
parents:
7761
diff
changeset
|
79 ngx_int_t ngx_http_v3_parse_request(ngx_http_request_t *r, ngx_buf_t *b); |
7883
66feab03d9b7
HTTP/3: restricted symbols in header names.
Roman Arutyunyan <arut@nginx.com>
parents:
7882
diff
changeset
|
80 ngx_int_t ngx_http_v3_parse_header(ngx_http_request_t *r, ngx_buf_t *b, |
66feab03d9b7
HTTP/3: restricted symbols in header names.
Roman Arutyunyan <arut@nginx.com>
parents:
7882
diff
changeset
|
81 ngx_uint_t allow_underscores); |
7761
5649079a41f4
Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents:
7758
diff
changeset
|
82 ngx_int_t ngx_http_v3_parse_request_body(ngx_http_request_t *r, ngx_buf_t *b, |
5649079a41f4
Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents:
7758
diff
changeset
|
83 ngx_http_chunked_t *ctx); |
7681 | 84 ngx_chain_t *ngx_http_v3_create_header(ngx_http_request_t *r); |
7758
46e3542d51b3
Chunked response body in HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
7749
diff
changeset
|
85 ngx_chain_t *ngx_http_v3_create_trailers(ngx_http_request_t *r); |
7681 | 86 |
87 uintptr_t ngx_http_v3_encode_varlen_int(u_char *p, uint64_t value); | |
88 uintptr_t ngx_http_v3_encode_prefix_int(u_char *p, uint64_t value, | |
89 ngx_uint_t prefix); | |
90 | |
91 void ngx_http_v3_handle_client_uni_stream(ngx_connection_t *c); | |
92 | |
93 ngx_int_t ngx_http_v3_ref_insert(ngx_connection_t *c, ngx_uint_t dynamic, | |
94 ngx_uint_t index, ngx_str_t *value); | |
95 ngx_int_t ngx_http_v3_insert(ngx_connection_t *c, ngx_str_t *name, | |
96 ngx_str_t *value); | |
97 ngx_int_t ngx_http_v3_set_capacity(ngx_connection_t *c, ngx_uint_t capacity); | |
98 ngx_int_t ngx_http_v3_duplicate(ngx_connection_t *c, ngx_uint_t index); | |
99 ngx_int_t ngx_http_v3_ack_header(ngx_connection_t *c, ngx_uint_t stream_id); | |
100 ngx_int_t ngx_http_v3_cancel_stream(ngx_connection_t *c, ngx_uint_t stream_id); | |
101 ngx_int_t ngx_http_v3_inc_insert_count(ngx_connection_t *c, ngx_uint_t inc); | |
102 ngx_http_v3_header_t *ngx_http_v3_lookup_table(ngx_connection_t *c, | |
103 ngx_uint_t dynamic, ngx_uint_t index); | |
104 ngx_int_t ngx_http_v3_check_insert_count(ngx_connection_t *c, | |
105 ngx_uint_t insert_count); | |
7692
268f4389130d
Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
7681
diff
changeset
|
106 ngx_int_t ngx_http_v3_set_param(ngx_connection_t *c, uint64_t id, |
268f4389130d
Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents:
7681
diff
changeset
|
107 uint64_t value); |
7681 | 108 |
109 ngx_int_t ngx_http_v3_client_ref_insert(ngx_connection_t *c, ngx_uint_t dynamic, | |
110 ngx_uint_t index, ngx_str_t *value); | |
111 ngx_int_t ngx_http_v3_client_insert(ngx_connection_t *c, ngx_str_t *name, | |
112 ngx_str_t *value); | |
113 ngx_int_t ngx_http_v3_client_set_capacity(ngx_connection_t *c, | |
114 ngx_uint_t capacity); | |
115 ngx_int_t ngx_http_v3_client_duplicate(ngx_connection_t *c, ngx_uint_t index); | |
116 ngx_int_t ngx_http_v3_client_ack_header(ngx_connection_t *c, | |
117 ngx_uint_t stream_id); | |
118 ngx_int_t ngx_http_v3_client_cancel_stream(ngx_connection_t *c, | |
119 ngx_uint_t stream_id); | |
120 ngx_int_t ngx_http_v3_client_inc_insert_count(ngx_connection_t *c, | |
121 ngx_uint_t inc); | |
122 | |
123 | |
124 extern ngx_module_t ngx_http_v3_module; | |
125 | |
126 | |
127 #endif /* _NGX_HTTP_V3_H_INCLUDED_ */ |