]> git.kaiwu.me - nginx.git/commitdiff
Event pipe: process data after recv_chain() errors.
authorMaxim Dounin <mdounin@mdounin.ru>
Thu, 1 Sep 2016 15:29:55 +0000 (18:29 +0300)
committerMaxim Dounin <mdounin@mdounin.ru>
Thu, 1 Sep 2016 15:29:55 +0000 (18:29 +0300)
When c->recv_chain() returns an error, it is possible that we already
have some data previously read, e.g., in preread buffer.  And in some
cases it may be even a complete response.  Changed c->recv_chain() error
handling to process the data, much like it is already done if kevent
reports about an error.

This change, in particular, fixes processing of small responses
when an upstream fails to properly close a connection with lingering and
therefore the connection is reset, but the response is already fully
obtained by nginx (see ticket #1037).

src/event/ngx_event_pipe.c

index 5ce59ae09fd5a0ee6f8d41f0bef1cca0a269378d..9816467922a0cd6b104085a894873d40d36c2383 100644 (file)
@@ -300,7 +300,7 @@ ngx_event_pipe_read_upstream(ngx_event_pipe_t *p)
 
             if (n == NGX_ERROR) {
                 p->upstream_error = 1;
-                return NGX_ERROR;
+                break;
             }
 
             if (n == NGX_AGAIN) {