如何从 Camel http4 代理设置传出主机 header

How to set outgoing Host header from Camel http4 proxy

我正在使用 Apache Camel 2.13.1 作为使用 http4 组件的 HTTP 代理:

.from("servlet://*?matchOnUriPrefix=true")
.to("http4://example.com/?bridgeEndpoint=true&httpClient.redirectsEnabled=false")

现在我需要将传出代理请求的 Host HTTP header 参数设置到后端系统,因为被代理的应用程序使用它来生成绝对链接,它必须匹配public/frontend url。 使用简单地在骆驼消息 .setHeader("Host", "foo.com") 中设置 Host header 的天真方法失败,因为 http4 组件用代理主机 example.com 的主机名覆盖它。

进一步的研究表明,HTTPClient 过去常常通过 virtual-host 参数来执行此操作。 Camel 的 http4 组件支持使用 httpClient 参数的 pass-through HTTPClient 参数。但是从 2.13.0 版本开始, camel http4 使用 HTTPClient 4.3 的构建器 api (http://camel.apache.org/http4.html) to pass through the httpClient.* params from the endpoint configuration and unfortunately HTTPClient 4.3's builder api does not include the virtual-host param anymore. Judging by this HTTPClient mailing list reply (https://mail-archives.apache.org/mod_mbox//hc-httpclient-users/201312.mbox/%3C1387792931.6163.17.camel@ubuntu%3E) 看起来我可能必须通过 setTargetHost 在 HttpClientContext 上设置虚拟主机,它似乎被称为目标主机。我怎样才能通过骆驼在两者之间做到这一点?

所以总结一下: 我正在使用 camel 的 http4 组件,需要更改传出代理请求的 Host HTTP header 值。

您可以像这样使用 httpContext 选项设置 HttpContext 实例。请确保 HttpContext 实例与注册表中的 "customerContext" 绑定。

http4://localhost:8081?httpBindingRef=customBinding&httpClientConfigurerRef=customConfigurer&httpContext=#customContext

关注这个post

这段代码对我有用:

            HttpComponent http4 = camelContext.getComponent("http4", HttpComponent.class);

            http4.setHttpClientConfigurer(new HttpClientConfigurer() {

                @Override
                public void configureHttpClient(HttpClientBuilder builder) {

                    builder.addInterceptorFirst(new HttpRequestInterceptor() {
                        @Override
                        public void process(HttpRequest request, HttpContext context) throws HttpException, IOException {
                            request.setHeader(HTTP.TARGET_HOST, publicUrl);
                        }
                    });
                }

            });