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