aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/http/v3/ngx_http_v3.h2
-rw-r--r--src/http/v3/ngx_http_v3_request.c14
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) {