diff options
author | Patryk Lesiewicz <patryk@google.com> | 2017-12-01 15:59:14 -0800 |
---|---|---|
committer | Patryk Lesiewicz <patryk@google.com> | 2017-12-01 15:59:14 -0800 |
commit | 7b3f187bc6700a85b9cde04c063de59f4690b10c (patch) | |
tree | bee21bc0c3d4f0d6aecab432f8c1e9c2135edd05 /src | |
parent | e13268714fa3f57adbc7c3891db86b025d79eaf4 (diff) | |
download | nginx-7b3f187bc6700a85b9cde04c063de59f4690b10c.tar.gz nginx-7b3f187bc6700a85b9cde04c063de59f4690b10c.zip |
Upstream: flush low-level buffers on write retry.
If the data to write is bigger than what the socket can send, and the
reminder is smaller than NGX_SSL_BUFSIZE, then SSL_write() fails with
SSL_ERROR_WANT_WRITE. The reminder of payload however is successfully
copied to the low-level buffer and all the output chain buffers are
flushed. This means that retry logic doesn't work because
ngx_http_upstream_process_non_buffered_request() checks only if there's
anything in the output chain buffers and ignores the fact that something
may be buffered in low-level parts of the stack.
Signed-off-by: Patryk Lesiewicz <patryk@google.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/http/ngx_http_upstream.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/src/http/ngx_http_upstream.c b/src/http/ngx_http_upstream.c index 75f463ba7..6d0f4ee52 100644 --- a/src/http/ngx_http_upstream.c +++ b/src/http/ngx_http_upstream.c @@ -3533,7 +3533,7 @@ ngx_http_upstream_process_non_buffered_request(ngx_http_request_t *r, if (do_write) { - if (u->out_bufs || u->busy_bufs) { + if (u->out_bufs || u->busy_bufs || downstream->buffered) { rc = ngx_http_output_filter(r, u->out_bufs); if (rc == NGX_ERROR) { |