[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