]> git.kaiwu.me - nginx.git/commitdiff
HTTP/3: close connection on keepalive_requests * 2.
authorRoman Arutyunyan <arut@nginx.com>
Thu, 29 Jul 2021 13:01:37 +0000 (16:01 +0300)
committerRoman Arutyunyan <arut@nginx.com>
Thu, 29 Jul 2021 13:01:37 +0000 (16:01 +0300)
After receiving GOAWAY, client is not supposed to create new streams.  However,
until client reads this frame, we allow it to create new streams, which are
gracefully rejected.  To prevent client from abusing this algorithm, a new
limit is introduced.  Upon reaching keepalive_requests * 2, server now closes
the entire QUIC connection claiming excessive load.

src/http/v3/ngx_http_v3_request.c

index 5fc6e233b6a0846c0412645bde55838e8c8649ec..f45a7b95e89173d1767401af6ac3f4e53518721f 100644 (file)
@@ -81,6 +81,15 @@ 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;
+
+    if (n >= clcf->keepalive_requests * 2) {
+        ngx_http_v3_finalize_connection(c, NGX_HTTP_V3_ERR_EXCESSIVE_LOAD,
+                                        "too many requests per connection");
+        ngx_http_close_connection(c);
+        return;
+    }
+
     h3c = ngx_http_v3_get_session(c);
 
     if (h3c->goaway) {
@@ -89,8 +98,6 @@ ngx_http_v3_init(ngx_connection_t *c)
         return;
     }
 
-    n = c->quic->id >> 2;
-
     if (n + 1 == clcf->keepalive_requests
         || ngx_current_msec - c->quic->parent->start_time
            > clcf->keepalive_time)