aboutsummaryrefslogtreecommitdiff
path: root/src/http/v3/ngx_http_v3_streams.c
diff options
context:
space:
mode:
authorRoman Arutyunyan <arut@nginx.com>2021-10-18 15:47:06 +0300
committerRoman Arutyunyan <arut@nginx.com>2021-10-18 15:47:06 +0300
commita6fb8fe85077bd10e11231c70ece803284890520 (patch)
tree6bc3840c63acaf0c38cb7db79073826c57085edc /src/http/v3/ngx_http_v3_streams.c
parent6118ec73cfef53897d00cc81810ee661321f0057 (diff)
downloadnginx-a6fb8fe85077bd10e11231c70ece803284890520.tar.gz
nginx-a6fb8fe85077bd10e11231c70ece803284890520.zip
HTTP/3: allowed QUIC stream connection reuse.
A QUIC stream connection is treated as reusable until first bytes of request arrive, which is also when the request object is now allocated. A connection closed as a result of draining, is reset with the error code H3_REQUEST_REJECTED. Such behavior is allowed by quic-http-34: Once a request stream has been opened, the request MAY be cancelled by either endpoint. Clients cancel requests if the response is no longer of interest; servers cancel requests if they are unable to or choose not to respond. When the server cancels a request without performing any application processing, the request is considered "rejected." The server SHOULD abort its response stream with the error code H3_REQUEST_REJECTED. The client can treat requests rejected by the server as though they had never been sent at all, thereby allowing them to be retried later.
Diffstat (limited to 'src/http/v3/ngx_http_v3_streams.c')
-rw-r--r--src/http/v3/ngx_http_v3_streams.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/src/http/v3/ngx_http_v3_streams.c b/src/http/v3/ngx_http_v3_streams.c
index 257ec317a..23b16cbc2 100644
--- a/src/http/v3/ngx_http_v3_streams.c
+++ b/src/http/v3/ngx_http_v3_streams.c
@@ -49,7 +49,8 @@ ngx_http_v3_init_uni_stream(ngx_connection_t *c)
ngx_http_v3_finalize_connection(c,
NGX_HTTP_V3_ERR_STREAM_CREATION_ERROR,
"reached maximum number of uni streams");
- ngx_http_close_connection(c);
+ c->data = NULL;
+ ngx_http_v3_close_uni_stream(c);
return;
}
@@ -57,7 +58,11 @@ ngx_http_v3_init_uni_stream(ngx_connection_t *c)
us = ngx_pcalloc(c->pool, sizeof(ngx_http_v3_uni_stream_t));
if (us == NULL) {
- ngx_http_close_connection(c);
+ ngx_http_v3_finalize_connection(c,
+ NGX_HTTP_V3_ERR_INTERNAL_ERROR,
+ "memory allocation error");
+ c->data = NULL;
+ ngx_http_v3_close_uni_stream(c);
return;
}
@@ -79,12 +84,12 @@ ngx_http_v3_close_uni_stream(ngx_connection_t *c)
ngx_http_v3_session_t *h3c;
ngx_http_v3_uni_stream_t *us;
- us = c->data;
- h3c = ngx_http_v3_get_session(c);
-
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 close stream");
- if (us->index >= 0) {
+ us = c->data;
+
+ if (us && us->index >= 0) {
+ h3c = ngx_http_v3_get_session(c);
h3c->known_streams[us->index] = NULL;
}