]> git.kaiwu.me - nginx.git/commitdiff
QUIC: send RESET_STREAM in response to STOP_SENDING.
authorRoman Arutyunyan <arut@nginx.com>
Tue, 21 Sep 2021 13:24:33 +0000 (16:24 +0300)
committerRoman Arutyunyan <arut@nginx.com>
Tue, 21 Sep 2021 13:24:33 +0000 (16:24 +0300)
As per RFC 9000:

   An endpoint that receives a STOP_SENDING frame MUST send a RESET_STREAM
   frame if the stream is in the "Ready" or "Send" state.

   An endpoint SHOULD copy the error code from the STOP_SENDING frame to
   the RESET_STREAM frame it sends, but it can use any application error code.

src/event/quic/ngx_event_quic_streams.c

index 0bd487f83f9c5a3216418151d6c676d7c48cc0e7..a49117dc93ef2d2a2ebeaeb1f7b296ba8b08d58d 100644 (file)
@@ -1253,6 +1253,7 @@ ngx_int_t
 ngx_quic_handle_stop_sending_frame(ngx_connection_t *c,
     ngx_quic_header_t *pkt, ngx_quic_stop_sending_frame_t *f)
 {
+    ngx_pool_t             *pool;
     ngx_event_t            *wev;
     ngx_connection_t       *sc;
     ngx_quic_stream_t      *qs;
@@ -1282,16 +1283,23 @@ ngx_quic_handle_stop_sending_frame(ngx_connection_t *c,
 
         sc = qs->connection;
 
-        wev = sc->write;
-        wev->error = 1;
-        wev->ready = 1;
+        if (ngx_quic_reset_stream(sc, f->error_code) != NGX_OK) {
+            pool = sc->pool;
+
+            ngx_close_connection(sc);
+            ngx_destroy_pool(pool);
+
+            return NGX_ERROR;
+        }
 
         return ngx_quic_init_stream(qs);
     }
 
+    if (ngx_quic_reset_stream(qs->connection, f->error_code) != NGX_OK) {
+        return NGX_ERROR;
+    }
+
     wev = qs->connection->write;
-    wev->error = 1;
-    wev->ready = 1;
 
     if (wev->active) {
         wev->handler(wev);