Mercurial > hg > nginx-vendor-1-0
diff src/http/ngx_http_upstream.c @ 530:4c5d2c627a6c NGINX_0_8_17
nginx 0.8.17
*) Security: now "/../" are disabled in "Destination" request header
line.
*) Change: now $host variable value is always low case.
*) Feature: the $ssl_session_id variable.
*) Bugfix: socket leak; the bug had appeared in 0.8.11.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Mon, 28 Sep 2009 00:00:00 +0400 |
parents | 0161f3197817 |
children | 0dc162a5f3e8 |
line wrap: on
line diff
--- a/src/http/ngx_http_upstream.c +++ b/src/http/ngx_http_upstream.c @@ -532,7 +532,8 @@ ngx_http_upstream_init_request(ngx_http_ if (ngx_http_upstream_create_round_robin_peer(r, u->resolved) != NGX_OK) { - ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); + ngx_http_upstream_finalize_request(r, u, + NGX_HTTP_INTERNAL_SERVER_ERROR); return; } @@ -564,7 +565,8 @@ ngx_http_upstream_init_request(ngx_http_ ctx = ngx_resolve_start(clcf->resolver, &temp); if (ctx == NULL) { - ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); + ngx_http_upstream_finalize_request(r, u, + NGX_HTTP_INTERNAL_SERVER_ERROR); return; } @@ -572,7 +574,7 @@ ngx_http_upstream_init_request(ngx_http_ ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "no resolver defined to resolve %V", host); - ngx_http_finalize_request(r, NGX_HTTP_BAD_GATEWAY); + ngx_http_upstream_finalize_request(r, u, NGX_HTTP_BAD_GATEWAY); return; } @@ -586,7 +588,8 @@ ngx_http_upstream_init_request(ngx_http_ if (ngx_resolve_name(ctx) != NGX_OK) { u->resolved->ctx = NULL; - ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); + ngx_http_upstream_finalize_request(r, u, + NGX_HTTP_INTERNAL_SERVER_ERROR); return; } @@ -596,7 +599,8 @@ ngx_http_upstream_init_request(ngx_http_ found: if (uscf->peer.init(r, uscf) != NGX_OK) { - ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); + ngx_http_upstream_finalize_request(r, u, + NGX_HTTP_INTERNAL_SERVER_ERROR); return; } @@ -789,11 +793,13 @@ static void ngx_http_upstream_resolve_handler(ngx_resolver_ctx_t *ctx) { ngx_http_request_t *r; + ngx_http_upstream_t *u; ngx_http_upstream_resolved_t *ur; r = ctx->data; - r->upstream->resolved->ctx = NULL; + u = r->upstream; + ur = u->resolved; if (ctx->state) { ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, @@ -801,12 +807,10 @@ ngx_http_upstream_resolve_handler(ngx_re &ctx->name, ctx->state, ngx_resolver_strerror(ctx->state)); - ngx_resolve_name_done(ctx); - ngx_http_finalize_request(r, NGX_HTTP_BAD_GATEWAY); + ngx_http_upstream_finalize_request(r, u, NGX_HTTP_BAD_GATEWAY); return; } - ur = r->upstream->resolved; ur->naddrs = ctx->naddrs; ur->addrs = ctx->addrs; @@ -827,14 +831,15 @@ ngx_http_upstream_resolve_handler(ngx_re #endif if (ngx_http_upstream_create_round_robin_peer(r, ur) != NGX_OK) { - ngx_resolve_name_done(ctx); - ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); + ngx_http_upstream_finalize_request(r, u, + NGX_HTTP_INTERNAL_SERVER_ERROR); return; } ngx_resolve_name_done(ctx); - - ngx_http_upstream_connect(r, r->upstream); + ur->ctx = NULL; + + ngx_http_upstream_connect(r, u); } @@ -921,10 +926,6 @@ ngx_http_upstream_check_broken_connectio return; } - if (u->peer.connection == NULL) { - return; - } - #if (NGX_HAVE_KQUEUE) if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { @@ -956,7 +957,6 @@ ngx_http_upstream_check_broken_connectio if (u->peer.connection == NULL) { ngx_http_upstream_finalize_request(r, u, NGX_HTTP_CLIENT_CLOSED_REQUEST); - return; } return; @@ -1019,7 +1019,6 @@ ngx_http_upstream_check_broken_connectio if (u->peer.connection == NULL) { ngx_http_upstream_finalize_request(r, u, NGX_HTTP_CLIENT_CLOSED_REQUEST); - return; } } @@ -1797,7 +1796,7 @@ ngx_http_upstream_process_headers(ngx_ht uri = &u->headers_in.x_accel_redirect->value; args.len = 0; args.data = NULL; - flags = 0; + flags = NGX_HTTP_LOG_UNSAFE; if (ngx_http_parse_unsafe_uri(r, uri, &args, &flags) != NGX_OK) { ngx_http_finalize_request(r, NGX_HTTP_NOT_FOUND); @@ -2837,6 +2836,7 @@ ngx_http_upstream_cleanup(void *data) if (u->resolved && u->resolved->ctx) { ngx_resolve_name_done(u->resolved->ctx); + u->resolved->ctx = NULL; } ngx_http_upstream_finalize_request(r, u, NGX_DONE); @@ -2856,6 +2856,11 @@ ngx_http_upstream_finalize_request(ngx_h *u->cleanup = NULL; } + if (u->resolved && u->resolved->ctx) { + ngx_resolve_name_done(u->resolved->ctx); + u->resolved->ctx = NULL; + } + if (u->state && u->state->response_sec) { tp = ngx_timeofday(); u->state->response_sec = tp->sec - u->state->response_sec;