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

时间:2015-03-05 16:38:10

标签: apache-camel apache-httpclient-4.x

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

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

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

进一步研究表明,HTTPClient曾经通过虚拟主机参数执行此操作。 Camel的http4组件使用httpClient参数支持直通HTTPClient参数。但是从版本2.13.0开始,  camel http4使用HTTPClient 4.3的构建器api(http://camel.apache.org/http4.html)从端点配置传递httpClient。*参数,遗憾的是HTTPClient 4.3的构建器api不包含虚拟主机参数了。通过这个HTTPClient邮件列表回复(https://mail-archives.apache.org/mod_mbox//hc-httpclient-users/201312.mbox/%3C1387792931.6163.17.camel@ubuntu%3E)来判断,我可能必须通过setTargetHost在HttpClientContext上设置虚拟主机,它似乎被称为目标主机。我怎么能通过骆驼来做到这一点?

总结一下:我使用的是camel的http4组件,需要更改传出代理请求的Host HTTP标头值。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

点这篇文章PyPi regex module

这段代码对我有用:

            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);
                        }
                    });
                }

            });