[PATCH 5 of 8] HTTP/3: keepalive timer for hq mode

Roman Arutyunyan arut at nginx.com
Thu Jun 23 15:58:43 UTC 2022


# HG changeset patch
# User Roman Arutyunyan <arut at nginx.com>
# Date 1655998736 -14400
#      Thu Jun 23 19:38:56 2022 +0400
# Branch quic
# Node ID 56b6cd5bc78bba1085a168c0f5ea9a03d34646c5
# Parent  1912c09e0e4d746ec0a4c2140b6d2046b283b647
HTTP/3: keepalive timer for hq mode.

diff --git a/src/http/v3/ngx_http_v3.c b/src/http/v3/ngx_http_v3.c
--- a/src/http/v3/ngx_http_v3.c
+++ b/src/http/v3/ngx_http_v3.c
@@ -61,7 +61,7 @@ ngx_http_v3_init_session(ngx_connection_
 
     hc->v3_session = h3c;
 
-    return ngx_http_v3_send_settings(c);
+    return NGX_OK;
 
 failed:
 
diff --git a/src/http/v3/ngx_http_v3_request.c b/src/http/v3/ngx_http_v3_request.c
--- a/src/http/v3/ngx_http_v3_request.c
+++ b/src/http/v3/ngx_http_v3_request.c
@@ -61,6 +61,7 @@ static const struct {
 void
 ngx_http_v3_init(ngx_connection_t *c)
 {
+    ngx_http_v3_session_t     *h3c;
     ngx_http_connection_t     *hc, *phc;
     ngx_http_v3_srv_conf_t    *h3scf;
     ngx_http_core_loc_conf_t  *clcf;
@@ -87,6 +88,13 @@ ngx_http_v3_init(ngx_connection_t *c)
         ngx_set_connection_log(c, clcf->error_log);
     }
 
+    h3c = hc->v3_session;
+
+    if (h3c == NULL && ngx_http_v3_init_session(c) != NGX_OK) {
+        ngx_http_close_connection(c);
+        return;
+    }
+
 #if (NGX_HTTP_V3_HQ)
     if (h3scf->hq) {
         ngx_http_v3_init_hq_stream(c);
@@ -94,7 +102,7 @@ ngx_http_v3_init(ngx_connection_t *c)
     }
 #endif
 
-    if (ngx_http_v3_init_session(c) != NGX_OK) {
+    if (h3c == NULL && ngx_http_v3_send_settings(c)) {
         ngx_http_close_connection(c);
         return;
     }
@@ -115,6 +123,9 @@ ngx_http_v3_init_hq_stream(ngx_connectio
 {
     uint64_t                   n;
     ngx_event_t               *rev;
+    ngx_connection_t          *pc;
+    ngx_pool_cleanup_t        *cln;
+    ngx_http_v3_session_t     *h3c;
     ngx_http_connection_t     *hc;
     ngx_http_core_loc_conf_t  *clcf;
     ngx_http_core_srv_conf_t  *cscf;
@@ -159,6 +170,28 @@ ngx_http_v3_init_hq_stream(ngx_connectio
         return;
     }
 
+    pc = c->quic->parent;
+    h3c = ngx_http_v3_get_session(c);
+
+    cln = ngx_pool_cleanup_add(c->pool, 0);
+    if (cln == NULL) {
+        ngx_quic_finalize_connection(pc, NGX_HTTP_V3_ERR_INTERNAL_ERROR,
+                                     "internal error");
+        ngx_http_close_connection(c);
+        return;
+    }
+
+    cln->handler = ngx_http_v3_cleanup_connection;
+    cln->data = c;
+
+    if (h3c->nrequests++ == 0) {
+        ngx_reusable_connection(pc, 0);
+    }
+
+    if (h3c->keepalive.timer_set) {
+        ngx_del_timer(&h3c->keepalive);
+    }
+
     rev = c->read;
 
     if (rev->ready) {



More information about the nginx-devel mailing list