aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxim Dounin <mdounin@mdounin.ru>2013-09-27 16:50:26 +0400
committerMaxim Dounin <mdounin@mdounin.ru>2013-09-27 16:50:26 +0400
commitc4b5a1fe5ee0cbfabc74c0fef18e9a946c57f29e (patch)
tree57770f422d92b3029389836283d135fdbf720e09 /src
parent239c4037ceb306552f884a57de5abdea2186e7d7 (diff)
downloadnginx-c4b5a1fe5ee0cbfabc74c0fef18e9a946c57f29e.tar.gz
nginx-c4b5a1fe5ee0cbfabc74c0fef18e9a946c57f29e.zip
Upstream: subrequest_in_memory fix.
With previous code only part of u->buffer might be emptied in case of special responses, resulting in partial responses seen by SSI set in case of simple protocols, or spurious errors like "upstream sent invalid chunked response" in case of complex ones.
Diffstat (limited to 'src')
-rw-r--r--src/http/ngx_http_upstream.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/src/http/ngx_http_upstream.c b/src/http/ngx_http_upstream.c
index 2321f6e97..4a4f8eba2 100644
--- a/src/http/ngx_http_upstream.c
+++ b/src/http/ngx_http_upstream.c
@@ -1711,10 +1711,6 @@ ngx_http_upstream_process_header(ngx_http_request_t *r, ngx_http_upstream_t *u)
if (u->headers_in.status_n >= NGX_HTTP_SPECIAL_RESPONSE) {
- if (r->subrequest_in_memory) {
- u->buffer.last = u->buffer.pos;
- }
-
if (ngx_http_upstream_test_next(r, u) == NGX_OK) {
return;
}
@@ -3464,6 +3460,12 @@ ngx_http_upstream_finalize_request(ngx_http_request_t *r,
#endif
+ if (r->subrequest_in_memory
+ && u->headers_in.status_n >= NGX_HTTP_SPECIAL_RESPONSE)
+ {
+ u->buffer.last = u->buffer.pos;
+ }
+
if (rc == NGX_DECLINED) {
return;
}