如何从 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);
}
});
}
});
我正在使用 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);
}
});
}
});