mirror of
https://github.com/nginx/nginx.git
synced 2024-12-02 20:09:01 +08:00
Upstream: p->downstream_error instead of closing connection.
Previously, nginx closed client connection in cases when a response body from upstream was needed to be cached or stored but shouldn't be sent to the client. While this is normal for HTTP, it is unacceptable for SPDY. Fix is to use instead the p->downstream_error flag to prevent nginx from sending anything downstream. To make this work, the event pipe code was modified to properly cache empty responses with the flag set.
This commit is contained in:
parent
3c2b5e88ab
commit
4a75e1a63c
@ -439,7 +439,11 @@ ngx_event_pipe_read_upstream(ngx_event_pipe_t *p)
|
||||
}
|
||||
}
|
||||
|
||||
if (p->cacheable && p->in) {
|
||||
if (p->cacheable && (p->in || p->buf_to_file)) {
|
||||
|
||||
ngx_log_debug0(NGX_LOG_DEBUG_EVENT, p->log, 0,
|
||||
"pipe write chain");
|
||||
|
||||
if (ngx_event_pipe_write_chain_to_temp_file(p) == NGX_ABORT) {
|
||||
return NGX_ABORT;
|
||||
}
|
||||
@ -515,15 +519,6 @@ ngx_event_pipe_write_to_downstream(ngx_event_pipe_t *p)
|
||||
p->in = NULL;
|
||||
}
|
||||
|
||||
if (p->cacheable && p->buf_to_file) {
|
||||
ngx_log_debug0(NGX_LOG_DEBUG_EVENT, p->log, 0,
|
||||
"pipe write chain");
|
||||
|
||||
if (ngx_event_pipe_write_chain_to_temp_file(p) == NGX_ABORT) {
|
||||
return NGX_ABORT;
|
||||
}
|
||||
}
|
||||
|
||||
ngx_log_debug0(NGX_LOG_DEBUG_EVENT, p->log, 0,
|
||||
"pipe write downstream done");
|
||||
|
||||
|
@ -2357,21 +2357,17 @@ ngx_http_upstream_send_response(ngx_http_request_t *r, ngx_http_upstream_t *u)
|
||||
|
||||
if (r->header_only) {
|
||||
|
||||
if (u->cacheable || u->store) {
|
||||
|
||||
if (ngx_shutdown_socket(c->fd, NGX_WRITE_SHUTDOWN) == -1) {
|
||||
ngx_connection_error(c, ngx_socket_errno,
|
||||
ngx_shutdown_socket_n " failed");
|
||||
}
|
||||
|
||||
r->read_event_handler = ngx_http_request_empty_handler;
|
||||
r->write_event_handler = ngx_http_request_empty_handler;
|
||||
c->error = 1;
|
||||
|
||||
} else {
|
||||
if (!u->buffering) {
|
||||
ngx_http_upstream_finalize_request(r, u, rc);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!u->cacheable && !u->store) {
|
||||
ngx_http_upstream_finalize_request(r, u, rc);
|
||||
return;
|
||||
}
|
||||
|
||||
u->pipe->downstream_error = 1;
|
||||
}
|
||||
|
||||
if (r->request_body && r->request_body->temp_file) {
|
||||
|
Loading…
Reference in New Issue
Block a user