# HG changeset patch # User Roman Arutyunyan # Date 1632230673 -10800 # Node ID 1ead7d64e9934c1a6c0d9dd3c5f1a3d643b926d6 # Parent 13cb758e6ac08ec4e4ae62591624bb77370f0a31 QUIC: send RESET_STREAM in response to STOP_SENDING. 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. diff --git a/src/event/quic/ngx_event_quic_streams.c b/src/event/quic/ngx_event_quic_streams.c --- a/src/event/quic/ngx_event_quic_streams.c +++ b/src/event/quic/ngx_event_quic_streams.c @@ -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_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);