首页 文章

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

提问于
浏览
0

我正在使用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 param支持直通HTTPClient参数 . 但是从版本2.13.0开始,camel http4使用HTTPClient 4.3的构建器api(http://camel.apache.org/http4.html)从 endpoints 配置传递httpClient . * params,遗憾的是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上设置虚拟主机,它似乎被称为目标主机 . 我怎么能通过骆驼来做到这一点?

So to sum up: 我正在使用camel的http4组件,需要更改传出代理请求的 Host HTTP标头值 .

2 回答

  • 0

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

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

    点此帖子Configuring Apache HttpClient to access service through proxy/load-balancer (overriding Host header)

    这个片段对我有用:

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

相关问题