annotate src/http/v3/ngx_http_v3_streams.c @ 8713:d6ef13c5fd8e quic

QUIC: simplified configuration. Directives that set transport parameters are removed from the configuration. Corresponding values are derived from the quic configuration or initialized to default. Whenever possible, quic configuration parameters are taken from higher-level protocol settings, i.e. HTTP/3.
author Vladimir Homutov <vl@nginx.com>
date Mon, 06 Dec 2021 15:19:54 +0300
parents 0d3bf08eaac0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
2 /*
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
3 * Copyright (C) Roman Arutyunyan
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
4 * Copyright (C) Nginx, Inc.
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
5 */
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
6
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
7
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
8 #include <ngx_config.h>
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
9 #include <ngx_core.h>
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
10 #include <ngx_http.h>
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
11
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
12
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
13 typedef struct {
8432
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
14 ngx_http_v3_parse_uni_t parse;
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
15 ngx_int_t index;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
16 } ngx_http_v3_uni_stream_t;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
17
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
18
8015
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
19 typedef struct {
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
20 ngx_queue_t queue;
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
21 uint64_t id;
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
22 ngx_connection_t *connection;
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
23 ngx_uint_t *npushing;
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
24 } ngx_http_v3_push_t;
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
25
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
26
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
27 static void ngx_http_v3_close_uni_stream(ngx_connection_t *c);
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
28 static void ngx_http_v3_uni_read_handler(ngx_event_t *rev);
7747
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7694
diff changeset
29 static void ngx_http_v3_dummy_write_handler(ngx_event_t *wev);
8015
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
30 static void ngx_http_v3_push_cleanup(void *data);
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
31 static ngx_connection_t *ngx_http_v3_get_uni_stream(ngx_connection_t *c,
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
32 ngx_uint_t type);
8360
98c4020f1c9a HTTP/3: keepalive timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 8359
diff changeset
33
98c4020f1c9a HTTP/3: keepalive timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 8359
diff changeset
34
8272
e1eb7f4ca9f1 HTTP/3: refactored request parser.
Roman Arutyunyan <arut@nginx.com>
parents: 8200
diff changeset
35 void
e1eb7f4ca9f1 HTTP/3: refactored request parser.
Roman Arutyunyan <arut@nginx.com>
parents: 8200
diff changeset
36 ngx_http_v3_init_uni_stream(ngx_connection_t *c)
e1eb7f4ca9f1 HTTP/3: refactored request parser.
Roman Arutyunyan <arut@nginx.com>
parents: 8200
diff changeset
37 {
8549
054f9be0aaf9 HTTP/3: http3_max_uni_streams directive.
Roman Arutyunyan <arut@nginx.com>
parents: 8546
diff changeset
38 uint64_t n;
8272
e1eb7f4ca9f1 HTTP/3: refactored request parser.
Roman Arutyunyan <arut@nginx.com>
parents: 8200
diff changeset
39 ngx_http_v3_uni_stream_t *us;
e1eb7f4ca9f1 HTTP/3: refactored request parser.
Roman Arutyunyan <arut@nginx.com>
parents: 8200
diff changeset
40
e1eb7f4ca9f1 HTTP/3: refactored request parser.
Roman Arutyunyan <arut@nginx.com>
parents: 8200
diff changeset
41 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 init uni stream");
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
42
8549
054f9be0aaf9 HTTP/3: http3_max_uni_streams directive.
Roman Arutyunyan <arut@nginx.com>
parents: 8546
diff changeset
43 n = c->quic->id >> 2;
054f9be0aaf9 HTTP/3: http3_max_uni_streams directive.
Roman Arutyunyan <arut@nginx.com>
parents: 8546
diff changeset
44
8713
d6ef13c5fd8e QUIC: simplified configuration.
Vladimir Homutov <vl@nginx.com>
parents: 8692
diff changeset
45 if (n >= NGX_HTTP_V3_MAX_UNI_STREAMS) {
8549
054f9be0aaf9 HTTP/3: http3_max_uni_streams directive.
Roman Arutyunyan <arut@nginx.com>
parents: 8546
diff changeset
46 ngx_http_v3_finalize_connection(c,
054f9be0aaf9 HTTP/3: http3_max_uni_streams directive.
Roman Arutyunyan <arut@nginx.com>
parents: 8546
diff changeset
47 NGX_HTTP_V3_ERR_STREAM_CREATION_ERROR,
054f9be0aaf9 HTTP/3: http3_max_uni_streams directive.
Roman Arutyunyan <arut@nginx.com>
parents: 8546
diff changeset
48 "reached maximum number of uni streams");
8692
0d3bf08eaac0 HTTP/3: allowed QUIC stream connection reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8691
diff changeset
49 c->data = NULL;
0d3bf08eaac0 HTTP/3: allowed QUIC stream connection reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8691
diff changeset
50 ngx_http_v3_close_uni_stream(c);
8549
054f9be0aaf9 HTTP/3: http3_max_uni_streams directive.
Roman Arutyunyan <arut@nginx.com>
parents: 8546
diff changeset
51 return;
054f9be0aaf9 HTTP/3: http3_max_uni_streams directive.
Roman Arutyunyan <arut@nginx.com>
parents: 8546
diff changeset
52 }
054f9be0aaf9 HTTP/3: http3_max_uni_streams directive.
Roman Arutyunyan <arut@nginx.com>
parents: 8546
diff changeset
53
8359
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8358
diff changeset
54 c->quic->cancelable = 1;
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8358
diff changeset
55
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
56 us = ngx_pcalloc(c->pool, sizeof(ngx_http_v3_uni_stream_t));
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
57 if (us == NULL) {
8692
0d3bf08eaac0 HTTP/3: allowed QUIC stream connection reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8691
diff changeset
58 ngx_http_v3_finalize_connection(c,
0d3bf08eaac0 HTTP/3: allowed QUIC stream connection reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8691
diff changeset
59 NGX_HTTP_V3_ERR_INTERNAL_ERROR,
0d3bf08eaac0 HTTP/3: allowed QUIC stream connection reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8691
diff changeset
60 "memory allocation error");
0d3bf08eaac0 HTTP/3: allowed QUIC stream connection reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8691
diff changeset
61 c->data = NULL;
0d3bf08eaac0 HTTP/3: allowed QUIC stream connection reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8691
diff changeset
62 ngx_http_v3_close_uni_stream(c);
8272
e1eb7f4ca9f1 HTTP/3: refactored request parser.
Roman Arutyunyan <arut@nginx.com>
parents: 8200
diff changeset
63 return;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
64 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
65
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
66 us->index = -1;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
67
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
68 c->data = us;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
69
8432
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
70 c->read->handler = ngx_http_v3_uni_read_handler;
7747
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7694
diff changeset
71 c->write->handler = ngx_http_v3_dummy_write_handler;
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7694
diff changeset
72
8432
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
73 ngx_http_v3_uni_read_handler(c->read);
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
74 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
75
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
76
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
77 static void
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
78 ngx_http_v3_close_uni_stream(ngx_connection_t *c)
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
79 {
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
80 ngx_pool_t *pool;
8430
67f0eb150047 HTTP/3: renamed ngx_http_v3_connection_t to ngx_http_v3_session_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8429
diff changeset
81 ngx_http_v3_session_t *h3c;
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
82 ngx_http_v3_uni_stream_t *us;
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
83
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
84 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 close stream");
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
85
8692
0d3bf08eaac0 HTTP/3: allowed QUIC stream connection reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8691
diff changeset
86 us = c->data;
0d3bf08eaac0 HTTP/3: allowed QUIC stream connection reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8691
diff changeset
87
0d3bf08eaac0 HTTP/3: allowed QUIC stream connection reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8691
diff changeset
88 if (us && us->index >= 0) {
0d3bf08eaac0 HTTP/3: allowed QUIC stream connection reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8691
diff changeset
89 h3c = ngx_http_v3_get_session(c);
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
90 h3c->known_streams[us->index] = NULL;
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
91 }
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
92
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
93 c->destroyed = 1;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
94
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
95 pool = c->pool;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
96
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
97 ngx_close_connection(c);
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
98
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
99 ngx_destroy_pool(pool);
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
100 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
101
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
102
8432
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
103 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
104 ngx_http_v3_register_uni_stream(ngx_connection_t *c, uint64_t type)
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
105 {
8432
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
106 ngx_int_t index;
8430
67f0eb150047 HTTP/3: renamed ngx_http_v3_connection_t to ngx_http_v3_session_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8429
diff changeset
107 ngx_http_v3_session_t *h3c;
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
108 ngx_http_v3_uni_stream_t *us;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
109
8546
d80365ca678d HTTP/3: require mandatory uni streams before additional ones.
Roman Arutyunyan <arut@nginx.com>
parents: 8508
diff changeset
110 h3c = ngx_http_v3_get_session(c);
d80365ca678d HTTP/3: require mandatory uni streams before additional ones.
Roman Arutyunyan <arut@nginx.com>
parents: 8508
diff changeset
111
8432
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
112 switch (type) {
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
113
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
114 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
115
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
116 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
117 "http3 encoder stream");
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
118 index = NGX_HTTP_V3_STREAM_CLIENT_ENCODER;
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
119 break;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
120
8432
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
121 case NGX_HTTP_V3_STREAM_DECODER:
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
122
8432
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
123 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
124 "http3 decoder stream");
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
125 index = NGX_HTTP_V3_STREAM_CLIENT_DECODER;
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
126 break;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
127
8432
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
128 case NGX_HTTP_V3_STREAM_CONTROL:
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
129
8432
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
130 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
131 "http3 control stream");
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
132 index = NGX_HTTP_V3_STREAM_CLIENT_CONTROL;
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
133
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
134 break;
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
135
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
136 default:
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7951
diff changeset
137
8432
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
138 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
139 "http3 stream 0x%02xL", type);
8546
d80365ca678d HTTP/3: require mandatory uni streams before additional ones.
Roman Arutyunyan <arut@nginx.com>
parents: 8508
diff changeset
140
d80365ca678d HTTP/3: require mandatory uni streams before additional ones.
Roman Arutyunyan <arut@nginx.com>
parents: 8508
diff changeset
141 if (h3c->known_streams[NGX_HTTP_V3_STREAM_CLIENT_ENCODER] == NULL
d80365ca678d HTTP/3: require mandatory uni streams before additional ones.
Roman Arutyunyan <arut@nginx.com>
parents: 8508
diff changeset
142 || h3c->known_streams[NGX_HTTP_V3_STREAM_CLIENT_DECODER] == NULL
d80365ca678d HTTP/3: require mandatory uni streams before additional ones.
Roman Arutyunyan <arut@nginx.com>
parents: 8508
diff changeset
143 || h3c->known_streams[NGX_HTTP_V3_STREAM_CLIENT_CONTROL] == NULL)
d80365ca678d HTTP/3: require mandatory uni streams before additional ones.
Roman Arutyunyan <arut@nginx.com>
parents: 8508
diff changeset
144 {
d80365ca678d HTTP/3: require mandatory uni streams before additional ones.
Roman Arutyunyan <arut@nginx.com>
parents: 8508
diff changeset
145 ngx_log_error(NGX_LOG_INFO, c->log, 0, "missing mandatory stream");
d80365ca678d HTTP/3: require mandatory uni streams before additional ones.
Roman Arutyunyan <arut@nginx.com>
parents: 8508
diff changeset
146 return NGX_HTTP_V3_ERR_STREAM_CREATION_ERROR;
d80365ca678d HTTP/3: require mandatory uni streams before additional ones.
Roman Arutyunyan <arut@nginx.com>
parents: 8508
diff changeset
147 }
d80365ca678d HTTP/3: require mandatory uni streams before additional ones.
Roman Arutyunyan <arut@nginx.com>
parents: 8508
diff changeset
148
8432
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
149 index = -1;
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
150 }
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
151
8432
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
152 if (index >= 0) {
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
153 if (h3c->known_streams[index]) {
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
154 ngx_log_error(NGX_LOG_INFO, c->log, 0, "stream exists");
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
155 return NGX_HTTP_V3_ERR_STREAM_CREATION_ERROR;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
156 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
157
8432
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
158 h3c->known_streams[index] = c;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
159
8432
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
160 us = c->data;
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
161 us->index = index;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
162 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
163
8432
345370fdd32d HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8431
diff changeset
164 return NGX_OK;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
165 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
166
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
167
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
168 static void
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
169 ngx_http_v3_uni_read_handler(ngx_event_t *rev)
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
170 {
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
171 u_char buf[128];
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
172 ssize_t n;
8563
d6e191a583cc HTTP/3: bulk parse functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8549
diff changeset
173 ngx_buf_t b;
d6e191a583cc HTTP/3: bulk parse functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8549
diff changeset
174 ngx_int_t rc;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
175 ngx_connection_t *c;
8643
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
176 ngx_http_v3_session_t *h3c;
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
177 ngx_http_v3_uni_stream_t *us;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
178
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
179 c = rev->data;
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
180 us = c->data;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
181
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
182 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 read handler");
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
183
8563
d6e191a583cc HTTP/3: bulk parse functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8549
diff changeset
184 ngx_memzero(&b, sizeof(ngx_buf_t));
d6e191a583cc HTTP/3: bulk parse functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8549
diff changeset
185
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
186 while (rev->ready) {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
187
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
188 n = c->recv(c, buf, sizeof(buf));
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
189
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7951
diff changeset
190 if (n == NGX_ERROR) {
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7951
diff changeset
191 rc = NGX_HTTP_V3_ERR_INTERNAL_ERROR;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
192 goto failed;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
193 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
194
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7951
diff changeset
195 if (n == 0) {
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7951
diff changeset
196 if (us->index >= 0) {
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7951
diff changeset
197 rc = NGX_HTTP_V3_ERR_CLOSED_CRITICAL_STREAM;
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7951
diff changeset
198 goto failed;
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7951
diff changeset
199 }
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7951
diff changeset
200
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7951
diff changeset
201 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 read eof");
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7951
diff changeset
202 ngx_http_v3_close_uni_stream(c);
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7951
diff changeset
203 return;
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7951
diff changeset
204 }
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7951
diff changeset
205
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
206 if (n == NGX_AGAIN) {
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
207 break;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
208 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
209
8563
d6e191a583cc HTTP/3: bulk parse functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8549
diff changeset
210 b.pos = buf;
d6e191a583cc HTTP/3: bulk parse functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8549
diff changeset
211 b.last = buf + n;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
212
8643
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
213 h3c = ngx_http_v3_get_session(c);
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
214 h3c->total_bytes += n;
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
215
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
216 if (ngx_http_v3_check_flood(c) != NGX_OK) {
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
217 ngx_http_v3_close_uni_stream(c);
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
218 return;
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
219 }
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
220
8563
d6e191a583cc HTTP/3: bulk parse functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8549
diff changeset
221 rc = ngx_http_v3_parse_uni(c, &us->parse, &b);
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
222
8563
d6e191a583cc HTTP/3: bulk parse functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8549
diff changeset
223 if (rc == NGX_DONE) {
d6e191a583cc HTTP/3: bulk parse functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8549
diff changeset
224 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
d6e191a583cc HTTP/3: bulk parse functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8549
diff changeset
225 "http3 read done");
d6e191a583cc HTTP/3: bulk parse functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8549
diff changeset
226 ngx_http_v3_close_uni_stream(c);
d6e191a583cc HTTP/3: bulk parse functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8549
diff changeset
227 return;
d6e191a583cc HTTP/3: bulk parse functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8549
diff changeset
228 }
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7951
diff changeset
229
8563
d6e191a583cc HTTP/3: bulk parse functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8549
diff changeset
230 if (rc > 0) {
d6e191a583cc HTTP/3: bulk parse functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8549
diff changeset
231 goto failed;
d6e191a583cc HTTP/3: bulk parse functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8549
diff changeset
232 }
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
233
8563
d6e191a583cc HTTP/3: bulk parse functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8549
diff changeset
234 if (rc != NGX_AGAIN) {
d6e191a583cc HTTP/3: bulk parse functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8549
diff changeset
235 rc = NGX_HTTP_V3_ERR_GENERAL_PROTOCOL_ERROR;
d6e191a583cc HTTP/3: bulk parse functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8549
diff changeset
236 goto failed;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
237 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
238 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
239
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
240 if (ngx_handle_read_event(rev, 0) != NGX_OK) {
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7951
diff changeset
241 rc = NGX_HTTP_V3_ERR_INTERNAL_ERROR;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
242 goto failed;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
243 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
244
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
245 return;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
246
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
247 failed:
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
248
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7951
diff changeset
249 ngx_http_v3_finalize_connection(c, rc, "stream error");
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
250 ngx_http_v3_close_uni_stream(c);
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
251 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
252
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
253
7747
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7694
diff changeset
254 static void
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7694
diff changeset
255 ngx_http_v3_dummy_write_handler(ngx_event_t *wev)
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7694
diff changeset
256 {
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7694
diff changeset
257 ngx_connection_t *c;
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7694
diff changeset
258
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7694
diff changeset
259 c = wev->data;
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7694
diff changeset
260
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7694
diff changeset
261 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 dummy write handler");
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7694
diff changeset
262
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7694
diff changeset
263 if (ngx_handle_write_event(wev, 0) != NGX_OK) {
7955
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7951
diff changeset
264 ngx_http_v3_finalize_connection(c, NGX_HTTP_V3_ERR_INTERNAL_ERROR,
72f9ff4e0a88 HTTP/3: close QUIC connection with HTTP/QPACK errors when needed.
Roman Arutyunyan <arut@nginx.com>
parents: 7951
diff changeset
265 NULL);
7747
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7694
diff changeset
266 ngx_http_v3_close_uni_stream(c);
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7694
diff changeset
267 }
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7694
diff changeset
268 }
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7694
diff changeset
269
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7694
diff changeset
270
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
271 /* XXX async & buffered stream writes */
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
272
8015
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
273 ngx_connection_t *
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
274 ngx_http_v3_create_push_stream(ngx_connection_t *c, uint64_t push_id)
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
275 {
8430
67f0eb150047 HTTP/3: renamed ngx_http_v3_connection_t to ngx_http_v3_session_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8429
diff changeset
276 u_char *p, buf[NGX_HTTP_V3_VARLEN_INT_LEN * 2];
67f0eb150047 HTTP/3: renamed ngx_http_v3_connection_t to ngx_http_v3_session_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8429
diff changeset
277 size_t n;
67f0eb150047 HTTP/3: renamed ngx_http_v3_connection_t to ngx_http_v3_session_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8429
diff changeset
278 ngx_connection_t *sc;
67f0eb150047 HTTP/3: renamed ngx_http_v3_connection_t to ngx_http_v3_session_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8429
diff changeset
279 ngx_pool_cleanup_t *cln;
67f0eb150047 HTTP/3: renamed ngx_http_v3_connection_t to ngx_http_v3_session_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8429
diff changeset
280 ngx_http_v3_push_t *push;
67f0eb150047 HTTP/3: renamed ngx_http_v3_connection_t to ngx_http_v3_session_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8429
diff changeset
281 ngx_http_v3_session_t *h3c;
8015
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
282
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
283 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
284 "http3 create push stream id:%uL", push_id);
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
285
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
286 sc = ngx_quic_open_stream(c, 0);
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
287 if (sc == NULL) {
8691
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
288 goto failed;
8015
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
289 }
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
290
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
291 p = buf;
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
292 p = (u_char *) ngx_http_v3_encode_varlen_int(p, NGX_HTTP_V3_STREAM_PUSH);
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
293 p = (u_char *) ngx_http_v3_encode_varlen_int(p, push_id);
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
294 n = p - buf;
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
295
8643
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
296 h3c = ngx_http_v3_get_session(c);
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
297 h3c->total_bytes += n;
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
298
8015
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
299 if (sc->send(sc, buf, n) != (ssize_t) n) {
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
300 goto failed;
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
301 }
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
302
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
303 cln = ngx_pool_cleanup_add(sc->pool, sizeof(ngx_http_v3_push_t));
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
304 if (cln == NULL) {
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
305 goto failed;
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
306 }
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
307
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
308 h3c->npushing++;
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
309
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
310 cln->handler = ngx_http_v3_push_cleanup;
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
311
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
312 push = cln->data;
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
313 push->id = push_id;
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
314 push->connection = sc;
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
315 push->npushing = &h3c->npushing;
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
316
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
317 ngx_queue_insert_tail(&h3c->pushing, &push->queue);
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
318
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
319 return sc;
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
320
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
321 failed:
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
322
8691
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
323 ngx_log_error(NGX_LOG_ERR, c->log, 0, "failed to create push stream");
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
324
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
325 ngx_http_v3_finalize_connection(c, NGX_HTTP_V3_ERR_STREAM_CREATION_ERROR,
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
326 "failed to create push stream");
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
327 if (sc) {
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
328 ngx_http_v3_close_uni_stream(sc);
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
329 }
8015
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
330
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
331 return NULL;
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
332 }
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
333
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
334
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
335 static void
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
336 ngx_http_v3_push_cleanup(void *data)
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
337 {
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
338 ngx_http_v3_push_t *push = data;
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
339
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
340 ngx_queue_remove(&push->queue);
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
341 (*push->npushing)--;
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
342 }
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
343
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
344
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
345 static ngx_connection_t *
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
346 ngx_http_v3_get_uni_stream(ngx_connection_t *c, ngx_uint_t type)
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
347 {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
348 u_char buf[NGX_HTTP_V3_VARLEN_INT_LEN];
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
349 size_t n;
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
350 ngx_int_t index;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
351 ngx_connection_t *sc;
8430
67f0eb150047 HTTP/3: renamed ngx_http_v3_connection_t to ngx_http_v3_session_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8429
diff changeset
352 ngx_http_v3_session_t *h3c;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
353 ngx_http_v3_uni_stream_t *us;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
354
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
355 switch (type) {
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
356 case NGX_HTTP_V3_STREAM_ENCODER:
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
357 index = NGX_HTTP_V3_STREAM_SERVER_ENCODER;
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
358 break;
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
359 case NGX_HTTP_V3_STREAM_DECODER:
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
360 index = NGX_HTTP_V3_STREAM_SERVER_DECODER;
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
361 break;
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
362 case NGX_HTTP_V3_STREAM_CONTROL:
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
363 index = NGX_HTTP_V3_STREAM_SERVER_CONTROL;
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
364 break;
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
365 default:
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
366 index = -1;
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
367 }
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
368
8428
40d710a66aef HTTP/3: ngx_http_v3_get_session() macro.
Roman Arutyunyan <arut@nginx.com>
parents: 8427
diff changeset
369 h3c = ngx_http_v3_get_session(c);
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
370
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
371 if (index >= 0) {
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
372 if (h3c->known_streams[index]) {
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
373 return h3c->known_streams[index];
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
374 }
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
375 }
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
376
8013
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8010
diff changeset
377 sc = ngx_quic_open_stream(c, 0);
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
378 if (sc == NULL) {
8691
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
379 goto failed;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
380 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
381
8359
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8358
diff changeset
382 sc->quic->cancelable = 1;
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8358
diff changeset
383
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
384 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
385 "http3 create uni stream, type:%ui", type);
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
386
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
387 us = ngx_pcalloc(sc->pool, sizeof(ngx_http_v3_uni_stream_t));
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
388 if (us == NULL) {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
389 goto failed;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
390 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
391
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
392 us->index = index;
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
393
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
394 sc->data = us;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
395
7747
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7694
diff changeset
396 sc->read->handler = ngx_http_v3_uni_read_handler;
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7694
diff changeset
397 sc->write->handler = ngx_http_v3_dummy_write_handler;
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7694
diff changeset
398
7880
c101438c69a4 HTTP/3: prevent array access by negative index for unknown streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7839
diff changeset
399 if (index >= 0) {
c101438c69a4 HTTP/3: prevent array access by negative index for unknown streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7839
diff changeset
400 h3c->known_streams[index] = sc;
c101438c69a4 HTTP/3: prevent array access by negative index for unknown streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7839
diff changeset
401 }
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
402
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
403 n = (u_char *) ngx_http_v3_encode_varlen_int(buf, type) - buf;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
404
8643
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
405 h3c = ngx_http_v3_get_session(c);
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
406 h3c->total_bytes += n;
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
407
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
408 if (sc->send(sc, buf, n) != (ssize_t) n) {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
409 goto failed;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
410 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
411
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
412 return sc;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
413
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
414 failed:
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
415
8691
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
416 ngx_log_error(NGX_LOG_ERR, c->log, 0, "failed to create server stream");
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
417
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
418 ngx_http_v3_finalize_connection(c, NGX_HTTP_V3_ERR_STREAM_CREATION_ERROR,
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
419 "failed to create server stream");
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
420 if (sc) {
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
421 ngx_http_v3_close_uni_stream(sc);
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
422 }
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
423
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
424 return NULL;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
425 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
426
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
427
8434
f4d3f5d93a82 HTTP/3: moved session initialization to a separate file.
Roman Arutyunyan <arut@nginx.com>
parents: 8432
diff changeset
428 ngx_int_t
7951
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7880
diff changeset
429 ngx_http_v3_send_settings(ngx_connection_t *c)
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7880
diff changeset
430 {
8429
9ec3e71f8a61 HTTP/3: reference h3c directly from ngx_http_connection_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8428
diff changeset
431 u_char *p, buf[NGX_HTTP_V3_VARLEN_INT_LEN * 6];
9ec3e71f8a61 HTTP/3: reference h3c directly from ngx_http_connection_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8428
diff changeset
432 size_t n;
9ec3e71f8a61 HTTP/3: reference h3c directly from ngx_http_connection_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8428
diff changeset
433 ngx_connection_t *cc;
8643
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
434 ngx_http_v3_session_t *h3c;
8429
9ec3e71f8a61 HTTP/3: reference h3c directly from ngx_http_connection_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8428
diff changeset
435 ngx_http_v3_srv_conf_t *h3scf;
8013
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8010
diff changeset
436
7951
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7880
diff changeset
437 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 send settings");
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7880
diff changeset
438
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7880
diff changeset
439 cc = ngx_http_v3_get_uni_stream(c, NGX_HTTP_V3_STREAM_CONTROL);
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7880
diff changeset
440 if (cc == NULL) {
8691
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
441 return NGX_ERROR;
7951
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7880
diff changeset
442 }
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7880
diff changeset
443
8429
9ec3e71f8a61 HTTP/3: reference h3c directly from ngx_http_connection_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8428
diff changeset
444 h3scf = ngx_http_v3_get_module_srv_conf(c, ngx_http_v3_module);
7951
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7880
diff changeset
445
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7880
diff changeset
446 n = ngx_http_v3_encode_varlen_int(NULL,
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7880
diff changeset
447 NGX_HTTP_V3_PARAM_MAX_TABLE_CAPACITY);
8010
65c1fc5fae15 HTTP/3: renamed server configuration variables from v3cf to h3scf.
Roman Arutyunyan <arut@nginx.com>
parents: 7999
diff changeset
448 n += ngx_http_v3_encode_varlen_int(NULL, h3scf->max_table_capacity);
7951
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7880
diff changeset
449 n += ngx_http_v3_encode_varlen_int(NULL, NGX_HTTP_V3_PARAM_BLOCKED_STREAMS);
8010
65c1fc5fae15 HTTP/3: renamed server configuration variables from v3cf to h3scf.
Roman Arutyunyan <arut@nginx.com>
parents: 7999
diff changeset
450 n += ngx_http_v3_encode_varlen_int(NULL, h3scf->max_blocked_streams);
7951
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7880
diff changeset
451
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7880
diff changeset
452 p = (u_char *) ngx_http_v3_encode_varlen_int(buf,
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7880
diff changeset
453 NGX_HTTP_V3_FRAME_SETTINGS);
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7880
diff changeset
454 p = (u_char *) ngx_http_v3_encode_varlen_int(p, n);
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7880
diff changeset
455 p = (u_char *) ngx_http_v3_encode_varlen_int(p,
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7880
diff changeset
456 NGX_HTTP_V3_PARAM_MAX_TABLE_CAPACITY);
8010
65c1fc5fae15 HTTP/3: renamed server configuration variables from v3cf to h3scf.
Roman Arutyunyan <arut@nginx.com>
parents: 7999
diff changeset
457 p = (u_char *) ngx_http_v3_encode_varlen_int(p, h3scf->max_table_capacity);
7951
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7880
diff changeset
458 p = (u_char *) ngx_http_v3_encode_varlen_int(p,
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7880
diff changeset
459 NGX_HTTP_V3_PARAM_BLOCKED_STREAMS);
8010
65c1fc5fae15 HTTP/3: renamed server configuration variables from v3cf to h3scf.
Roman Arutyunyan <arut@nginx.com>
parents: 7999
diff changeset
460 p = (u_char *) ngx_http_v3_encode_varlen_int(p, h3scf->max_blocked_streams);
7951
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7880
diff changeset
461 n = p - buf;
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7880
diff changeset
462
8643
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
463 h3c = ngx_http_v3_get_session(c);
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
464 h3c->total_bytes += n;
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
465
7951
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7880
diff changeset
466 if (cc->send(cc, buf, n) != (ssize_t) n) {
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7880
diff changeset
467 goto failed;
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7880
diff changeset
468 }
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7880
diff changeset
469
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7880
diff changeset
470 return NGX_OK;
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7880
diff changeset
471
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7880
diff changeset
472 failed:
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7880
diff changeset
473
8691
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
474 ngx_log_error(NGX_LOG_ERR, c->log, 0, "failed to send settings");
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
475
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
476 ngx_http_v3_finalize_connection(c, NGX_HTTP_V3_ERR_EXCESSIVE_LOAD,
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
477 "failed to send settings");
7951
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7880
diff changeset
478 ngx_http_v3_close_uni_stream(cc);
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7880
diff changeset
479
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7880
diff changeset
480 return NGX_ERROR;
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7880
diff changeset
481 }
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7880
diff changeset
482
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7880
diff changeset
483
c9538aef3211 HTTP/3: refactored dynamic table implementation.
Roman Arutyunyan <arut@nginx.com>
parents: 7880
diff changeset
484 ngx_int_t
8358
265062a99043 HTTP/3: send GOAWAY when last request is accepted.
Roman Arutyunyan <arut@nginx.com>
parents: 8354
diff changeset
485 ngx_http_v3_send_goaway(ngx_connection_t *c, uint64_t id)
265062a99043 HTTP/3: send GOAWAY when last request is accepted.
Roman Arutyunyan <arut@nginx.com>
parents: 8354
diff changeset
486 {
8643
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
487 u_char *p, buf[NGX_HTTP_V3_VARLEN_INT_LEN * 3];
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
488 size_t n;
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
489 ngx_connection_t *cc;
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
490 ngx_http_v3_session_t *h3c;
8358
265062a99043 HTTP/3: send GOAWAY when last request is accepted.
Roman Arutyunyan <arut@nginx.com>
parents: 8354
diff changeset
491
265062a99043 HTTP/3: send GOAWAY when last request is accepted.
Roman Arutyunyan <arut@nginx.com>
parents: 8354
diff changeset
492 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 send goaway %uL", id);
265062a99043 HTTP/3: send GOAWAY when last request is accepted.
Roman Arutyunyan <arut@nginx.com>
parents: 8354
diff changeset
493
265062a99043 HTTP/3: send GOAWAY when last request is accepted.
Roman Arutyunyan <arut@nginx.com>
parents: 8354
diff changeset
494 cc = ngx_http_v3_get_uni_stream(c, NGX_HTTP_V3_STREAM_CONTROL);
265062a99043 HTTP/3: send GOAWAY when last request is accepted.
Roman Arutyunyan <arut@nginx.com>
parents: 8354
diff changeset
495 if (cc == NULL) {
8691
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
496 return NGX_ERROR;
8358
265062a99043 HTTP/3: send GOAWAY when last request is accepted.
Roman Arutyunyan <arut@nginx.com>
parents: 8354
diff changeset
497 }
265062a99043 HTTP/3: send GOAWAY when last request is accepted.
Roman Arutyunyan <arut@nginx.com>
parents: 8354
diff changeset
498
265062a99043 HTTP/3: send GOAWAY when last request is accepted.
Roman Arutyunyan <arut@nginx.com>
parents: 8354
diff changeset
499 n = ngx_http_v3_encode_varlen_int(NULL, id);
265062a99043 HTTP/3: send GOAWAY when last request is accepted.
Roman Arutyunyan <arut@nginx.com>
parents: 8354
diff changeset
500 p = (u_char *) ngx_http_v3_encode_varlen_int(buf, NGX_HTTP_V3_FRAME_GOAWAY);
265062a99043 HTTP/3: send GOAWAY when last request is accepted.
Roman Arutyunyan <arut@nginx.com>
parents: 8354
diff changeset
501 p = (u_char *) ngx_http_v3_encode_varlen_int(p, n);
265062a99043 HTTP/3: send GOAWAY when last request is accepted.
Roman Arutyunyan <arut@nginx.com>
parents: 8354
diff changeset
502 p = (u_char *) ngx_http_v3_encode_varlen_int(p, id);
265062a99043 HTTP/3: send GOAWAY when last request is accepted.
Roman Arutyunyan <arut@nginx.com>
parents: 8354
diff changeset
503 n = p - buf;
265062a99043 HTTP/3: send GOAWAY when last request is accepted.
Roman Arutyunyan <arut@nginx.com>
parents: 8354
diff changeset
504
8643
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
505 h3c = ngx_http_v3_get_session(c);
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
506 h3c->total_bytes += n;
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
507
8358
265062a99043 HTTP/3: send GOAWAY when last request is accepted.
Roman Arutyunyan <arut@nginx.com>
parents: 8354
diff changeset
508 if (cc->send(cc, buf, n) != (ssize_t) n) {
265062a99043 HTTP/3: send GOAWAY when last request is accepted.
Roman Arutyunyan <arut@nginx.com>
parents: 8354
diff changeset
509 goto failed;
265062a99043 HTTP/3: send GOAWAY when last request is accepted.
Roman Arutyunyan <arut@nginx.com>
parents: 8354
diff changeset
510 }
265062a99043 HTTP/3: send GOAWAY when last request is accepted.
Roman Arutyunyan <arut@nginx.com>
parents: 8354
diff changeset
511
265062a99043 HTTP/3: send GOAWAY when last request is accepted.
Roman Arutyunyan <arut@nginx.com>
parents: 8354
diff changeset
512 return NGX_OK;
265062a99043 HTTP/3: send GOAWAY when last request is accepted.
Roman Arutyunyan <arut@nginx.com>
parents: 8354
diff changeset
513
265062a99043 HTTP/3: send GOAWAY when last request is accepted.
Roman Arutyunyan <arut@nginx.com>
parents: 8354
diff changeset
514 failed:
265062a99043 HTTP/3: send GOAWAY when last request is accepted.
Roman Arutyunyan <arut@nginx.com>
parents: 8354
diff changeset
515
8691
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
516 ngx_log_error(NGX_LOG_ERR, c->log, 0, "failed to send goaway");
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
517
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
518 ngx_http_v3_finalize_connection(c, NGX_HTTP_V3_ERR_EXCESSIVE_LOAD,
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
519 "failed to send goaway");
8358
265062a99043 HTTP/3: send GOAWAY when last request is accepted.
Roman Arutyunyan <arut@nginx.com>
parents: 8354
diff changeset
520 ngx_http_v3_close_uni_stream(cc);
265062a99043 HTTP/3: send GOAWAY when last request is accepted.
Roman Arutyunyan <arut@nginx.com>
parents: 8354
diff changeset
521
265062a99043 HTTP/3: send GOAWAY when last request is accepted.
Roman Arutyunyan <arut@nginx.com>
parents: 8354
diff changeset
522 return NGX_ERROR;
265062a99043 HTTP/3: send GOAWAY when last request is accepted.
Roman Arutyunyan <arut@nginx.com>
parents: 8354
diff changeset
523 }
265062a99043 HTTP/3: send GOAWAY when last request is accepted.
Roman Arutyunyan <arut@nginx.com>
parents: 8354
diff changeset
524
265062a99043 HTTP/3: send GOAWAY when last request is accepted.
Roman Arutyunyan <arut@nginx.com>
parents: 8354
diff changeset
525
265062a99043 HTTP/3: send GOAWAY when last request is accepted.
Roman Arutyunyan <arut@nginx.com>
parents: 8354
diff changeset
526 ngx_int_t
8508
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8497
diff changeset
527 ngx_http_v3_send_ack_section(ngx_connection_t *c, ngx_uint_t stream_id)
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
528 {
8643
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
529 u_char buf[NGX_HTTP_V3_PREFIX_INT_LEN];
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
530 size_t n;
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
531 ngx_connection_t *dc;
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
532 ngx_http_v3_session_t *h3c;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
533
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
534 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
8691
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
535 "http3 send section acknowledgement %ui", stream_id);
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
536
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
537 dc = ngx_http_v3_get_uni_stream(c, NGX_HTTP_V3_STREAM_DECODER);
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
538 if (dc == NULL) {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
539 return NGX_ERROR;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
540 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
541
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
542 buf[0] = 0x80;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
543 n = (u_char *) ngx_http_v3_encode_prefix_int(buf, stream_id, 7) - buf;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
544
8643
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
545 h3c = ngx_http_v3_get_session(c);
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
546 h3c->total_bytes += n;
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
547
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
548 if (dc->send(dc, buf, n) != (ssize_t) n) {
8691
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
549 goto failed;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
550 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
551
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
552 return NGX_OK;
8691
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
553
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
554 failed:
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
555
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
556 ngx_log_error(NGX_LOG_ERR, c->log, 0,
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
557 "failed to send section acknowledgement");
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
558
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
559 ngx_http_v3_finalize_connection(c, NGX_HTTP_V3_ERR_EXCESSIVE_LOAD,
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
560 "failed to send section acknowledgement");
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
561 ngx_http_v3_close_uni_stream(dc);
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
562
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
563 return NGX_ERROR;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
564 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
565
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
566
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
567 ngx_int_t
8431
0981329169ea HTTP/3: renamed ngx_http_v3_client_XXX() functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8430
diff changeset
568 ngx_http_v3_send_cancel_stream(ngx_connection_t *c, ngx_uint_t stream_id)
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
569 {
8643
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
570 u_char buf[NGX_HTTP_V3_PREFIX_INT_LEN];
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
571 size_t n;
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
572 ngx_connection_t *dc;
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
573 ngx_http_v3_session_t *h3c;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
574
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
575 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
8691
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
576 "http3 send stream cancellation %ui", stream_id);
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
577
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
578 dc = ngx_http_v3_get_uni_stream(c, NGX_HTTP_V3_STREAM_DECODER);
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
579 if (dc == NULL) {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
580 return NGX_ERROR;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
581 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
582
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
583 buf[0] = 0x40;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
584 n = (u_char *) ngx_http_v3_encode_prefix_int(buf, stream_id, 6) - buf;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
585
8643
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
586 h3c = ngx_http_v3_get_session(c);
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
587 h3c->total_bytes += n;
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
588
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
589 if (dc->send(dc, buf, n) != (ssize_t) n) {
8691
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
590 goto failed;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
591 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
592
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
593 return NGX_OK;
8691
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
594
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
595 failed:
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
596
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
597 ngx_log_error(NGX_LOG_ERR, c->log, 0, "failed to send stream cancellation");
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
598
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
599 ngx_http_v3_finalize_connection(c, NGX_HTTP_V3_ERR_EXCESSIVE_LOAD,
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
600 "failed to send stream cancellation");
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
601 ngx_http_v3_close_uni_stream(dc);
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
602
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
603 return NGX_ERROR;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
604 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
605
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
606
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
607 ngx_int_t
8431
0981329169ea HTTP/3: renamed ngx_http_v3_client_XXX() functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8430
diff changeset
608 ngx_http_v3_send_inc_insert_count(ngx_connection_t *c, ngx_uint_t inc)
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
609 {
8643
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
610 u_char buf[NGX_HTTP_V3_PREFIX_INT_LEN];
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
611 size_t n;
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
612 ngx_connection_t *dc;
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
613 ngx_http_v3_session_t *h3c;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
614
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
615 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
8691
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
616 "http3 send insert count increment %ui", inc);
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
617
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
618 dc = ngx_http_v3_get_uni_stream(c, NGX_HTTP_V3_STREAM_DECODER);
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
619 if (dc == NULL) {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
620 return NGX_ERROR;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
621 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
622
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
623 buf[0] = 0;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
624 n = (u_char *) ngx_http_v3_encode_prefix_int(buf, inc, 6) - buf;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
625
8643
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
626 h3c = ngx_http_v3_get_session(c);
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
627 h3c->total_bytes += n;
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8641
diff changeset
628
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
629 if (dc->send(dc, buf, n) != (ssize_t) n) {
8691
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
630 goto failed;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
631 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
632
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
633 return NGX_OK;
8691
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
634
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
635 failed:
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
636
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
637 ngx_log_error(NGX_LOG_ERR, c->log, 0,
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
638 "failed to send insert count increment");
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
639
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
640 ngx_http_v3_finalize_connection(c, NGX_HTTP_V3_ERR_EXCESSIVE_LOAD,
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
641 "failed to send insert count increment");
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
642 ngx_http_v3_close_uni_stream(dc);
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
643
925572184d4a HTTP/3: adjusted QUIC connection finalization.
Roman Arutyunyan <arut@nginx.com>
parents: 8643
diff changeset
644 return NGX_ERROR;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
645 }
8015
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
646
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
647
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
648 ngx_int_t
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
649 ngx_http_v3_set_max_push_id(ngx_connection_t *c, uint64_t max_push_id)
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
650 {
8430
67f0eb150047 HTTP/3: renamed ngx_http_v3_connection_t to ngx_http_v3_session_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8429
diff changeset
651 ngx_http_v3_session_t *h3c;
8015
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
652
8428
40d710a66aef HTTP/3: ngx_http_v3_get_session() macro.
Roman Arutyunyan <arut@nginx.com>
parents: 8427
diff changeset
653 h3c = ngx_http_v3_get_session(c);
8015
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
654
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
655 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
656 "http3 MAX_PUSH_ID:%uL", max_push_id);
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
657
8354
5cb5b568282b HTTP/3: do not push until a MAX_PUSH_ID frame is received.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8272
diff changeset
658 if (h3c->max_push_id != (uint64_t) -1 && max_push_id < h3c->max_push_id) {
8015
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
659 return NGX_HTTP_V3_ERR_ID_ERROR;
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
660 }
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
661
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
662 h3c->max_push_id = max_push_id;
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
663
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
664 return NGX_OK;
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
665 }
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
666
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
667
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
668 ngx_int_t
8497
1fec68e322d0 HTTP/3: client GOAWAY support.
Roman Arutyunyan <arut@nginx.com>
parents: 8434
diff changeset
669 ngx_http_v3_goaway(ngx_connection_t *c, uint64_t push_id)
1fec68e322d0 HTTP/3: client GOAWAY support.
Roman Arutyunyan <arut@nginx.com>
parents: 8434
diff changeset
670 {
1fec68e322d0 HTTP/3: client GOAWAY support.
Roman Arutyunyan <arut@nginx.com>
parents: 8434
diff changeset
671 ngx_http_v3_session_t *h3c;
1fec68e322d0 HTTP/3: client GOAWAY support.
Roman Arutyunyan <arut@nginx.com>
parents: 8434
diff changeset
672
1fec68e322d0 HTTP/3: client GOAWAY support.
Roman Arutyunyan <arut@nginx.com>
parents: 8434
diff changeset
673 h3c = ngx_http_v3_get_session(c);
1fec68e322d0 HTTP/3: client GOAWAY support.
Roman Arutyunyan <arut@nginx.com>
parents: 8434
diff changeset
674
1fec68e322d0 HTTP/3: client GOAWAY support.
Roman Arutyunyan <arut@nginx.com>
parents: 8434
diff changeset
675 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 GOAWAY:%uL", push_id);
1fec68e322d0 HTTP/3: client GOAWAY support.
Roman Arutyunyan <arut@nginx.com>
parents: 8434
diff changeset
676
1fec68e322d0 HTTP/3: client GOAWAY support.
Roman Arutyunyan <arut@nginx.com>
parents: 8434
diff changeset
677 h3c->goaway_push_id = push_id;
1fec68e322d0 HTTP/3: client GOAWAY support.
Roman Arutyunyan <arut@nginx.com>
parents: 8434
diff changeset
678
1fec68e322d0 HTTP/3: client GOAWAY support.
Roman Arutyunyan <arut@nginx.com>
parents: 8434
diff changeset
679 return NGX_OK;
1fec68e322d0 HTTP/3: client GOAWAY support.
Roman Arutyunyan <arut@nginx.com>
parents: 8434
diff changeset
680 }
1fec68e322d0 HTTP/3: client GOAWAY support.
Roman Arutyunyan <arut@nginx.com>
parents: 8434
diff changeset
681
1fec68e322d0 HTTP/3: client GOAWAY support.
Roman Arutyunyan <arut@nginx.com>
parents: 8434
diff changeset
682
1fec68e322d0 HTTP/3: client GOAWAY support.
Roman Arutyunyan <arut@nginx.com>
parents: 8434
diff changeset
683 ngx_int_t
8015
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
684 ngx_http_v3_cancel_push(ngx_connection_t *c, uint64_t push_id)
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
685 {
8430
67f0eb150047 HTTP/3: renamed ngx_http_v3_connection_t to ngx_http_v3_session_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8429
diff changeset
686 ngx_queue_t *q;
67f0eb150047 HTTP/3: renamed ngx_http_v3_connection_t to ngx_http_v3_session_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8429
diff changeset
687 ngx_http_request_t *r;
67f0eb150047 HTTP/3: renamed ngx_http_v3_connection_t to ngx_http_v3_session_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8429
diff changeset
688 ngx_http_v3_push_t *push;
67f0eb150047 HTTP/3: renamed ngx_http_v3_connection_t to ngx_http_v3_session_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8429
diff changeset
689 ngx_http_v3_session_t *h3c;
8015
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
690
8428
40d710a66aef HTTP/3: ngx_http_v3_get_session() macro.
Roman Arutyunyan <arut@nginx.com>
parents: 8427
diff changeset
691 h3c = ngx_http_v3_get_session(c);
8015
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
692
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
693 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
694 "http3 CANCEL_PUSH:%uL", push_id);
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
695
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
696 if (push_id >= h3c->next_push_id) {
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
697 return NGX_HTTP_V3_ERR_ID_ERROR;
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
698 }
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
699
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
700 for (q = ngx_queue_head(&h3c->pushing);
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
701 q != ngx_queue_sentinel(&h3c->pushing);
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
702 q = ngx_queue_next(&h3c->pushing))
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
703 {
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
704 push = (ngx_http_v3_push_t *) q;
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
705
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
706 if (push->id != push_id) {
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
707 continue;
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
708 }
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
709
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
710 r = push->connection->data;
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
711
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
712 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
713 "http3 cancel push");
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
714
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
715 ngx_http_finalize_request(r, NGX_HTTP_CLOSE);
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
716
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
717 break;
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
718 }
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
719
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
720 return NGX_OK;
0596fe1aee16 HTTP/3: server pushes.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
721 }
8427
33ec97749b5f HTTP/3: moved Stream Cancellation stub to ngx_http_v3_streams.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8360
diff changeset
722
33ec97749b5f HTTP/3: moved Stream Cancellation stub to ngx_http_v3_streams.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8360
diff changeset
723
33ec97749b5f HTTP/3: moved Stream Cancellation stub to ngx_http_v3_streams.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8360
diff changeset
724 ngx_int_t
33ec97749b5f HTTP/3: moved Stream Cancellation stub to ngx_http_v3_streams.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8360
diff changeset
725 ngx_http_v3_cancel_stream(ngx_connection_t *c, ngx_uint_t stream_id)
33ec97749b5f HTTP/3: moved Stream Cancellation stub to ngx_http_v3_streams.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8360
diff changeset
726 {
33ec97749b5f HTTP/3: moved Stream Cancellation stub to ngx_http_v3_streams.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8360
diff changeset
727 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
33ec97749b5f HTTP/3: moved Stream Cancellation stub to ngx_http_v3_streams.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8360
diff changeset
728 "http3 cancel stream %ui", stream_id);
33ec97749b5f HTTP/3: moved Stream Cancellation stub to ngx_http_v3_streams.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8360
diff changeset
729
33ec97749b5f HTTP/3: moved Stream Cancellation stub to ngx_http_v3_streams.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8360
diff changeset
730 /* we do not use dynamic tables */
33ec97749b5f HTTP/3: moved Stream Cancellation stub to ngx_http_v3_streams.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8360
diff changeset
731
33ec97749b5f HTTP/3: moved Stream Cancellation stub to ngx_http_v3_streams.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8360
diff changeset
732 return NGX_OK;
33ec97749b5f HTTP/3: moved Stream Cancellation stub to ngx_http_v3_streams.c.
Roman Arutyunyan <arut@nginx.com>
parents: 8360
diff changeset
733 }