diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/http/v3/ngx_http_v3.h | 2 | ||||
-rw-r--r-- | src/http/v3/ngx_http_v3_request.c | 14 |
2 files changed, 12 insertions, 4 deletions
diff --git a/src/http/v3/ngx_http_v3.h b/src/http/v3/ngx_http_v3.h index 18b7a7636..45d1a3671 100644 --- a/src/http/v3/ngx_http_v3.h +++ b/src/http/v3/ngx_http_v3.h @@ -143,6 +143,8 @@ typedef struct { uint64_t next_push_id; uint64_t max_push_id; + ngx_uint_t goaway; /* unsigned goaway:1; */ + ngx_connection_t *known_streams[NGX_HTTP_V3_MAX_KNOWN_STREAM]; } ngx_http_v3_connection_t; diff --git a/src/http/v3/ngx_http_v3_request.c b/src/http/v3/ngx_http_v3_request.c index 4dc673078..c459efef5 100644 --- a/src/http/v3/ngx_http_v3_request.c +++ b/src/http/v3/ngx_http_v3_request.c @@ -81,15 +81,22 @@ ngx_http_v3_init(ngx_connection_t *c) clcf = ngx_http_get_module_loc_conf(hc->conf_ctx, ngx_http_core_module); - n = c->quic->id >> 2; + h3c = c->quic->parent->data; - if (n >= clcf->keepalive_requests) { + if (h3c->goaway) { ngx_quic_reset_stream(c, NGX_HTTP_V3_ERR_REQUEST_REJECTED); ngx_http_close_connection(c); return; } - if (n + 1 == clcf->keepalive_requests) { + n = c->quic->id >> 2; + + if (n + 1 == clcf->keepalive_requests + || ngx_current_msec - c->quic->parent->start_time + > clcf->keepalive_time) + { + h3c->goaway = 1; + if (ngx_http_v3_send_goaway(c, (n + 1) << 2) != NGX_OK) { ngx_http_v3_finalize_connection(c, NGX_HTTP_V3_ERR_INTERNAL_ERROR, "goaway error"); @@ -110,7 +117,6 @@ ngx_http_v3_init(ngx_connection_t *c) cln->handler = ngx_http_v3_cleanup_request; cln->data = c; - h3c = c->quic->parent->data; h3c->nrequests++; if (h3c->keepalive.timer_set) { |