aboutsummaryrefslogtreecommitdiff
path: root/src/http/modules/proxy
diff options
context:
space:
mode:
Diffstat (limited to 'src/http/modules/proxy')
-rw-r--r--src/http/modules/proxy/ngx_http_proxy_handler.c31
-rw-r--r--src/http/modules/proxy/ngx_http_proxy_handler.h7
-rw-r--r--src/http/modules/proxy/ngx_http_proxy_upstream.c38
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;