annotate src/http/v3/ngx_http_v3_streams.c @ 7870:e169cce912c7 quic

Avoid retransmitting of packets with discarded keys. Sections 4.10.1 and 4.10.2 of quic transport describe discarding of initial and handshake keys. Since the keys are discarded, we no longer need to retransmit packets and corresponding queues should be emptied. This patch removes previously added workaround that did not require acknowledgement for initial packets, resulting in avoiding retransmission, which is wrong because a packet could be lost and we have to retransmit it.
author Vladimir Homutov <vl@nginx.com>
date Mon, 18 May 2020 13:54:53 +0300
parents 44cac24aaa44
children c101438c69a4
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
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
13 typedef ngx_int_t (*ngx_http_v3_handler_pt)(ngx_connection_t *c, void *data,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
14 u_char ch);
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
15
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
16
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
17 typedef struct {
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
18 ngx_http_v3_handler_pt handler;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
19 void *data;
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
20 ngx_int_t index;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
21 } ngx_http_v3_uni_stream_t;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
22
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
23
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
24 static void ngx_http_v3_close_uni_stream(ngx_connection_t *c);
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
25 static void ngx_http_v3_read_uni_stream_type(ngx_event_t *rev);
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
26 static void ngx_http_v3_uni_read_handler(ngx_event_t *rev);
7747
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7694
diff changeset
27 static void ngx_http_v3_dummy_write_handler(ngx_event_t *wev);
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
28 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
29 ngx_uint_t type);
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
30
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
31
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
32 void
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
33 ngx_http_v3_handle_client_uni_stream(ngx_connection_t *c)
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
34 {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
35 ngx_http_v3_uni_stream_t *us;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
36
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
37 ngx_http_v3_get_uni_stream(c, NGX_HTTP_V3_STREAM_CONTROL);
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
38 ngx_http_v3_get_uni_stream(c, NGX_HTTP_V3_STREAM_ENCODER);
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
39 ngx_http_v3_get_uni_stream(c, NGX_HTTP_V3_STREAM_DECODER);
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
40
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
41 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
42 "http3 new uni stream id:0x%uxL", c->qs->id);
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
43
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
44 us = ngx_pcalloc(c->pool, sizeof(ngx_http_v3_uni_stream_t));
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
45 if (us == NULL) {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
46 ngx_http_v3_close_uni_stream(c);
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
47 return;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
48 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
49
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
50 us->index = -1;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
51
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
52 c->data = us;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
53
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
54 c->read->handler = ngx_http_v3_read_uni_stream_type;
7747
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7694
diff changeset
55 c->write->handler = ngx_http_v3_dummy_write_handler;
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7694
diff changeset
56
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
57 ngx_http_v3_read_uni_stream_type(c->read);
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
58 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
59
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
60
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
61 static void
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
62 ngx_http_v3_close_uni_stream(ngx_connection_t *c)
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
63 {
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
64 ngx_pool_t *pool;
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
65 ngx_http_v3_connection_t *h3c;
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
66 ngx_http_v3_uni_stream_t *us;
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
67
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
68 us = c->data;
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
69 h3c = c->qs->parent->data;
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
70
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
71 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
72
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
73 if (us->index >= 0) {
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
74 h3c->known_streams[us->index] = NULL;
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
75 }
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
76
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
77 c->destroyed = 1;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
78
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
79 pool = c->pool;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
80
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
81 ngx_close_connection(c);
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
82
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
83 ngx_destroy_pool(pool);
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
84 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
85
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
86
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
87 static void
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
88 ngx_http_v3_read_uni_stream_type(ngx_event_t *rev)
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
89 {
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
90 u_char ch;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
91 ssize_t n;
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
92 ngx_int_t index;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
93 ngx_connection_t *c;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
94 ngx_http_v3_connection_t *h3c;
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
95 ngx_http_v3_uni_stream_t *us;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
96
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
97 c = rev->data;
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
98 us = c->data;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
99 h3c = c->qs->parent->data;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
100
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
101 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 read stream type");
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
102
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
103 while (rev->ready) {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
104
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
105 n = c->recv(c, &ch, 1);
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
106
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
107 if (n == NGX_ERROR) {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
108 goto failed;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
109 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
110
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
111 if (n == NGX_AGAIN || n != 1) {
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
112 break;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
113 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
114
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
115 switch (ch) {
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
116
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
117 case NGX_HTTP_V3_STREAM_ENCODER:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
118
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
119 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
120 "http3 encoder stream");
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
121
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
122 index = NGX_HTTP_V3_STREAM_CLIENT_ENCODER;
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
123 us->handler = ngx_http_v3_parse_encoder;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
124 n = sizeof(ngx_http_v3_parse_encoder_t);
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
125
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
126 break;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
127
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
128 case NGX_HTTP_V3_STREAM_DECODER:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
129
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
130 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
131 "http3 decoder stream");
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
132
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
133 index = NGX_HTTP_V3_STREAM_CLIENT_DECODER;
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
134 us->handler = ngx_http_v3_parse_decoder;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
135 n = sizeof(ngx_http_v3_parse_decoder_t);
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
136
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
137 break;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
138
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
139 case NGX_HTTP_V3_STREAM_CONTROL:
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
140
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
141 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
142 "http3 control stream");
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
143
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
144 index = NGX_HTTP_V3_STREAM_CLIENT_CONTROL;
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
145 us->handler = ngx_http_v3_parse_control;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
146 n = sizeof(ngx_http_v3_parse_control_t);
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
147
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
148 break;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
149
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
150 default:
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
151
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
152 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
153 "http3 stream 0x%02xi", (ngx_int_t) ch);
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
154 index = -1;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
155 n = 0;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
156 }
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
157
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
158 if (index >= 0) {
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
159 if (h3c->known_streams[index]) {
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
160 ngx_log_error(NGX_LOG_INFO, c->log, 0, "stream exists");
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
161 goto failed;
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
162 }
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
163
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
164 us->index = index;
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
165 h3c->known_streams[index] = c;
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
166 }
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
167
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
168 if (n) {
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
169 us->data = ngx_pcalloc(c->pool, n);
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
170 if (us->data == NULL) {
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
171 goto failed;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
172 }
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
173 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
174
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
175 rev->handler = ngx_http_v3_uni_read_handler;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
176 ngx_http_v3_uni_read_handler(rev);
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
177 return;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
178 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
179
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
180 if (ngx_handle_read_event(rev, 0) != NGX_OK) {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
181 goto failed;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
182 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
183
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
184 return;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
185
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
186 failed:
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
187
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
188 ngx_http_v3_close_uni_stream(c);
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
189 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
190
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
191
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
192 static void
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
193 ngx_http_v3_uni_read_handler(ngx_event_t *rev)
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
194 {
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
195 u_char buf[128];
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
196 ssize_t n;
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
197 ngx_int_t rc, i;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
198 ngx_connection_t *c;
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
199 ngx_http_v3_uni_stream_t *us;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
200
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
201 c = rev->data;
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
202 us = c->data;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
203
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
204 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
205
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
206 while (rev->ready) {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
207
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
208 n = c->recv(c, buf, sizeof(buf));
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
209
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
210 if (n == NGX_ERROR || n == 0) {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
211 goto failed;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
212 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
213
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
214 if (n == NGX_AGAIN) {
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
215 break;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
216 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
217
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
218 if (us->handler == NULL) {
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
219 continue;
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
220 }
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
221
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
222 for (i = 0; i < n; i++) {
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
223
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
224 rc = us->handler(c, us->data, buf[i]);
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
225
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
226 if (rc == NGX_ERROR) {
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
227 goto failed;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
228 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
229
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
230 if (rc == NGX_DONE) {
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
231 goto done;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
232 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
233
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
234 /* rc == NGX_AGAIN */
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
235 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
236 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
237
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
238 if (ngx_handle_read_event(rev, 0) != NGX_OK) {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
239 goto failed;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
240 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
241
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
242 return;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
243
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
244 done:
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
245
7692
268f4389130d Refactored HTTP/3 parser.
Roman Arutyunyan <arut@nginx.com>
parents: 7681
diff changeset
246 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 read done");
7681
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
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
250 ngx_http_v3_close_uni_stream(c);
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
251 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
252
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
253
7747
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7694
diff changeset
254 static void
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7694
diff changeset
255 ngx_http_v3_dummy_write_handler(ngx_event_t *wev)
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7694
diff changeset
256 {
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7694
diff changeset
257 ngx_connection_t *c;
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7694
diff changeset
258
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7694
diff changeset
259 c = wev->data;
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7694
diff changeset
260
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7694
diff changeset
261 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 dummy write handler");
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7694
diff changeset
262
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7694
diff changeset
263 if (ngx_handle_write_event(wev, 0) != NGX_OK) {
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7694
diff changeset
264 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
265 }
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7694
diff changeset
266 }
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7694
diff changeset
267
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7694
diff changeset
268
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
269 /* XXX async & buffered stream writes */
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
270
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
271 static ngx_connection_t *
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
272 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
273 {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
274 u_char buf[NGX_HTTP_V3_VARLEN_INT_LEN];
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
275 size_t n;
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
276 ngx_int_t index;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
277 ngx_connection_t *sc;
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
278 ngx_http_v3_connection_t *h3c;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
279 ngx_http_v3_uni_stream_t *us;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
280
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
281 switch (type) {
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
282 case NGX_HTTP_V3_STREAM_ENCODER:
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
283 index = NGX_HTTP_V3_STREAM_SERVER_ENCODER;
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
284 break;
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
285 case NGX_HTTP_V3_STREAM_DECODER:
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
286 index = NGX_HTTP_V3_STREAM_SERVER_DECODER;
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
287 break;
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
288 case NGX_HTTP_V3_STREAM_CONTROL:
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
289 index = NGX_HTTP_V3_STREAM_SERVER_CONTROL;
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
290 break;
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
291 default:
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
292 index = -1;
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
293 }
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
294
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
295 h3c = c->qs->parent->data;
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
296
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
297 if (index >= 0) {
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
298 if (h3c->known_streams[index]) {
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
299 return h3c->known_streams[index];
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
300 }
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
301 }
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
302
7694
ac41c53e446d Fixed HTTP/3 server stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7692
diff changeset
303 sc = ngx_quic_create_uni_stream(c);
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
304 if (sc == NULL) {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
305 return NULL;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
306 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
307
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
308 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
309 "http3 create uni stream, type:%ui", type);
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
310
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
311 us = ngx_pcalloc(sc->pool, sizeof(ngx_http_v3_uni_stream_t));
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
312 if (us == NULL) {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
313 goto failed;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
314 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
315
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
316 us->index = index;
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
317
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
318 sc->data = us;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
319
7747
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7694
diff changeset
320 sc->read->handler = ngx_http_v3_uni_read_handler;
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7694
diff changeset
321 sc->write->handler = ngx_http_v3_dummy_write_handler;
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7694
diff changeset
322
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
323 h3c->known_streams[index] = sc;
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
324
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
325 n = (u_char *) ngx_http_v3_encode_varlen_int(buf, type) - buf;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
326
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
327 if (sc->send(sc, buf, n) != (ssize_t) n) {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
328 goto failed;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
329 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
330
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
331 return sc;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
332
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
333 failed:
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
334
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
335 ngx_http_v3_close_uni_stream(sc);
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
336
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
337 return NULL;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
338 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
339
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
340
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
341 ngx_int_t
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
342 ngx_http_v3_client_ref_insert(ngx_connection_t *c, ngx_uint_t dynamic,
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
343 ngx_uint_t index, ngx_str_t *value)
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
344 {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
345 u_char *p, buf[NGX_HTTP_V3_PREFIX_INT_LEN * 2];
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
346 size_t n;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
347 ngx_connection_t *ec;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
348
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
349 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, c->log, 0,
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
350 "http3 client ref insert, %s[%ui] \"%V\"",
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
351 dynamic ? "dynamic" : "static", index, value);
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
352
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
353 ec = ngx_http_v3_get_uni_stream(c, NGX_HTTP_V3_STREAM_ENCODER);
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
354 if (ec == NULL) {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
355 return NGX_ERROR;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
356 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
357
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
358 p = buf;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
359
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
360 *p = (dynamic ? 0x80 : 0xc0);
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
361 p = (u_char *) ngx_http_v3_encode_prefix_int(p, index, 6);
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
362
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
363 /* XXX option for huffman? */
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
364 *p = 0;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
365 p = (u_char *) ngx_http_v3_encode_prefix_int(p, value->len, 7);
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
366
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
367 n = p - buf;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
368
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
369 if (ec->send(ec, buf, n) != (ssize_t) n) {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
370 goto failed;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
371 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
372
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
373 if (ec->send(ec, value->data, value->len) != (ssize_t) value->len) {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
374 goto failed;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
375 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
376
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
377 return NGX_OK;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
378
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
379 failed:
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
380
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
381 ngx_http_v3_close_uni_stream(ec);
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
382
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
383 return NGX_ERROR;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
384 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
385
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
386
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
387 ngx_int_t
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
388 ngx_http_v3_client_insert(ngx_connection_t *c, ngx_str_t *name,
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
389 ngx_str_t *value)
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
390 {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
391 u_char buf[NGX_HTTP_V3_PREFIX_INT_LEN];
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
392 size_t n;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
393 ngx_connection_t *ec;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
394
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
395 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
396 "http3 client insert \"%V\":\"%V\"", name, value);
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
397
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
398 ec = ngx_http_v3_get_uni_stream(c, NGX_HTTP_V3_STREAM_ENCODER);
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
399 if (ec == NULL) {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
400 return NGX_ERROR;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
401 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
402
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
403 /* XXX option for huffman? */
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
404 buf[0] = 0x40;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
405 n = (u_char *) ngx_http_v3_encode_prefix_int(buf, name->len, 5) - buf;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
406
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
407 if (ec->send(ec, buf, n) != (ssize_t) n) {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
408 goto failed;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
409 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
410
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
411 if (ec->send(ec, name->data, name->len) != (ssize_t) name->len) {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
412 goto failed;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
413 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
414
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
415 /* XXX option for huffman? */
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
416 buf[0] = 0;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
417 n = (u_char *) ngx_http_v3_encode_prefix_int(buf, value->len, 7) - buf;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
418
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
419 if (ec->send(ec, buf, n) != (ssize_t) n) {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
420 goto failed;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
421 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
422
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
423 if (ec->send(ec, value->data, value->len) != (ssize_t) value->len) {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
424 goto failed;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
425 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
426
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
427 return NGX_OK;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
428
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
429 failed:
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
430
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
431 ngx_http_v3_close_uni_stream(ec);
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
432
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
433 return NGX_ERROR;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
434 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
435
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
436
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
437 ngx_int_t
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
438 ngx_http_v3_client_set_capacity(ngx_connection_t *c, ngx_uint_t capacity)
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
439 {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
440 u_char buf[NGX_HTTP_V3_PREFIX_INT_LEN];
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
441 size_t n;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
442 ngx_connection_t *ec;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
443
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
444 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
445 "http3 client set capacity %ui", capacity);
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
446
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
447 ec = ngx_http_v3_get_uni_stream(c, NGX_HTTP_V3_STREAM_ENCODER);
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
448 if (ec == NULL) {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
449 return NGX_ERROR;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
450 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
451
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
452 buf[0] = 0x20;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
453 n = (u_char *) ngx_http_v3_encode_prefix_int(buf, capacity, 5) - buf;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
454
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
455 if (ec->send(ec, buf, n) != (ssize_t) n) {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
456 ngx_http_v3_close_uni_stream(ec);
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
457 return NGX_ERROR;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
458 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
459
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
460 return NGX_OK;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
461 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
462
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
463
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
464 ngx_int_t
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
465 ngx_http_v3_client_duplicate(ngx_connection_t *c, ngx_uint_t index)
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
466 {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
467 u_char buf[NGX_HTTP_V3_PREFIX_INT_LEN];
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
468 size_t n;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
469 ngx_connection_t *ec;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
470
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
471 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
472 "http3 client duplicate %ui", index);
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
473
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
474 ec = ngx_http_v3_get_uni_stream(c, NGX_HTTP_V3_STREAM_ENCODER);
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
475 if (ec == NULL) {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
476 return NGX_ERROR;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
477 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
478
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
479 buf[0] = 0;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
480 n = (u_char *) ngx_http_v3_encode_prefix_int(buf, index, 5) - buf;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
481
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
482 if (ec->send(ec, buf, n) != (ssize_t) n) {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
483 ngx_http_v3_close_uni_stream(ec);
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
484 return NGX_ERROR;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
485 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
486
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
487 return NGX_OK;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
488 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
489
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
490
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
491 ngx_int_t
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
492 ngx_http_v3_client_ack_header(ngx_connection_t *c, ngx_uint_t stream_id)
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
493 {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
494 u_char buf[NGX_HTTP_V3_PREFIX_INT_LEN];
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
495 size_t n;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
496 ngx_connection_t *dc;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
497
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
498 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
499 "http3 client ack header %ui", stream_id);
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
500
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
501 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
502 if (dc == NULL) {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
503 return NGX_ERROR;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
504 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
505
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
506 buf[0] = 0x80;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
507 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
508
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
509 if (dc->send(dc, buf, n) != (ssize_t) n) {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
510 ngx_http_v3_close_uni_stream(dc);
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
511 return NGX_ERROR;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
512 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
513
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
514 return NGX_OK;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
515 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
516
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
517
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
518 ngx_int_t
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
519 ngx_http_v3_client_cancel_stream(ngx_connection_t *c, ngx_uint_t stream_id)
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
520 {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
521 u_char buf[NGX_HTTP_V3_PREFIX_INT_LEN];
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
522 size_t n;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
523 ngx_connection_t *dc;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
524
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
525 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
526 "http3 client cancel stream %ui", stream_id);
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
527
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
528 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
529 if (dc == NULL) {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
530 return NGX_ERROR;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
531 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
532
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
533 buf[0] = 0x40;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
534 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
535
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
536 if (dc->send(dc, buf, n) != (ssize_t) n) {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
537 ngx_http_v3_close_uni_stream(dc);
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
538 return NGX_ERROR;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
539 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
540
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
541 return NGX_OK;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
542 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
543
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
544
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
545 ngx_int_t
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
546 ngx_http_v3_client_inc_insert_count(ngx_connection_t *c, ngx_uint_t inc)
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
547 {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
548 u_char buf[NGX_HTTP_V3_PREFIX_INT_LEN];
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
549 size_t n;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
550 ngx_connection_t *dc;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
551
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
552 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
553 "http3 client increment insert count %ui", inc);
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
554
7749
dadbc66e9fca Simplifed handling HTTP/3 streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
555 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
556 if (dc == NULL) {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
557 return NGX_ERROR;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
558 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
559
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
560 buf[0] = 0;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
561 n = (u_char *) ngx_http_v3_encode_prefix_int(buf, inc, 6) - buf;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
562
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
563 if (dc->send(dc, buf, n) != (ssize_t) n) {
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
564 ngx_http_v3_close_uni_stream(dc);
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
565 return NGX_ERROR;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
566 }
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
567
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
568 return NGX_OK;
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
569 }