<div><div><span style="font-family:monospace"><span style="background-color:#ffffff;color:#000000"># HG changeset patch </span><br /><span style="background-color:#ffffff;color:#000000"># User Gennady Bekasov <becasov@yandex.ru> </span><br /><span style="background-color:#ffffff;color:#000000"># Date 1755456060 -10800 </span><br /><span style="background-color:#ffffff;color:#000000">#      Sun Aug 17 21:41:00 2025 +0300 </span><br /><span style="background-color:#ffffff;color:#000000"># Node ID 2a14d182adce88e0ea7bb7ca3bd01e93ee8eee90 </span><br /><span style="background-color:#ffffff;color:#000000"># Parent  bdfd605f661eea3d272caf1bd5d85e7c539394ca </span><br /><span style="background-color:#ffffff;color:#000000">Added the "proxy_upstream_allow_duplicate_chunked" configuration directive. </span><br /><br /><span style="background-color:#ffffff;color:#000000">diff -r bdfd605f661e -r 2a14d182adce src/http/modules/ngx_http_proxy_module.c </span><br /><span style="background-color:#ffffff;color:#000000">--- a/src/http/modules/ngx_http_proxy_module.c  Wed Jul 23 21:53:19 2025 +0300 </span><br /><span style="background-color:#ffffff;color:#000000">+++ b/src/http/modules/ngx_http_proxy_module.c  Sun Aug 17 21:41:00 2025 +0300 </span><br /><span style="background-color:#ffffff;color:#000000">@@ -367,6 +367,13 @@ </span><br /><span style="background-color:#ffffff;color:#000000">      offsetof(ngx_http_proxy_loc_conf_t, upstream.ignore_client_abort), </span><br /><span style="background-color:#ffffff;color:#000000">      NULL }, </span><br /><span style="background-color:#ffffff;color:#000000"> </span><br /><span style="background-color:#ffffff;color:#000000">+    { ngx_string("proxy_upstream_allow_duplicate_chunked"), </span><br /><span style="background-color:#ffffff;color:#000000">+      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, </span><br /><span style="background-color:#ffffff;color:#000000">+      ngx_conf_set_flag_slot, </span><br /><span style="background-color:#ffffff;color:#000000">+      NGX_HTTP_LOC_CONF_OFFSET, </span><br /><span style="background-color:#ffffff;color:#000000">+      offsetof(ngx_http_proxy_loc_conf_t, upstream.upstream_allow_duplicate_chunked), </span><br /><span style="background-color:#ffffff;color:#000000">+      NULL }, </span><br /><span style="background-color:#ffffff;color:#000000">+ </span><br /><span style="background-color:#ffffff;color:#000000">    { ngx_string("proxy_bind"), </span><br /><span style="background-color:#ffffff;color:#000000">      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12, </span><br /><span style="background-color:#ffffff;color:#000000">      ngx_http_upstream_bind_set_slot, </span><br /><span style="background-color:#ffffff;color:#000000">@@ -3364,6 +3371,7 @@ </span><br /><span style="background-color:#ffffff;color:#000000">    conf->upstream.request_buffering = NGX_CONF_UNSET; </span><br /><span style="background-color:#ffffff;color:#000000">    conf->upstream.ignore_client_abort = NGX_CONF_UNSET; </span><br /><span style="background-color:#ffffff;color:#000000">    conf->upstream.force_ranges = NGX_CONF_UNSET; </span><br /><span style="background-color:#ffffff;color:#000000">+    conf->upstream.upstream_allow_duplicate_chunked = NGX_CONF_UNSET; </span><br /><span style="background-color:#ffffff;color:#000000"> </span><br /><span style="background-color:#ffffff;color:#000000">    conf->upstream.local = NGX_CONF_UNSET_PTR; </span><br /><span style="background-color:#ffffff;color:#000000">    conf->upstream.socket_keepalive = NGX_CONF_UNSET; </span><br /><span style="background-color:#ffffff;color:#000000">@@ -3494,6 +3502,9 @@ </span><br /><span style="background-color:#ffffff;color:#000000">    ngx_conf_merge_value(conf->upstream.force_ranges, </span><br /><span style="background-color:#ffffff;color:#000000">                              prev->upstream.force_ranges, 0); </span><br /><span style="background-color:#ffffff;color:#000000"> </span><br /><span style="background-color:#ffffff;color:#000000">+    ngx_conf_merge_value(conf->upstream.upstream_allow_duplicate_chunked, </span><br /><span style="background-color:#ffffff;color:#000000">+                              prev->upstream.upstream_allow_duplicate_chunked, 0); </span><br /><span style="background-color:#ffffff;color:#000000">+ </span><br /><span style="background-color:#ffffff;color:#000000">    ngx_conf_merge_ptr_value(conf->upstream.local, </span><br /><span style="background-color:#ffffff;color:#000000">                              prev->upstream.local, NULL); </span><br /><span style="background-color:#ffffff;color:#000000"> </span><br /><span style="background-color:#ffffff;color:#000000">diff -r bdfd605f661e -r 2a14d182adce src/http/ngx_http_upstream.c </span><br /><span style="background-color:#ffffff;color:#000000">--- a/src/http/ngx_http_upstream.c      Wed Jul 23 21:53:19 2025 +0300 </span><br /><span style="background-color:#ffffff;color:#000000">+++ b/src/http/ngx_http_upstream.c      Sun Aug 17 21:41:00 2025 +0300 </span><br /><span style="background-color:#ffffff;color:#000000">@@ -5300,7 +5300,11 @@ </span><br /><span style="background-color:#ffffff;color:#000000">                      &h->key, &h->value, </span><br /><span style="background-color:#ffffff;color:#000000">                      &u->headers_in.transfer_encoding->key, </span><br /><span style="background-color:#ffffff;color:#000000">                      &u->headers_in.transfer_encoding->value); </span><br /><span style="background-color:#ffffff;color:#000000">-        return NGX_HTTP_UPSTREAM_INVALID_HEADER; </span><br /><span style="background-color:#ffffff;color:#000000">+        if (!u->conf->upstream_allow_duplicate_chunked) {<!-- --> </span><br /><span style="background-color:#ffffff;color:#000000">+            return NGX_HTTP_UPSTREAM_INVALID_HEADER; </span><br /><span style="background-color:#ffffff;color:#000000">+        } </span><br /><span style="background-color:#ffffff;color:#000000">+        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, </span><br /><span style="background-color:#ffffff;color:#000000">+                      "insecure data exchange due to pass duplicate \"Transfer-Encoding\" header as enabled by upstream_allow_duplicate_chunked parameter"); </span><br /><span style="background-color:#ffffff;color:#000000">    } </span><br /><span style="background-color:#ffffff;color:#000000"> </span><br /><span style="background-color:#ffffff;color:#000000">    if (u->headers_in.content_length) {<!-- --> </span><br /><span style="background-color:#ffffff;color:#000000">diff -r bdfd605f661e -r 2a14d182adce src/http/ngx_http_upstream.h </span><br /><span style="background-color:#ffffff;color:#000000">--- a/src/http/ngx_http_upstream.h      Wed Jul 23 21:53:19 2025 +0300 </span><br /><span style="background-color:#ffffff;color:#000000">+++ b/src/http/ngx_http_upstream.h      Sun Aug 17 21:41:00 2025 +0300 </span><br /><span style="background-color:#ffffff;color:#000000">@@ -177,6 +177,7 @@ </span><br /><span style="background-color:#ffffff;color:#000000">    ngx_flag_t                       request_buffering; </span><br /><span style="background-color:#ffffff;color:#000000">    ngx_flag_t                       pass_request_headers; </span><br /><span style="background-color:#ffffff;color:#000000">    ngx_flag_t                       pass_request_body; </span><br /><span style="background-color:#ffffff;color:#000000">+    ngx_flag_t                       upstream_allow_duplicate_chunked; </span><br /><span style="background-color:#ffffff;color:#000000"> </span><br /><span style="background-color:#ffffff;color:#000000">    ngx_flag_t                       ignore_client_abort; </span><br /><span style="background-color:#ffffff;color:#000000">    ngx_flag_t                       intercept_errors;</span></span><br /> </div></div>