diff options
| author | Maxim Dounin <mdounin@mdounin.ru> | 2018-03-17 23:04:22 +0300 |
|---|---|---|
| committer | Maxim Dounin <mdounin@mdounin.ru> | 2018-03-17 23:04:22 +0300 |
| commit | 7be60194c12d3565c0ad34cc65206f4c22d4af53 (patch) | |
| tree | 66a93c186e2ac70f7e2e3ffbba8e5b8635a7c5a9 | |
| parent | 7ef115a7e864573478e3f88d6a4ef689a1b73b92 (diff) | |
| download | nginx-7be60194c12d3565c0ad34cc65206f4c22d4af53.tar.gz nginx-7be60194c12d3565c0ad34cc65206f4c22d4af53.tar.bz2 | |
Upstream: u->request_body_blocked flag.
The flag indicates whether last ngx_output_chain() returned NGX_AGAIN
or not. If the flag is set, we arm the u->conf->send_timeout timer.
The flag complements c->write->ready test, and allows to stop sending
the request body in an output filter due to protocol-specific flow
control.
| -rw-r--r-- | src/http/ngx_http_upstream.c | 21 | ||||
| -rw-r--r-- | src/http/ngx_http_upstream.h | 1 |
2 files changed, 20 insertions, 2 deletions
diff --git a/src/http/ngx_http_upstream.c b/src/http/ngx_http_upstream.c index 6d91c7cf5..bc98f81bc 100644 --- a/src/http/ngx_http_upstream.c +++ b/src/http/ngx_http_upstream.c @@ -1616,6 +1616,7 @@ ngx_http_upstream_connect(ngx_http_request_t *r, ngx_http_upstream_t *u) u->request_sent = 0; u->request_body_sent = 0; + u->request_body_blocked = 0; if (rc == NGX_AGAIN) { ngx_add_timer(c->write, u->conf->connect_timeout); @@ -1994,7 +1995,7 @@ ngx_http_upstream_send_request(ngx_http_request_t *r, ngx_http_upstream_t *u, } if (rc == NGX_AGAIN) { - if (!c->write->ready) { + if (!c->write->ready || u->request_body_blocked) { ngx_add_timer(c->write, u->conf->send_timeout); } else if (c->write->timer_set) { @@ -2071,7 +2072,16 @@ ngx_http_upstream_send_request_body(ngx_http_request_t *r, out = NULL; } - return ngx_output_chain(&u->output, out); + rc = ngx_output_chain(&u->output, out); + + if (rc == NGX_AGAIN) { + u->request_body_blocked = 1; + + } else { + u->request_body_blocked = 0; + } + + return rc; } if (!u->request_sent) { @@ -2112,6 +2122,13 @@ ngx_http_upstream_send_request_body(ngx_http_request_t *r, ngx_free_chain(r->pool, ln); } + if (rc == NGX_AGAIN) { + u->request_body_blocked = 1; + + } else { + u->request_body_blocked = 0; + } + if (rc == NGX_OK && !r->reading_body) { break; } diff --git a/src/http/ngx_http_upstream.h b/src/http/ngx_http_upstream.h index a56238d37..80fa8b3cb 100644 --- a/src/http/ngx_http_upstream.h +++ b/src/http/ngx_http_upstream.h @@ -391,6 +391,7 @@ struct ngx_http_upstream_s { unsigned request_sent:1; unsigned request_body_sent:1; + unsigned request_body_blocked:1; unsigned header_sent:1; }; |
