我正在使用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标头值。
答案 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);
}
});
}
});