mirror of
https://github.com/nginx/nginx.git
synced 2024-12-18 21:23:36 -06:00
Proxy: split configured header names and values.
Previously, each configured header was represented in one of two ways, depending on whether or not its value included any variables. If the value didn't include any variables, then it would be represented as as a single script that contained complete header line with HTTP/1.1 delimiters, i.e.: "Header: value\r\n" But if the value included any variables, then it would be represented as a series of three scripts: first contained header name and the ": " delimiter, second evaluated to header value, and third contained only "\r\n", i.e.: "Header: " "$value" "\r\n" This commit changes that, so that each configured header is represented as a series of two scripts: first contains only header name, and second contains (or evaluates to) only header value, i.e.: "Header" "$value" or "Header" "value" This not only makes things more consistent, but also allows header name and value to be accessed separately. Signed-off-by: Piotr Sikora <piotrsikora@google.com>
This commit is contained in:
parent
3057fca368
commit
32e3d0e693
@ -1143,7 +1143,8 @@ ngx_http_proxy_create_key(ngx_http_request_t *r)
|
||||
static ngx_int_t
|
||||
ngx_http_proxy_create_request(ngx_http_request_t *r)
|
||||
{
|
||||
size_t len, uri_len, loc_len, body_len;
|
||||
size_t len, uri_len, loc_len, body_len,
|
||||
key_len, val_len;
|
||||
uintptr_t escape;
|
||||
ngx_buf_t *b;
|
||||
ngx_str_t method;
|
||||
@ -1258,11 +1259,20 @@ ngx_http_proxy_create_request(ngx_http_request_t *r)
|
||||
le.flushed = 1;
|
||||
|
||||
while (*(uintptr_t *) le.ip) {
|
||||
while (*(uintptr_t *) le.ip) {
|
||||
|
||||
lcode = *(ngx_http_script_len_code_pt *) le.ip;
|
||||
key_len = lcode(&le);
|
||||
|
||||
for (val_len = 0; *(uintptr_t *) le.ip; val_len += lcode(&le)) {
|
||||
lcode = *(ngx_http_script_len_code_pt *) le.ip;
|
||||
len += lcode(&le);
|
||||
}
|
||||
le.ip += sizeof(uintptr_t);
|
||||
|
||||
if (val_len == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
len += key_len + sizeof(": ") - 1 + val_len + sizeof(CRLF) - 1;
|
||||
}
|
||||
|
||||
|
||||
@ -1362,30 +1372,41 @@ ngx_http_proxy_create_request(ngx_http_request_t *r)
|
||||
le.ip = headers->lengths->elts;
|
||||
|
||||
while (*(uintptr_t *) le.ip) {
|
||||
lcode = *(ngx_http_script_len_code_pt *) le.ip;
|
||||
|
||||
/* skip the header line name length */
|
||||
lcode = *(ngx_http_script_len_code_pt *) le.ip;
|
||||
(void) lcode(&le);
|
||||
|
||||
if (*(ngx_http_script_len_code_pt *) le.ip) {
|
||||
for (val_len = 0; *(uintptr_t *) le.ip; val_len += lcode(&le)) {
|
||||
lcode = *(ngx_http_script_len_code_pt *) le.ip;
|
||||
}
|
||||
le.ip += sizeof(uintptr_t);
|
||||
|
||||
for (len = 0; *(uintptr_t *) le.ip; len += lcode(&le)) {
|
||||
lcode = *(ngx_http_script_len_code_pt *) le.ip;
|
||||
if (val_len == 0) {
|
||||
e.skip = 1;
|
||||
|
||||
while (*(uintptr_t *) e.ip) {
|
||||
code = *(ngx_http_script_code_pt *) e.ip;
|
||||
code((ngx_http_script_engine_t *) &e);
|
||||
}
|
||||
e.ip += sizeof(uintptr_t);
|
||||
|
||||
e.skip = (len == sizeof(CRLF) - 1) ? 1 : 0;
|
||||
|
||||
} else {
|
||||
e.skip = 0;
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
le.ip += sizeof(uintptr_t);
|
||||
code = *(ngx_http_script_code_pt *) e.ip;
|
||||
code((ngx_http_script_engine_t *) &e);
|
||||
|
||||
*e.pos++ = ':'; *e.pos++ = ' ';
|
||||
|
||||
while (*(uintptr_t *) e.ip) {
|
||||
code = *(ngx_http_script_code_pt *) e.ip;
|
||||
code((ngx_http_script_engine_t *) &e);
|
||||
}
|
||||
e.ip += sizeof(uintptr_t);
|
||||
|
||||
*e.pos++ = CR; *e.pos++ = LF;
|
||||
}
|
||||
|
||||
b->last = e.pos;
|
||||
@ -3498,108 +3519,40 @@ ngx_http_proxy_init_headers(ngx_conf_t *cf, ngx_http_proxy_loc_conf_t *conf,
|
||||
continue;
|
||||
}
|
||||
|
||||
if (ngx_http_script_variables_count(&src[i].value) == 0) {
|
||||
copy = ngx_array_push_n(headers->lengths,
|
||||
sizeof(ngx_http_script_copy_code_t));
|
||||
if (copy == NULL) {
|
||||
return NGX_ERROR;
|
||||
}
|
||||
copy = ngx_array_push_n(headers->lengths,
|
||||
sizeof(ngx_http_script_copy_code_t));
|
||||
if (copy == NULL) {
|
||||
return NGX_ERROR;
|
||||
}
|
||||
|
||||
copy->code = (ngx_http_script_code_pt)
|
||||
ngx_http_script_copy_len_code;
|
||||
copy->len = src[i].key.len + sizeof(": ") - 1
|
||||
+ src[i].value.len + sizeof(CRLF) - 1;
|
||||
copy->code = (ngx_http_script_code_pt) ngx_http_script_copy_len_code;
|
||||
copy->len = src[i].key.len;
|
||||
|
||||
size = (sizeof(ngx_http_script_copy_code_t)
|
||||
+ src[i].key.len + sizeof(uintptr_t) - 1)
|
||||
& ~(sizeof(uintptr_t) - 1);
|
||||
|
||||
size = (sizeof(ngx_http_script_copy_code_t)
|
||||
+ src[i].key.len + sizeof(": ") - 1
|
||||
+ src[i].value.len + sizeof(CRLF) - 1
|
||||
+ sizeof(uintptr_t) - 1)
|
||||
& ~(sizeof(uintptr_t) - 1);
|
||||
copy = ngx_array_push_n(headers->values, size);
|
||||
if (copy == NULL) {
|
||||
return NGX_ERROR;
|
||||
}
|
||||
|
||||
copy = ngx_array_push_n(headers->values, size);
|
||||
if (copy == NULL) {
|
||||
return NGX_ERROR;
|
||||
}
|
||||
copy->code = ngx_http_script_copy_code;
|
||||
copy->len = src[i].key.len;
|
||||
|
||||
copy->code = ngx_http_script_copy_code;
|
||||
copy->len = src[i].key.len + sizeof(": ") - 1
|
||||
+ src[i].value.len + sizeof(CRLF) - 1;
|
||||
p = (u_char *) copy + sizeof(ngx_http_script_copy_code_t);
|
||||
ngx_memcpy(p, src[i].key.data, src[i].key.len);
|
||||
|
||||
p = (u_char *) copy + sizeof(ngx_http_script_copy_code_t);
|
||||
ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));
|
||||
|
||||
p = ngx_cpymem(p, src[i].key.data, src[i].key.len);
|
||||
*p++ = ':'; *p++ = ' ';
|
||||
p = ngx_cpymem(p, src[i].value.data, src[i].value.len);
|
||||
*p++ = CR; *p = LF;
|
||||
sc.cf = cf;
|
||||
sc.source = &src[i].value;
|
||||
sc.flushes = &headers->flushes;
|
||||
sc.lengths = &headers->lengths;
|
||||
sc.values = &headers->values;
|
||||
|
||||
} else {
|
||||
copy = ngx_array_push_n(headers->lengths,
|
||||
sizeof(ngx_http_script_copy_code_t));
|
||||
if (copy == NULL) {
|
||||
return NGX_ERROR;
|
||||
}
|
||||
|
||||
copy->code = (ngx_http_script_code_pt)
|
||||
ngx_http_script_copy_len_code;
|
||||
copy->len = src[i].key.len + sizeof(": ") - 1;
|
||||
|
||||
|
||||
size = (sizeof(ngx_http_script_copy_code_t)
|
||||
+ src[i].key.len + sizeof(": ") - 1 + sizeof(uintptr_t) - 1)
|
||||
& ~(sizeof(uintptr_t) - 1);
|
||||
|
||||
copy = ngx_array_push_n(headers->values, size);
|
||||
if (copy == NULL) {
|
||||
return NGX_ERROR;
|
||||
}
|
||||
|
||||
copy->code = ngx_http_script_copy_code;
|
||||
copy->len = src[i].key.len + sizeof(": ") - 1;
|
||||
|
||||
p = (u_char *) copy + sizeof(ngx_http_script_copy_code_t);
|
||||
p = ngx_cpymem(p, src[i].key.data, src[i].key.len);
|
||||
*p++ = ':'; *p = ' ';
|
||||
|
||||
|
||||
ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));
|
||||
|
||||
sc.cf = cf;
|
||||
sc.source = &src[i].value;
|
||||
sc.flushes = &headers->flushes;
|
||||
sc.lengths = &headers->lengths;
|
||||
sc.values = &headers->values;
|
||||
|
||||
if (ngx_http_script_compile(&sc) != NGX_OK) {
|
||||
return NGX_ERROR;
|
||||
}
|
||||
|
||||
|
||||
copy = ngx_array_push_n(headers->lengths,
|
||||
sizeof(ngx_http_script_copy_code_t));
|
||||
if (copy == NULL) {
|
||||
return NGX_ERROR;
|
||||
}
|
||||
|
||||
copy->code = (ngx_http_script_code_pt)
|
||||
ngx_http_script_copy_len_code;
|
||||
copy->len = sizeof(CRLF) - 1;
|
||||
|
||||
|
||||
size = (sizeof(ngx_http_script_copy_code_t)
|
||||
+ sizeof(CRLF) - 1 + sizeof(uintptr_t) - 1)
|
||||
& ~(sizeof(uintptr_t) - 1);
|
||||
|
||||
copy = ngx_array_push_n(headers->values, size);
|
||||
if (copy == NULL) {
|
||||
return NGX_ERROR;
|
||||
}
|
||||
|
||||
copy->code = ngx_http_script_copy_code;
|
||||
copy->len = sizeof(CRLF) - 1;
|
||||
|
||||
p = (u_char *) copy + sizeof(ngx_http_script_copy_code_t);
|
||||
*p++ = CR; *p = LF;
|
||||
if (ngx_http_script_compile(&sc) != NGX_OK) {
|
||||
return NGX_ERROR;
|
||||
}
|
||||
|
||||
code = ngx_array_push_n(headers->lengths, sizeof(uintptr_t));
|
||||
|
Loading…
Reference in New Issue
Block a user