Welcome! Log In Create A New Profile

Advanced

[nginx] Upstream: p->downstream_error instead of closing connect...

Maxim Dounin
July 04, 2014 01:12PM
details: http://hg.nginx.org/nginx/rev/35990c69b3ac
branches:
changeset: 5746:35990c69b3ac
user: Maxim Dounin <mdounin@mdounin.ru>
date: Fri Jul 04 20:47:16 2014 +0400
description:
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.

diffstat:

src/event/ngx_event_pipe.c | 15 +++++----------
src/http/ngx_http_upstream.c | 20 ++++++++------------
2 files changed, 13 insertions(+), 22 deletions(-)

diffs (65 lines):

diff --git a/src/event/ngx_event_pipe.c b/src/event/ngx_event_pipe.c
--- a/src/event/ngx_event_pipe.c
+++ b/src/event/ngx_event_pipe.c
@@ -439,7 +439,11 @@ ngx_event_pipe_read_upstream(ngx_event_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_e
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");

diff --git a/src/http/ngx_http_upstream.c b/src/http/ngx_http_upstream.c
--- a/src/http/ngx_http_upstream.c
+++ b/src/http/ngx_http_upstream.c
@@ -2357,21 +2357,17 @@ ngx_http_upstream_send_response(ngx_http

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) {

_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel
Subject Author Views Posted

[nginx] Upstream: p->downstream_error instead of closing connect...

Maxim Dounin 662 July 04, 2014 01:12PM



Sorry, you do not have permission to post/reply in this forum.

Online Users

Guests: 304
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready