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).
This commit is contained in:
Roman Arutyunyan 2015-09-03 15:09:21 +03:00
parent 7bb45d91cf
commit 238a4d5ea9
1 changed files with 14 additions and 11 deletions

View File

@ -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: