Welcome! Log In Create A New Profile

Advanced

[nginx] Proxy: detection of data after final chunk.

Maxim Dounin
July 06, 2020 02:02PM
details: https://hg.nginx.org/nginx/rev/d225b70d38b6
branches:
changeset: 7676:d225b70d38b6
user: Maxim Dounin <mdounin@mdounin.ru>
date: Mon Jul 06 18:36:20 2020 +0300
description:
Proxy: detection of data after final chunk.

Previously, additional data after final chunk was either ignored
(in the same buffer, or during unbuffered proxying) or sent to the
client (in the next buffer already if it was already read from the
socket). Now additional data are properly detected and ignored
in all cases. Additionally, a warning is now logged and keepalive
is disabled in the connection.

diffstat:

src/http/modules/ngx_http_proxy_module.c | 31 ++++++++++++++++++++++++++++++-
1 files changed, 30 insertions(+), 1 deletions(-)

diffs (57 lines):

diff -r 9afa45068b8f -r d225b70d38b6 src/http/modules/ngx_http_proxy_module.c
--- a/src/http/modules/ngx_http_proxy_module.c Mon Jul 06 18:36:19 2020 +0300
+++ b/src/http/modules/ngx_http_proxy_module.c Mon Jul 06 18:36:20 2020 +0300
@@ -2104,6 +2104,23 @@ ngx_http_proxy_chunked_filter(ngx_event_
return NGX_ERROR;
}

+ if (p->upstream_done) {
+ ngx_log_debug0(NGX_LOG_DEBUG_HTTP, p->log, 0,
+ "http proxy data after close");
+ return NGX_OK;
+ }
+
+ if (p->length == 0) {
+
+ ngx_log_error(NGX_LOG_WARN, p->log, 0,
+ "upstream sent data after final chunk");
+
+ r->upstream->keepalive = 0;
+ p->upstream_done = 1;
+
+ return NGX_OK;
+ }
+
b = NULL;
prev = &buf->shadow;

@@ -2166,9 +2183,15 @@ ngx_http_proxy_chunked_filter(ngx_event_

/* a whole response has been parsed successfully */

- p->upstream_done = 1;
+ p->length = 0;
r->upstream->keepalive = !r->upstream->headers_in.connection_close;

+ if (buf->pos != buf->last) {
+ ngx_log_error(NGX_LOG_WARN, p->log, 0,
+ "upstream sent data after final chunk");
+ r->upstream->keepalive = 0;
+ }
+
break;
}

@@ -2347,6 +2370,12 @@ ngx_http_proxy_non_buffered_chunked_filt
u->keepalive = !u->headers_in.connection_close;
u->length = 0;

+ if (buf->pos != buf->last) {
+ ngx_log_error(NGX_LOG_WARN, r->connection->log, 0,
+ "upstream sent data after final chunk");
+ u->keepalive = 0;
+ }
+
break;
}

_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel
Subject Author Views Posted

[nginx] Proxy: detection of data after final chunk.

Maxim Dounin 172 July 06, 2020 02:02PM



Sorry, you do not have permission to post/reply in this forum.

Online Users

Guests: 243
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready