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/ngx_http_proxy_upstream.c | |
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/ngx_http_proxy_upstream.c')
-rw-r--r-- | src/http/modules/proxy/ngx_http_proxy_upstream.c | 38 |
1 files changed, 24 insertions, 14 deletions
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; |