diff options
author | Igor Sysoev <igor@sysoev.ru> | 2005-05-12 14:58:06 +0000 |
---|---|---|
committer | Igor Sysoev <igor@sysoev.ru> | 2005-05-12 14:58:06 +0000 |
commit | 899b44eab259f32af5c6e3da342f430c654528ce (patch) | |
tree | 23fb5dfbc9219030f9e102db5a2ce44e98c0a9d0 /src/http/modules/proxy | |
parent | 22157ce9d570452b2d77f0fe7e510e6b0e4d05c2 (diff) | |
download | nginx-release-0.1.29.tar.gz nginx-release-0.1.29.zip |
nginx-0.1.29-RELEASE importrelease-0.1.29
*) Feature: the ngx_http_ssi_module supports "include virtual" command.
*) Feature: the ngx_http_ssi_module supports the condition command like
'if expr="$NAME"' and "else" and "endif" commands. Only one nested
level is supported.
*) Feature: the ngx_http_ssi_module supports the DATE_LOCAL and
DATE_GMT variables and "config timefmt" command.
*) Feature: the "ssi_ignore_recycled_buffers" directive.
*) Bugfix: the "echo" command did not show the default value for the
empty QUERY_STRING variable.
*) Change: the ngx_http_proxy_module was rewritten.
*) Feature: the "proxy_redirect", "proxy_pass_request_headers",
"proxy_pass_request_body", and "proxy_method" directives.
*) Feature: the "proxy_set_header" directive. The "proxy_x_var" was
canceled and must be replaced with the proxy_set_header directive.
*) Change: the "proxy_preserve_host" is canceled and must be replaced
with the "proxy_set_header Host $host" and the "proxy_redirect off"
directives, the "proxy_set_header Host $host:$proxy_port" directive
and the appropriate proxy_redirect directives.
*) Change: the "proxy_set_x_real_ip" is canceled and must be replaced
with the "proxy_set_header X-Real-IP $remote_addr" directive.
*) Change: the "proxy_add_x_forwarded_for" is canceled and must be
replaced with
the "proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for"
directive.
*) Change: the "proxy_set_x_url" is canceled and must be replaced with
the "proxy_set_header X-URL http://$host:$server_port$request_uri"
directive.
*) Feature: the "fastcgi_param" directive.
*) Change: the "fastcgi_root", "fastcgi_set_var" and "fastcgi_params"
directive are canceled and must be replaced with the fastcgi_param
directives.
*) Feature: the "index" directive can use the variables.
*) Feature: the "index" directive can be used at http and server levels.
*) Change: the last index only in the "index" directive can be absolute.
*) Feature: the "rewrite" directive can use the variables.
*) Feature: the "internal" directive.
*) Feature: the CONTENT_LENGTH, CONTENT_TYPE, REMOTE_PORT, SERVER_ADDR,
SERVER_PORT, SERVER_PROTOCOL, DOCUMENT_ROOT, SERVER_NAME,
REQUEST_METHOD, REQUEST_URI, and REMOTE_USER variables.
*) Change: nginx now passes the invalid lines in a client request
headers or a backend response header.
*) Bugfix: if the backend did not transfer response for a long time and
the "send_timeout" was less than "proxy_read_timeout", then nginx
returned the 408 response.
*) Bugfix: the segmentation fault was occurred if the backend sent an
invalid line in response header; the bug had appeared in 0.1.26.
*) Bugfix: the segmentation fault may occurred in FastCGI fault
tolerance configuration.
*) Bugfix: the "expires" directive did not remove the previous
"Expires" and "Cache-Control" headers.
*) Bugfix: nginx did not take into account trailing dot in "Host"
header line.
*) Bugfix: the ngx_http_auth_module did not work under Linux.
*) Bugfix: the rewrite directive worked incorrectly, if the arguments
were in a request.
*) Bugfix: nginx could not be built on MacOS X.
Diffstat (limited to 'src/http/modules/proxy')
-rw-r--r-- | src/http/modules/proxy/ngx_http_proxy_handler.c | 31 | ||||
-rw-r--r-- | src/http/modules/proxy/ngx_http_proxy_handler.h | 7 | ||||
-rw-r--r-- | src/http/modules/proxy/ngx_http_proxy_upstream.c | 38 |
3 files changed, 46 insertions, 30 deletions
diff --git a/src/http/modules/proxy/ngx_http_proxy_handler.c b/src/http/modules/proxy/ngx_http_proxy_handler.c index 12d417176..bc91df9a1 100644 --- a/src/http/modules/proxy/ngx_http_proxy_handler.c +++ b/src/http/modules/proxy/ngx_http_proxy_handler.c @@ -311,7 +311,7 @@ static ngx_http_log_op_name_t ngx_http_proxy_log_fmt_ops[] = { -ngx_http_header_t ngx_http_proxy_headers_in[] = { +ngx_http_header0_t ngx_http_proxy_headers_in[] = { { ngx_string("Date"), offsetof(ngx_http_proxy_headers_in_t, date) }, { ngx_string("Server"), offsetof(ngx_http_proxy_headers_in_t, server) }, @@ -490,13 +490,25 @@ static ngx_int_t ngx_http_proxy_cache_get(ngx_http_proxy_ctx_t *p) #endif -void ngx_http_proxy_check_broken_connection(ngx_event_t *ev) +void ngx_http_proxy_rd_check_broken_connection(ngx_http_request_t *r) +{ + ngx_http_proxy_check_broken_connection(r, r->connection->read); +} + + +void ngx_http_proxy_wr_check_broken_connection(ngx_http_request_t *r) +{ + ngx_http_proxy_check_broken_connection(r, r->connection->read); +} + + +void ngx_http_proxy_check_broken_connection(ngx_http_request_t *r, + ngx_event_t *ev) { int n; char buf[1]; ngx_err_t err; ngx_connection_t *c; - ngx_http_request_t *r; ngx_http_proxy_ctx_t *p; ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ev->log, 0, @@ -510,8 +522,7 @@ void ngx_http_proxy_check_broken_connection(ngx_event_t *ev) return; } - c = ev->data; - r = c->data; + c = r->connection; p = ngx_http_get_module_ctx(r, ngx_http_proxy_module); ev->eof = 1; @@ -542,8 +553,7 @@ void ngx_http_proxy_check_broken_connection(ngx_event_t *ev) #endif - c = ev->data; - r = c->data; + c = r->connection; p = ngx_http_get_module_ctx(r, ngx_http_proxy_module); n = recv(c->fd, buf, 1, MSG_PEEK); @@ -712,13 +722,6 @@ void ngx_http_proxy_finalize_request(ngx_http_proxy_ctx_t *p, int rc) p->cache->ctx.file.fd); } - if (p->upstream && p->upstream->event_pipe) { - r->file.fd = p->upstream->event_pipe->temp_file->file.fd; - - } else if (p->cache) { - r->file.fd = p->cache->ctx.file.fd; - } - if (rc == 0 && r->main == NULL) { rc = ngx_http_send_last(r); } diff --git a/src/http/modules/proxy/ngx_http_proxy_handler.h b/src/http/modules/proxy/ngx_http_proxy_handler.h index 2c9210f9c..11c24b1ea 100644 --- a/src/http/modules/proxy/ngx_http_proxy_handler.h +++ b/src/http/modules/proxy/ngx_http_proxy_handler.h @@ -249,7 +249,10 @@ void ngx_http_proxy_cache_busy_lock(ngx_http_proxy_ctx_t *p); #endif -void ngx_http_proxy_check_broken_connection(ngx_event_t *ev); +void ngx_http_proxy_rd_check_broken_connection(ngx_http_request_t *r); +void ngx_http_proxy_wr_check_broken_connection(ngx_http_request_t *r); +void ngx_http_proxy_check_broken_connection(ngx_http_request_t *r, + ngx_event_t *ev); void ngx_http_proxy_busy_lock_handler(ngx_event_t *rev); void ngx_http_proxy_upstream_busy_lock(ngx_http_proxy_ctx_t *p); @@ -265,7 +268,7 @@ int ngx_http_proxy_copy_header(ngx_http_proxy_ctx_t *p, extern ngx_module_t ngx_http_proxy_module; -extern ngx_http_header_t ngx_http_proxy_headers_in[]; +extern ngx_http_header0_t ngx_http_proxy_headers_in[]; diff --git a/src/http/modules/proxy/ngx_http_proxy_upstream.c b/src/http/modules/proxy/ngx_http_proxy_upstream.c index 107aba3df..0f17b953f 100644 --- a/src/http/modules/proxy/ngx_http_proxy_upstream.c +++ b/src/http/modules/proxy/ngx_http_proxy_upstream.c @@ -24,6 +24,7 @@ static void ngx_http_proxy_process_upstream_status_line(ngx_event_t *rev); static void ngx_http_proxy_process_upstream_headers(ngx_event_t *rev); static ssize_t ngx_http_proxy_read_upstream_header(ngx_http_proxy_ctx_t *); static void ngx_http_proxy_send_response(ngx_http_proxy_ctx_t *p); +static void ngx_http_proxy_process_downstream(ngx_http_request_t *r); static void ngx_http_proxy_process_body(ngx_event_t *ev); static void ngx_http_proxy_next_upstream(ngx_http_proxy_ctx_t *p, ngx_uint_t ft_type); @@ -112,7 +113,7 @@ static ngx_chain_t *ngx_http_proxy_create_request(ngx_http_proxy_ctx_t *p) len = http_methods[p->upstream->method - 1].len + uc->uri.len; } else { - len = r->method_name.len + uc->uri.len; + len = r->method_name.len + 1 + uc->uri.len; } if (p->lcf->pass_unparsed_uri && r->valid_unparsed_uri) { @@ -261,7 +262,8 @@ static ngx_chain_t *ngx_http_proxy_create_request(ngx_http_proxy_ctx_t *p) http_methods[p->upstream->method - 1].data, http_methods[p->upstream->method - 1].len); } else { - b->last = ngx_cpymem(b->last, r->method_name.data, r->method_name.len); + b->last = ngx_cpymem(b->last, r->method_name.data, + r->method_name.len + 1); } b->last = ngx_cpymem(b->last, uc->uri.data, uc->uri.len); @@ -502,12 +504,11 @@ static void ngx_http_proxy_init_upstream(ngx_http_request_t *r) ngx_del_timer(r->connection->read); } - r->connection->read->event_handler = ngx_http_proxy_check_broken_connection; + r->read_event_handler = ngx_http_proxy_rd_check_broken_connection; if (ngx_event_flags & NGX_USE_CLEAR_EVENT) { - r->connection->write->event_handler = - ngx_http_proxy_check_broken_connection; + r->write_event_handler = ngx_http_proxy_wr_check_broken_connection; if (!r->connection->write->active) { if (ngx_add_event(r->connection->write, NGX_WRITE_EVENT, @@ -770,8 +771,8 @@ static void ngx_http_proxy_connect(ngx_http_proxy_ctx_t *p) c = p->upstream->peer.connection; c->data = p; - c->write->event_handler = ngx_http_proxy_send_request_handler; - c->read->event_handler = ngx_http_proxy_process_upstream_status_line; + c->write->handler = ngx_http_proxy_send_request_handler; + c->read->handler = ngx_http_proxy_process_upstream_status_line; c->sendfile = r->connection->sendfile; @@ -925,9 +926,9 @@ static void ngx_http_proxy_send_request(ngx_http_proxy_ctx_t *p) } #endif - c->write->event_handler = ngx_http_proxy_dummy_handler; + c->write->handler = ngx_http_proxy_dummy_handler; - if (ngx_handle_level_write_event(c->write) == NGX_ERROR) { + if (ngx_handle_write_event(c->write, 0) == NGX_ERROR) { ngx_http_proxy_finalize_request(p, NGX_HTTP_INTERNAL_SERVER_ERROR); return; } @@ -1124,7 +1125,7 @@ static void ngx_http_proxy_process_upstream_status_line(ngx_event_t *rev) } - c->read->event_handler = ngx_http_proxy_process_upstream_headers; + c->read->handler = ngx_http_proxy_process_upstream_headers; ngx_http_proxy_process_upstream_headers(rev); } @@ -1174,7 +1175,7 @@ static void ngx_http_proxy_process_upstream_headers(ngx_event_t *rev) rc = ngx_http_parse_header_line(p->request, p->header_in); - if (rc == NGX_OK) { + if (rc == NGX_OK && !r->invalid_header) { /* a header line has been parsed successfully */ @@ -1241,6 +1242,10 @@ static void ngx_http_proxy_process_upstream_headers(ngx_event_t *rev) } else if (rc != NGX_AGAIN) { + if (r->invalid_header) { + rc = NGX_HTTP_PARSE_INVALID_HEADER; + } + /* there was error while a header line parsing */ ngx_log_error(NGX_LOG_ERR, rev->log, 0, @@ -1465,9 +1470,8 @@ static void ngx_http_proxy_send_response(ngx_http_proxy_ctx_t *p) ep->send_timeout = clcf->send_timeout; ep->send_lowat = clcf->send_lowat; - p->upstream->peer.connection->read->event_handler = - ngx_http_proxy_process_body; - r->connection->write->event_handler = ngx_http_proxy_process_body; + p->upstream->peer.connection->read->handler = ngx_http_proxy_process_body; + r->write_event_handler = ngx_http_proxy_process_downstream; ngx_http_proxy_process_body(p->upstream->peer.connection->read); @@ -1475,6 +1479,12 @@ static void ngx_http_proxy_send_response(ngx_http_proxy_ctx_t *p) } +static void ngx_http_proxy_process_downstream(ngx_http_request_t *r) +{ + ngx_http_proxy_process_body(r->connection->write); +} + + static void ngx_http_proxy_process_body(ngx_event_t *ev) { ngx_connection_t *c; |