summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoman Arutyunyan <arut@nginx.com>2015-09-03 15:09:21 +0300
committerRoman Arutyunyan <arut@nginx.com>2015-09-03 15:09:21 +0300
commit9faac47113dcaec81f0427b16d27752f984fda1a (patch)
tree7f8d2967c3d59dd4384a53bd697492df785916f4
parentdf30660f4daee72e3e44018a2830c83c5c531def (diff)
downloadnginx-9faac47113dcaec81f0427b16d27752f984fda1a.tar.gz
Upstream: fixed cache send error handling.
The value of NGX_ERROR, returned from filter handlers, was treated as a generic upstream error and changed to NGX_HTTP_INTERNAL_SERVER_ERROR before calling ngx_http_finalize_request(). This resulted in "header already sent" alert if header was already sent in filter handlers. The problem appeared in 54e9b83d00f0 (1.7.5).
-rw-r--r--src/http/ngx_http_upstream.c25
1 files changed, 14 insertions, 11 deletions
diff --git a/src/http/ngx_http_upstream.c b/src/http/ngx_http_upstream.c
index 56091fa98..e36cf0f0d 100644
--- a/src/http/ngx_http_upstream.c
+++ b/src/http/ngx_http_upstream.c
@@ -530,15 +530,24 @@ ngx_http_upstream_init_request(ngx_http_request_t *r)
r->write_event_handler = ngx_http_request_empty_handler;
- if (rc == NGX_DONE) {
- return;
- }
-
if (rc == NGX_ERROR) {
ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
return;
}
+ if (rc == NGX_OK) {
+ rc = ngx_http_upstream_cache_send(r, u);
+
+ if (rc == NGX_DONE) {
+ return;
+ }
+
+ if (rc == NGX_HTTP_UPSTREAM_INVALID_HEADER) {
+ rc = NGX_DECLINED;
+ r->cached = 0;
+ }
+ }
+
if (rc != NGX_DECLINED) {
ngx_http_finalize_request(r, rc);
return;
@@ -833,13 +842,7 @@ ngx_http_upstream_cache(ngx_http_request_t *r, ngx_http_upstream_t *u)
case NGX_OK:
- rc = ngx_http_upstream_cache_send(r, u);
-
- if (rc != NGX_HTTP_UPSTREAM_INVALID_HEADER) {
- return rc;
- }
-
- break;
+ return NGX_OK;
case NGX_HTTP_CACHE_STALE: