mirror of
https://github.com/nginx/nginx.git
synced 2024-12-03 04:39:00 +08:00
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.
This commit is contained in:
parent
7ef115a7e8
commit
7be60194c1
@ -1616,6 +1616,7 @@ ngx_http_upstream_connect(ngx_http_request_t *r, ngx_http_upstream_t *u)
|
|||||||
|
|
||||||
u->request_sent = 0;
|
u->request_sent = 0;
|
||||||
u->request_body_sent = 0;
|
u->request_body_sent = 0;
|
||||||
|
u->request_body_blocked = 0;
|
||||||
|
|
||||||
if (rc == NGX_AGAIN) {
|
if (rc == NGX_AGAIN) {
|
||||||
ngx_add_timer(c->write, u->conf->connect_timeout);
|
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 (rc == NGX_AGAIN) {
|
||||||
if (!c->write->ready) {
|
if (!c->write->ready || u->request_body_blocked) {
|
||||||
ngx_add_timer(c->write, u->conf->send_timeout);
|
ngx_add_timer(c->write, u->conf->send_timeout);
|
||||||
|
|
||||||
} else if (c->write->timer_set) {
|
} else if (c->write->timer_set) {
|
||||||
@ -2071,7 +2072,16 @@ ngx_http_upstream_send_request_body(ngx_http_request_t *r,
|
|||||||
out = NULL;
|
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) {
|
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);
|
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) {
|
if (rc == NGX_OK && !r->reading_body) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -391,6 +391,7 @@ struct ngx_http_upstream_s {
|
|||||||
|
|
||||||
unsigned request_sent:1;
|
unsigned request_sent:1;
|
||||||
unsigned request_body_sent:1;
|
unsigned request_body_sent:1;
|
||||||
|
unsigned request_body_blocked:1;
|
||||||
unsigned header_sent:1;
|
unsigned header_sent:1;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user