]> git.kaiwu.me - nginx.git/commitdiff
Cancel keepalive and lingering close on EOF better (ticket #2145).
authorSergey Kandaurov <pluknet@nginx.com>
Wed, 24 Mar 2021 11:03:33 +0000 (14:03 +0300)
committerSergey Kandaurov <pluknet@nginx.com>
Wed, 24 Mar 2021 11:03:33 +0000 (14:03 +0300)
Unlike in 75e908236701, which added the logic to ngx_http_finalize_request(),
this change moves it to a more generic routine ngx_http_finalize_connection()
to cover cases when a request is finalized with NGX_DONE.

In particular, this fixes unwanted connection transition into the keepalive
state after receiving EOF while discarding request body.  With edge-triggered
event methods that means the connection will last for extra seconds as set in
the keepalive_timeout directive.

src/http/ngx_http_request.c

index d129f80796f9bd12fcf18b978fecb190e209fdf1..684fabdd61a87ddcf56cd5199662b6f6c31767c1 100644 (file)
@@ -2643,11 +2643,6 @@ ngx_http_finalize_request(ngx_http_request_t *r, ngx_int_t rc)
         ngx_del_timer(c->write);
     }
 
-    if (c->read->eof) {
-        ngx_http_close_request(r, 0);
-        return;
-    }
-
     ngx_http_finalize_connection(r);
 }
 
@@ -2746,6 +2741,11 @@ ngx_http_finalize_connection(ngx_http_request_t *r)
 
     r = r->main;
 
+    if (r->connection->read->eof) {
+        ngx_http_close_request(r, 0);
+        return;
+    }
+
     if (r->reading_body) {
         r->keepalive = 0;
         r->lingering_close = 1;