summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorMaxim Dounin <mdounin@mdounin.ru>2018-03-17 23:04:22 +0300
committerMaxim Dounin <mdounin@mdounin.ru>2018-03-17 23:04:22 +0300
commit7be60194c12d3565c0ad34cc65206f4c22d4af53 (patch)
tree66a93c186e2ac70f7e2e3ffbba8e5b8635a7c5a9
parent7ef115a7e864573478e3f88d6a4ef689a1b73b92 (diff)
downloadnginx-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.c21
-rw-r--r--src/http/ngx_http_upstream.h1
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;
};