aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxim Dounin <mdounin@mdounin.ru>2015-12-17 16:39:15 +0300
committerMaxim Dounin <mdounin@mdounin.ru>2015-12-17 16:39:15 +0300
commitfda7d021ca23d43cb7a17ff92cd4ad5c805a156c (patch)
tree92d4395004dc679367fd7235e055f5529d58bcad
parent9973e3694447cc4814f46b02b45dea590bbc68ac (diff)
downloadnginx-fda7d021ca23d43cb7a17ff92cd4ad5c805a156c.tar.gz
nginx-fda7d021ca23d43cb7a17ff92cd4ad5c805a156c.zip
Upstream: don't keep connections on early responses (ticket #669).
-rw-r--r--src/http/modules/ngx_http_upstream_keepalive_module.c4
-rw-r--r--src/http/ngx_http_upstream.c3
-rw-r--r--src/http/ngx_http_upstream.h1
3 files changed, 8 insertions, 0 deletions
diff --git a/src/http/modules/ngx_http_upstream_keepalive_module.c b/src/http/modules/ngx_http_upstream_keepalive_module.c
index 51887b4e8..85bfcdb0e 100644
--- a/src/http/modules/ngx_http_upstream_keepalive_module.c
+++ b/src/http/modules/ngx_http_upstream_keepalive_module.c
@@ -302,6 +302,10 @@ ngx_http_upstream_free_keepalive_peer(ngx_peer_connection_t *pc, void *data,
goto invalid;
}
+ if (!u->request_body_sent) {
+ goto invalid;
+ }
+
if (ngx_terminate || ngx_exiting) {
goto invalid;
}
diff --git a/src/http/ngx_http_upstream.c b/src/http/ngx_http_upstream.c
index 6c6ee8000..99ef3aec7 100644
--- a/src/http/ngx_http_upstream.c
+++ b/src/http/ngx_http_upstream.c
@@ -1441,6 +1441,7 @@ ngx_http_upstream_connect(ngx_http_request_t *r, ngx_http_upstream_t *u)
}
u->request_sent = 0;
+ u->request_body_sent = 0;
if (rc == NGX_AGAIN) {
ngx_add_timer(c->write, u->conf->connect_timeout);
@@ -1825,6 +1826,8 @@ ngx_http_upstream_send_request(ngx_http_request_t *r, ngx_http_upstream_t *u,
/* rc == NGX_OK */
+ u->request_body_sent = 1;
+
if (c->write->timer_set) {
ngx_del_timer(c->write);
}
diff --git a/src/http/ngx_http_upstream.h b/src/http/ngx_http_upstream.h
index 840426592..4246c8a56 100644
--- a/src/http/ngx_http_upstream.h
+++ b/src/http/ngx_http_upstream.h
@@ -370,6 +370,7 @@ struct ngx_http_upstream_s {
unsigned upgrade:1;
unsigned request_sent:1;
+ unsigned request_body_sent:1;
unsigned header_sent:1;
};