[PATCH 10 of 14] Proxy: always emit "Host" header first
Maxim Dounin
mdounin at mdounin.ru
Tue Jul 4 16:48:23 UTC 2017
Hello!
On Thu, Jun 22, 2017 at 01:33:14PM -0700, Piotr Sikora via nginx-devel wrote:
> # HG changeset patch
> # User Piotr Sikora <piotrsikora at google.com>
> # Date 1489618489 25200
> # Wed Mar 15 15:54:49 2017 -0700
> # Node ID 068381014f256ad6e2dc490bacc2529cebbb0462
> # Parent 96075d4cd2a6e8bd67caf1d7b78f8e87d757c48d
> Proxy: always emit "Host" header first.
>
> Signed-off-by: Piotr Sikora <piotrsikora at google.com>
>
> diff -r 96075d4cd2a6 -r 068381014f25 src/http/modules/ngx_http_proxy_module.c
> --- a/src/http/modules/ngx_http_proxy_module.c
> +++ b/src/http/modules/ngx_http_proxy_module.c
> @@ -3422,7 +3422,7 @@ ngx_http_proxy_init_headers(ngx_conf_t *
> uintptr_t *code;
> ngx_uint_t i;
> ngx_array_t headers_names, headers_merged;
> - ngx_keyval_t *src, *s, *h;
> + ngx_keyval_t *host, *src, *s, *h;
> ngx_hash_key_t *hk;
> ngx_hash_init_t hash;
> ngx_http_script_compile_t sc;
> @@ -3454,11 +3454,33 @@ ngx_http_proxy_init_headers(ngx_conf_t *
> return NGX_ERROR;
> }
>
> + h = default_headers;
> +
> + if (h->key.len != sizeof("Host") - 1
> + || ngx_strcasecmp(h->key.data, (u_char *) "Host") != 0)
> + {
> + return NGX_ERROR;
> + }
> +
> + host = ngx_array_push(&headers_merged);
> + if (host == NULL) {
> + return NGX_ERROR;
> + }
> +
> + *host = *h++;
> +
> if (conf->headers_source) {
>
> src = conf->headers_source->elts;
> for (i = 0; i < conf->headers_source->nelts; i++) {
>
> + if (src[i].key.len == sizeof("Host") - 1
> + && ngx_strcasecmp(src[i].key.data, (u_char *) "Host") == 0)
> + {
> + *host = src[i];
> + continue;
> + }
> +
> s = ngx_array_push(&headers_merged);
> if (s == NULL) {
> return NGX_ERROR;
> @@ -3468,8 +3490,6 @@ ngx_http_proxy_init_headers(ngx_conf_t *
> }
> }
>
> - h = default_headers;
> -
> while (h->key.len) {
>
> src = headers_merged.elts;
As already outlined in the review here:
http://mailman.nginx.org/pipermail/nginx-devel/2017-June/010087.html
the approach taken looks very fragile. There should be a better
way to do this.
--
Maxim Dounin
http://nginx.org/
More information about the nginx-devel
mailing list