<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body style="overflow-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;">Hi Maxim,<br id="lineBreakAtBeginningOfMessage"><div><br><blockquote type="cite"><div>On 6 Mar 2024, at 12:28 AM, Maxim Dounin <mdounin@mdounin.ru> wrote:</div><br class="Apple-interchange-newline"><div><div>Hello!<br><br>On Mon, Mar 04, 2024 at 06:46:23PM +0400, Roman Arutyunyan wrote:<br><br><blockquote type="cite"># HG changeset patch<br># User Roman Arutyunyan <arut@nginx.com><br># Date 1709563405 -14400<br>#      Mon Mar 04 18:43:25 2024 +0400<br># Node ID 3b0be477ab7246caba4c5152286b8be520ee0418<br># Parent  44da04c2d4db94ad4eefa84b299e07c5fa4a00b9<br>Fixed 413 custom error page for HTTP/2 and HTTP/3 (ticket #2609).<br><br>Previously an attempt to return a custom 413 error page for these protocols<br>resulted in the standard 413 page (if recursive_error_pages was off) or<br>otherwise internal redirection cycle followed by the 500 error.<br><br>Discarding request body for HTTP/1 starts by setting r->discard_body which<br>indicates the body is currently being discarded.  If and when the entire body<br>is read and discarded, the flag is cleared and r->headers_in.content_length_n<br>is set to zero.  Both r->discard_body and r->headers_in.content_length_n<br>prevent nginx from re-generating 413 error after internal redirect in<br>ngx_http_core_find_config_phase().<br><br>However the above does not work for HTTP/2 and HTTP/3.  Discarding request<br>body for these protocols does not affect the above mentioned fields, which is<br>why there's no protection against re-generating the 413 error.  The fix is to<br>assign zero to r->headers_in.content_length_n much like in HTTP/1 case after<br>the body is entirely read and discarded, except for these protocols no active<br>discard is needed.<br><br>diff --git a/src/http/ngx_http_request_body.c b/src/http/ngx_http_request_body.c<br>--- a/src/http/ngx_http_request_body.c<br>+++ b/src/http/ngx_http_request_body.c<br>@@ -640,12 +640,14 @@ ngx_http_discard_request_body(ngx_http_r<br> #if (NGX_HTTP_V2)<br>     if (r->stream) {<br>         r->stream->skip_data = 1;<br>+        r->headers_in.content_length_n = 0;<br>         return NGX_OK;<br>     }<br> #endif<br><br> #if (NGX_HTTP_V3)<br>     if (r->http_version == NGX_HTTP_VERSION_30) {<br>+        r->headers_in.content_length_n = 0;<br>         return NGX_OK;<br>     }<br> #endif<br></blockquote><br>The patch is wrong, see here:<br><br><a href="https://trac.nginx.org/nginx/ticket/1152#comment:6">https://trac.nginx.org/nginx/ticket/1152#comment:6 </a><br></div></div></blockquote><div><br></div><div>Thanks for your kind comment, I read that before.</div><div><br></div><div>The patch fixes exactly what it fixes.</div><div>Accessing the request body after it was discarded (for example from a 413 custom handler) is a sign of misconfiguration.</div><div>Indeed for a misconfigured nginx there is a problem with a HTTP/1 body currently being discarded as well as other inconsistencies.</div><div>This may or may not be fixed in the future, but anyway it's a separate issue, which does not exist in a properly configured nginx.</div><br><blockquote type="cite"><div><div>The issue is in my TODO list.  Once properly fixed, you'll be able <br>to merge the fix from freenginx.<br><br>Alternatively, consider submitting patches to <br>the nginx-devel@freenginx.org list for proper review.<br></div></div></blockquote><div><br></div><div>We understand your hard feelings about leaving the project. Hope you'll be ok.</div><br><blockquote type="cite"><div><div>-- <br>Maxim Dounin<br>http://mdounin.ru/<br>_______________________________________________<br>nginx-devel mailing list<br>nginx-devel@nginx.org<br>https://mailman.nginx.org/mailman/listinfo/nginx-devel<br></div></div></blockquote></div><br><div>
<div dir="auto" style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;"><div>----</div><div>Roman Arutyunyan</div><div>arut@nginx.com</div><div><br></div></div><br class="Apple-interchange-newline"><br class="Apple-interchange-newline">

</div>
<br></body></html>