]> git.kaiwu.me - nginx.git/commitdiff
HTTP/3: send Stream Cancellation instruction.
authorRoman Arutyunyan <arut@nginx.com>
Mon, 18 Oct 2021 11:48:11 +0000 (14:48 +0300)
committerRoman Arutyunyan <arut@nginx.com>
Mon, 18 Oct 2021 11:48:11 +0000 (14:48 +0300)
As per quic-qpack-21:

   When a stream is reset or reading is abandoned, the decoder emits a
   Stream Cancellation instruction.

Previously the instruction was not sent.  Now it's sent when closing QUIC
stream connection if dynamic table capacity is non-zero and eof was not
received from client.  The latter condition means that a trailers section
may still be on its way from client and the stream needs to be cancelled.

src/http/v3/ngx_http_v3_request.c

index 6f980ed0b1d60294c17328d496ca1b470a7b52ca..e0c3a71bab5c36098e207eb0f1bd50d24901fd1d 100644 (file)
@@ -279,6 +279,14 @@ ngx_http_v3_wait_request_handler(ngx_event_t *rev)
 void
 ngx_http_v3_reset_connection(ngx_connection_t *c)
 {
+    ngx_http_v3_srv_conf_t  *h3scf;
+
+    h3scf = ngx_http_v3_get_module_srv_conf(c, ngx_http_v3_module);
+
+    if (h3scf->max_table_capacity > 0 && !c->read->eof) {
+        (void) ngx_http_v3_send_cancel_stream(c, c->quic->id);
+    }
+
     if (c->timedout) {
         ngx_quic_reset_stream(c, NGX_HTTP_V3_ERR_GENERAL_PROTOCOL_ERROR);