On 6/1/22 11:56 AM, yla...@apache.org wrote:
> Author: ylavic
> Date: Wed Jun  1 09:56:43 2022
> New Revision: 1901485
> 
> URL: http://svn.apache.org/viewvc?rev=1901485&view=rev
> Log:
> mod_proxy: Let fixup hooks know about the Host header (and eventually 
> overwrite it).
> 
> If proxy_run_fixups() sets a Host header there will be two ones sent to the
> origin server.
> 
> Instead, let the hooks know about the Host by setting it in the r->headers_in
> passed to proxy_run_fixups(), and use the actual value afterwards.
> Note: if proxy_run_fixups() unsets the Host we'll keep ours.
> 
> Suggested by: rpluem
> 
> 
> Modified:
>     httpd/httpd/trunk/modules/proxy/proxy_util.c
> 
> Modified: httpd/httpd/trunk/modules/proxy/proxy_util.c
> URL: 
> http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/proxy_util.c?rev=1901485&r1=1901484&r2=1901485&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/modules/proxy/proxy_util.c (original)
> +++ httpd/httpd/trunk/modules/proxy/proxy_util.c Wed Jun  1 09:56:43 2022

> @@ -3975,9 +3975,7 @@ PROXY_DECLARE(int) ap_proxy_create_hdrbr
>      if (force10)
>          apr_table_unset(r->headers_in, "Trailer");
>  
> -    /* We used to send `Host: ` always first, so let's keep it that
> -     * way. No telling which legacy backend is relying no this.
> -     */
> +    /* Compute Host header */
>      if (dconf->preserve_host == 0) {
>          if (ap_strchr_c(uri->hostname, ':')) { /* if literal IPv6 address */
>              if (uri->port_str && uri->port != DEFAULT_HTTP_PORT) {
> @@ -3994,10 +3992,11 @@ PROXY_DECLARE(int) ap_proxy_create_hdrbr
>                  host = uri->hostname;
>              }
>          }
> +        apr_table_setn(r->headers_in, "Host", host);
>      }
>      else {
> -        /* don't want to use r->hostname, as the incoming header might have a
> -         * port attached
> +        /* don't want to use r->hostname as the incoming header might have a
> +         * port attached, let's use the original header.
>           */
>          host = saved_host;
>          if (!host) {
> @@ -4007,10 +4006,9 @@ PROXY_DECLARE(int) ap_proxy_create_hdrbr
>                            "on incoming request and preserve host set "
>                            "forcing hostname to be %s for uri %s",
>                            host, r->uri);
> +            apr_table_setn(r->headers_in, "Host", host);
>          }
>      }

Nitpick: Can't we do the apr_table_setn(r->headers_in, "Host", host); here 
instead of in each if/else branch?

> -    ap_h1_append_header(header_brigade, r->pool, "Host", host);
> -    apr_table_unset(r->headers_in, "Host");
>  
>      /* handle Via */
>      if (conf->viaopt == via_block) {


Regards

RĂ¼diger

Reply via email to