aboutsummaryrefslogtreecommitdiff
path: root/src/http/modules/ngx_http_proxy_module.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/http/modules/ngx_http_proxy_module.c')
-rw-r--r--src/http/modules/ngx_http_proxy_module.c153
1 files changed, 77 insertions, 76 deletions
diff --git a/src/http/modules/ngx_http_proxy_module.c b/src/http/modules/ngx_http_proxy_module.c
index 8c4231a53..26f08315e 100644
--- a/src/http/modules/ngx_http_proxy_module.c
+++ b/src/http/modules/ngx_http_proxy_module.c
@@ -37,6 +37,7 @@ typedef struct {
ngx_peers_t *peers;
+ ngx_array_t *flushes;
ngx_array_t *headers_set_len;
ngx_array_t *headers_set;
ngx_hash_t *headers_set_hash;
@@ -75,13 +76,13 @@ static void ngx_http_proxy_abort_request(ngx_http_request_t *r);
static void ngx_http_proxy_finalize_request(ngx_http_request_t *r,
ngx_int_t rc);
-static ngx_http_variable_value_t *
- ngx_http_proxy_host_variable(ngx_http_request_t *r, uintptr_t data);
-static ngx_http_variable_value_t *
- ngx_http_proxy_port_variable(ngx_http_request_t *r, uintptr_t data);
-static ngx_http_variable_value_t *
+static ngx_int_t ngx_http_proxy_host_variable(ngx_http_request_t *r,
+ ngx_http_variable_value_t *v, uintptr_t data);
+static ngx_int_t ngx_http_proxy_port_variable(ngx_http_request_t *r,
+ ngx_http_variable_value_t *v, uintptr_t data);
+static ngx_int_t
ngx_http_proxy_add_x_forwarded_for_variable(ngx_http_request_t *r,
- uintptr_t data);
+ ngx_http_variable_value_t *v, uintptr_t data);
static ngx_int_t ngx_http_proxy_rewrite_redirect(ngx_http_request_t *r,
ngx_table_elt_t *h, size_t prefix);
@@ -431,7 +432,7 @@ ngx_http_proxy_create_request(ngx_http_request_t *r)
escape = 0;
- loc_len = r->valid_location ? u->conf->location->len : 0;
+ loc_len = r->valid_location ? u->conf->location.len : 0;
if (u->conf->uri.len == 0 && r->valid_unparsed_uri) {
len += r->unparsed_uri.len;
@@ -447,8 +448,11 @@ ngx_http_proxy_create_request(ngx_http_request_t *r)
ngx_memzero(&e, sizeof(ngx_http_script_engine_t));
+ ngx_http_script_flush_no_cachable_variables(r, plcf->flushes);
+
le.ip = plcf->headers_set_len->elts;
le.request = r;
+ le.flushed = 1;
while (*(uintptr_t *) le.ip) {
while (*(uintptr_t *) le.ip) {
@@ -506,16 +510,16 @@ ngx_http_proxy_create_request(ngx_http_request_t *r)
/* the request line */
- b->last = ngx_cpymem(b->last, method.data, method.len);
+ b->last = ngx_copy(b->last, method.data, method.len);
u->uri.data = b->last;
if (u->conf->uri.len == 0 && r->valid_unparsed_uri) {
- b->last = ngx_cpymem(b->last, r->unparsed_uri.data,
- r->unparsed_uri.len);
+ b->last = ngx_copy(b->last, r->unparsed_uri.data, r->unparsed_uri.len);
+
} else {
if (r->valid_location) {
- b->last = ngx_cpymem(b->last, u->conf->uri.data, u->conf->uri.len);
+ b->last = ngx_copy(b->last, u->conf->uri.data, u->conf->uri.len);
}
if (escape) {
@@ -524,13 +528,13 @@ ngx_http_proxy_create_request(ngx_http_request_t *r)
b->last += r->uri.len - loc_len + escape;
} else {
- b->last = ngx_cpymem(b->last, r->uri.data + loc_len,
- r->uri.len - loc_len);
+ b->last = ngx_copy(b->last, r->uri.data + loc_len,
+ r->uri.len - loc_len);
}
if (r->args.len > 0) {
*b->last++ = '?';
- b->last = ngx_cpymem(b->last, r->args.data, r->args.len);
+ b->last = ngx_copy(b->last, r->args.data, r->args.len);
}
}
@@ -543,6 +547,7 @@ ngx_http_proxy_create_request(ngx_http_request_t *r)
e.ip = plcf->headers_set->elts;
e.pos = b->last;
e.request = r;
+ e.flushed = 1;
le.ip = plcf->headers_set_len->elts;
@@ -600,13 +605,12 @@ ngx_http_proxy_create_request(ngx_http_request_t *r)
continue;
}
- b->last = ngx_cpymem(b->last, header[i].key.data,
- header[i].key.len);
+ b->last = ngx_copy(b->last, header[i].key.data, header[i].key.len);
*b->last++ = ':'; *b->last++ = ' ';
- b->last = ngx_cpymem(b->last, header[i].value.data,
- header[i].value.len);
+ b->last = ngx_copy(b->last, header[i].value.data,
+ header[i].value.len);
*b->last++ = CR; *b->last++ = LF;
@@ -735,6 +739,7 @@ ngx_http_proxy_process_status_line(ngx_http_request_t *r)
if (u->headers_in.status_line.data == NULL) {
return NGX_HTTP_INTERNAL_SERVER_ERROR;
}
+
ngx_memcpy(u->headers_in.status_line.data, p->status_start,
u->headers_in.status_line.len);
@@ -1054,83 +1059,77 @@ ngx_http_proxy_finalize_request(ngx_http_request_t *r, ngx_int_t rc)
}
-static ngx_http_variable_value_t *
-ngx_http_proxy_host_variable(ngx_http_request_t *r, uintptr_t data)
+static ngx_int_t
+ngx_http_proxy_host_variable(ngx_http_request_t *r,
+ ngx_http_variable_value_t *v, uintptr_t data)
{
- ngx_http_variable_value_t *vv;
ngx_http_proxy_loc_conf_t *plcf;
- vv = ngx_palloc(r->pool, sizeof(ngx_http_variable_value_t));
- if (vv == NULL) {
- return NULL;
- }
-
plcf = ngx_http_get_module_loc_conf(r, ngx_http_proxy_module);
- vv->value = 0;
- vv->text = plcf->host_header;
+ v->len = plcf->host_header.len;
+ v->valid = 1;
+ v->no_cachable = 0;
+ v->not_found = 0;
+ v->data = plcf->host_header.data;
- return vv;
+ return NGX_OK;
}
-static ngx_http_variable_value_t *
-ngx_http_proxy_port_variable(ngx_http_request_t *r, uintptr_t data)
+static ngx_int_t
+ngx_http_proxy_port_variable(ngx_http_request_t *r,
+ ngx_http_variable_value_t *v, uintptr_t data)
{
- ngx_http_variable_value_t *vv;
ngx_http_proxy_loc_conf_t *plcf;
- vv = ngx_palloc(r->pool, sizeof(ngx_http_variable_value_t));
- if (vv == NULL) {
- return NULL;
- }
-
plcf = ngx_http_get_module_loc_conf(r, ngx_http_proxy_module);
- vv->value = 0;
- vv->text = plcf->port_text;
+ v->len = plcf->port_text.len;
+ v->valid = 1;
+ v->no_cachable = 0;
+ v->not_found = 0;
+ v->data = plcf->port_text.data;
- return vv;
+ return NGX_OK;
}
-static ngx_http_variable_value_t *
+static ngx_int_t
ngx_http_proxy_add_x_forwarded_for_variable(ngx_http_request_t *r,
- uintptr_t data)
+
+ ngx_http_variable_value_t *v, uintptr_t data)
{
- u_char *p;
- ngx_http_variable_value_t *vv;
+ u_char *p;
- vv = ngx_palloc(r->pool, sizeof(ngx_http_variable_value_t));
- if (vv == NULL) {
- return NULL;
- }
-
- vv->value = 0;
+ v->valid = 1;
+ v->no_cachable = 0;
+ v->not_found = 0;
if (r->headers_in.x_forwarded_for == NULL) {
- vv->text = r->connection->addr_text;
- return vv;
+ v->len = r->connection->addr_text.len;
+ v->data = r->connection->addr_text.data;
+ return NGX_OK;
}
- vv->text.len = r->headers_in.x_forwarded_for->value.len
- + sizeof(", ") - 1 + r->connection->addr_text.len;
+ v->len = r->headers_in.x_forwarded_for->value.len
+ + sizeof(", ") - 1 + r->connection->addr_text.len;
- p = ngx_palloc(r->pool, vv->text.len);
+ p = ngx_palloc(r->pool, v->len);
if (p == NULL) {
- return NULL;
+ return NGX_ERROR;
}
- vv->text.data = p;
+ v->data = p;
- p = ngx_cpymem(p, r->headers_in.x_forwarded_for->value.data,
- r->headers_in.x_forwarded_for->value.len);
+ p = ngx_copy(p, r->headers_in.x_forwarded_for->value.data,
+ r->headers_in.x_forwarded_for->value.len);
*p++ = ','; *p++ = ' ';
ngx_memcpy(p, r->connection->addr_text.data, r->connection->addr_text.len);
- return vv;
+ return NGX_OK;
}
@@ -1186,11 +1185,9 @@ ngx_http_proxy_rewrite_redirect_text(ngx_http_request_t *r, ngx_table_elt_t *h,
p = data;
- if (prefix) {
- p = ngx_cpymem(p, h->value.data, prefix);
- }
+ p = ngx_copy(p, h->value.data, prefix);
- p = ngx_cpymem(p, pr->replacement.text.data, pr->replacement.text.len);
+ p = ngx_copy(p, pr->replacement.text.data, pr->replacement.text.len);
ngx_memcpy(p, h->value.data + prefix + pr->redirect.len,
h->value.len - pr->redirect.len - prefix);
@@ -1235,9 +1232,7 @@ ngx_http_proxy_rewrite_redirect_vars(ngx_http_request_t *r, ngx_table_elt_t *h,
p = data;
- if (prefix) {
- p = ngx_cpymem(p, h->value.data, prefix);
- }
+ p = ngx_copy(p, h->value.data, prefix);
e.ip = pr->replacement.vars.values;
e.pos = p;
@@ -1530,7 +1525,7 @@ ngx_http_proxy_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
pr->handler = ngx_http_proxy_rewrite_redirect_text;
pr->redirect = conf->upstream.url;
- pr->replacement.text = *conf->upstream.location;
+ pr->replacement.text = conf->upstream.location;
}
}
@@ -1540,10 +1535,11 @@ ngx_http_proxy_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
}
if (conf->headers_source == NULL) {
- conf->headers_source = prev->headers_source;
+ conf->flushes = prev->flushes;
conf->headers_set_len = prev->headers_set_len;
conf->headers_set = prev->headers_set;
conf->headers_set_hash = prev->headers_set_hash;
+ conf->headers_source = prev->headers_source;
}
if (conf->headers_set_hash) {
@@ -1680,6 +1676,7 @@ ngx_http_proxy_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
sc.cf = cf;
sc.source = &src[i].value;
+ sc.flushes = &conf->flushes;
sc.lengths = &conf->headers_set_len;
sc.values = &conf->headers_set;
@@ -1843,15 +1840,19 @@ ngx_http_proxy_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
clcf->handler = ngx_http_proxy_handler;
- plcf->upstream.location = &clcf->name;
+ plcf->upstream.location = clcf->name;
#if (NGX_PCRE)
- if (clcf->regex && plcf->upstream.uri.len) {
- ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
- "\"proxy_pass\" may not have URI part in "
- "location given by regular expression");
- return NGX_CONF_ERROR;
+ if (clcf->regex) {
+ if (plcf->upstream.uri.len) {
+ ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
+ "\"proxy_pass\" may not have URI part in "
+ "location given by regular expression");
+ return NGX_CONF_ERROR;
+ }
+
+ plcf->upstream.location.len = 0;
}
#endif
@@ -1911,7 +1912,7 @@ ngx_http_proxy_redirect(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
pr->handler = ngx_http_proxy_rewrite_redirect_text;
pr->redirect = plcf->upstream.url;
- pr->replacement.text = *plcf->upstream.location;
+ pr->replacement.text = plcf->upstream.location;
return NGX_CONF_OK;
}