[PATCH] Proxy: set u->keepalive also if the whole body has already been read.
Jan Prachař
jan.prachar at gmail.com
Mon Sep 21 19:25:36 UTC 2020
On Po, 2020-09-21 at 22:07 +0300, Maxim Dounin wrote:
> 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).
Hello,
Yes. This is one of the use-case. I am also trying to cover X-Accel-
Redirect header in a response from upstream.
> > 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.
Thank you, that's a good point.
Best, Jan Prachař
More information about the nginx-devel
mailing list