[PATCH] Proxy: set u->keepalive also if the whole body has already been read.

Maxim Dounin mdounin at mdounin.ru
Mon Sep 21 19:07:00 UTC 2020


Hello!

On Mon, Sep 21, 2020 at 08:09:29PM +0200, Jan Prachař wrote:

> # HG changeset patch
> # User Jan Prachař <jan.prachar at gmail.com>
> # Date 1600710589 -7200
> #      Mon Sep 21 19:49:49 2020 +0200
> # Node ID f211684e1acee34eabfdd9dd39283bcff8dc7087
> # Parent  052ecc68d35038b1b4adde12efe6249a92055f09
> Proxy: set u->keepalive also if the whole body has already been read.
> 
> HTTP redirection responses often contain a small few hundred bytes
> body. This
> allows to left keep alive connection open, if the body fits into the
> upstream
> buffer.

HTTP redirection responses are expected to be read from the 
connection and returned to the client.  The code to do it will 
properly read the response body, check it, and will set 
u->keepalive as appropriate.

Most likely, you are trying to cover a specific case when 
redirections responses are intercepted using 
proxy_intercept_errors and error_page, as recently reported in 
ticket #2033 (https://trac.nginx.org/nginx/ticket/2033).

> diff -r 052ecc68d350 -r f211684e1ace
> src/http/modules/ngx_http_proxy_module.c
> --- a/src/http/modules/ngx_http_proxy_module.c	Wed Sep 16 18:26:25
> 2020 +0300
> +++ b/src/http/modules/ngx_http_proxy_module.c	Mon Sep 21 19:49:49
> 2020 +0200
> @@ -1905,7 +1905,8 @@
>              }
>  
>              /*
> -             * set u->keepalive if response has no body; this allows
> to keep
> +             * set u->keepalive if response has no body or if the
> whole body
> +             * has been already read to u->buffer; this allows to keep
>               * connections alive in case of r->header_only or X-Accel-
> Redirect
>               */
>  
> @@ -1915,7 +1916,7 @@
>                  || u->headers_in.status_n == NGX_HTTP_NOT_MODIFIED
>                  || ctx->head
>                  || (!u->headers_in.chunked
> -                    && u->headers_in.content_length_n == 0))
> +                    && u->headers_in.content_length_n <= u-
> >buffer.last-u->buffer.pos))
>              {
>                  u->keepalive = !u->headers_in.connection_close;
>              }

I can't say I like the idea of connection cacheability to depend 
on timing and buffer size factors.

Further, the "<=" comparison looks wrong: we shouldn't cache 
connections if there are more data than expected.

-- 
Maxim Dounin
http://mdounin.ru/


More information about the nginx-devel mailing list