Welcome! Log In Create A New Profile

Advanced

[nginx] Proxy: drop extra data sent by upstream.

Maxim Dounin
July 06, 2020 02:02PM
details: https://hg.nginx.org/nginx/rev/9afa45068b8f
branches:
changeset: 7675:9afa45068b8f
user: Maxim Dounin <mdounin@mdounin.ru>
date: Mon Jul 06 18:36:19 2020 +0300
description:
Proxy: drop extra data sent by upstream.

Previous behaviour was to pass everything to the client, but this
seems to be suboptimal and causes issues (ticket #1695). Fix is to
drop extra data instead, as it naturally happens in most clients.

diffstat:

src/http/modules/ngx_http_proxy_module.c | 52 ++++++++++++++++++++++++++-----
1 files changed, 43 insertions(+), 9 deletions(-)

diffs (81 lines):

diff -r 7731c710796f -r 9afa45068b8f src/http/modules/ngx_http_proxy_module.c
--- a/src/http/modules/ngx_http_proxy_module.c Mon Jul 06 18:36:17 2020 +0300
+++ b/src/http/modules/ngx_http_proxy_module.c Mon Jul 06 18:36:19 2020 +0300
@@ -2015,6 +2015,25 @@ ngx_http_proxy_copy_filter(ngx_event_pip
return NGX_OK;
}

+ 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 more data than specified in "
+ "\"Content-Length\" header");
+
+ r = p->input_ctx;
+ r->upstream->keepalive = 0;
+ p->upstream_done = 1;
+
+ return NGX_OK;
+ }
+
cl = ngx_chain_get_free_buf(p->pool, &p->free);
if (cl == NULL) {
return NGX_ERROR;
@@ -2042,20 +2061,23 @@ ngx_http_proxy_copy_filter(ngx_event_pip
return NGX_OK;
}

+ if (b->last - b->pos > p->length) {
+
+ ngx_log_error(NGX_LOG_WARN, p->log, 0,
+ "upstream sent more data than specified in "
+ "\"Content-Length\" header");
+
+ b->last = b->pos + p->length;
+ p->upstream_done = 1;
+
+ return NGX_OK;
+ }
+
p->length -= b->last - b->pos;

if (p->length == 0) {
r = p->input_ctx;
- p->upstream_done = 1;
r->upstream->keepalive = !r->upstream->headers_in.connection_close;
-
- } else if (p->length < 0) {
- r = p->input_ctx;
- p->upstream_done = 1;
-
- ngx_log_error(NGX_LOG_WARN, r->connection->log, 0,
- "upstream sent more data than specified in "
- "\"Content-Length\" header");
}

return NGX_OK;
@@ -2227,6 +2249,18 @@ ngx_http_proxy_non_buffered_copy_filter(
return NGX_OK;
}

+ if (bytes > u->length) {
+
+ ngx_log_error(NGX_LOG_WARN, r->connection->log, 0,
+ "upstream sent more data than specified in "
+ "\"Content-Length\" header");
+
+ cl->buf->last = cl->buf->pos + u->length;
+ u->length = 0;
+
+ return NGX_OK;
+ }
+
u->length -= bytes;

if (u->length == 0) {
_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel
Subject Author Views Posted

[nginx] Proxy: drop extra data sent by upstream.

Maxim Dounin 199 July 06, 2020 02:02PM



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

Online Users

Guests: 184
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