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);
}
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) {
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) {
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;
}