aboutsummaryrefslogtreecommitdiff
path: root/src/http/modules/proxy/ngx_http_proxy_upstream.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/http/modules/proxy/ngx_http_proxy_upstream.c')
-rw-r--r--src/http/modules/proxy/ngx_http_proxy_upstream.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/http/modules/proxy/ngx_http_proxy_upstream.c b/src/http/modules/proxy/ngx_http_proxy_upstream.c
index 23d40c493..47d2b17df 100644
--- a/src/http/modules/proxy/ngx_http_proxy_upstream.c
+++ b/src/http/modules/proxy/ngx_http_proxy_upstream.c
@@ -528,6 +528,7 @@ static void ngx_http_proxy_reinit_upstream(ngx_http_proxy_ctx_t *p)
{
ngx_chain_t *cl;
ngx_output_chain_ctx_t *output;
+ ngx_http_proxy_state_e state;
/* reinit the request chain */
@@ -560,11 +561,17 @@ static void ngx_http_proxy_reinit_upstream(ngx_http_proxy_ctx_t *p)
/* add one more state */
+ state = p->state->cache_state;
+
if (!(p->state = ngx_push_array(&p->states))) {
ngx_http_proxy_finalize_request(p, NGX_HTTP_INTERNAL_SERVER_ERROR);
return;
}
+ ngx_memzero(p->state, sizeof(ngx_http_proxy_state_t));
+
+ p->state->cache_state = state;
+
p->status = 0;
p->status_count = 0;
}
@@ -719,9 +726,9 @@ static void ngx_http_proxy_connect(ngx_http_proxy_ctx_t *p)
writer->out = NULL;
writer->last = &writer->out;
writer->connection = c;
- writer->limit = OFF_T_MAX_VALUE;
+ writer->limit = 0;
- if (p->upstream->peer.tries > 1 && p->request_sent) {
+ if (p->request_sent) {
ngx_http_proxy_reinit_upstream(p);
}
@@ -803,13 +810,13 @@ static void ngx_http_proxy_send_request(ngx_http_proxy_ctx_t *p)
p->request_sent ? NULL:
p->request->request_body->bufs);
+ p->request_sent = 1;
+
if (rc == NGX_ERROR) {
ngx_http_proxy_next_upstream(p, NGX_HTTP_PROXY_FT_ERROR);
return;
}
- p->request_sent = 1;
-
if (c->write->timer_set) {
ngx_del_timer(c->write);
}