annotate src/http/v3/ngx_http_v3_uni.c @ 8855:a5aebd51e4c7 quic

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