]> git.kaiwu.me - nginx.git/commitdiff
Proxy: use zero Content-Length while discarding request body.
authorMaxim Dounin <mdounin@mdounin.ru>
Sat, 27 Apr 2024 15:18:13 +0000 (18:18 +0300)
committerRoman Arutyunyan <arutyunyan.roman@gmail.com>
Thu, 22 Oct 2026 13:05:26 +0000 (17:05 +0400)
Previously, r->headers_in.content_length_n was used, which is not 0 till
the request body is fully discarded, and the request might hang.

Adapted for nginx: the same change is applied to the HTTP/2 proxy
module (proxy_http_version 2), which is not present in freenginx and
used r->headers_in.content_length_n in the same way.  With an HTTP/2
upstream, the stale length resulted in the request being rejected
by the upstream, since the stream was closed without the body.

Co-authored-by: Elijah Zupancic <e.zupancic@f5.com>
Signed-off-by: Elijah Zupancic <e.zupancic@f5.com>
Origin: <https://freenginx.org/hg/nginx/rev/51e0dc7137843feda75b497773f598d3836c60a1>

src/http/modules/ngx_http_proxy_module.c
src/http/modules/ngx_http_proxy_v2_module.c

index 99b915c52d2f6c56967b65206e749bb9f13968f6..10b5b75358bd7cdd59ac927ddba395748d6527b4 100644 (file)
@@ -1307,6 +1307,9 @@ ngx_http_proxy_create_request(ngx_http_request_t *r)
         ctx->internal_body_length = -1;
         ctx->internal_chunked = 1;
 
+    } else if (r->discard_body) {
+        ctx->internal_body_length = 0;
+
     } else {
         ctx->internal_body_length = r->headers_in.content_length_n;
     }
index a0ccb5d2669ed93716dcf9f00606ca728fb51d77..727fa9d4b6425883a99337a57439fba628833124 100644 (file)
@@ -496,6 +496,9 @@ ngx_http_proxy_v2_create_request(ngx_http_request_t *r)
     } else if (r->headers_in.chunked && r->reading_body) {
         ctx->ctx.internal_body_length = -1;
 
+    } else if (r->discard_body) {
+        ctx->ctx.internal_body_length = 0;
+
     } else {
         ctx->ctx.internal_body_length = r->headers_in.content_length_n;
     }