2015-03-05 2 views
0

Я использую Apache Camel 2.13.1 в качестве HTTP-прокси с помощью компонента http4:Как настроить исходящий заголовок хоста из Camel http4 прокси

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

Теперь мне нужно установить параметр заголовка HTTP Host исходящего прокси-запрос к бэкэнд-системе, поскольку, поскольку он используется прокси-сервером для создания абсолютных ссылок, он должен соответствовать URL-адресу public/frontend. Использование наивного подхода просто установить заголовок Host в сообщении верблюда .setHeader("Host", "foo.com") не удается из-за того, что компонент http4 переопределяет это имя хоста прокси-узла example.com.

Дальнейшие исследования показали, что HTTPClient использовал это с помощью параметра virtual-host. Компонент http4 Camel поддерживает параметры pass-through HTTPClient с использованием параметра httpClient. Однако, поскольку версия 2.13.0, , camel http4 использует HTTPClient 4.3's builder 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/%[email protected]%3E), похоже, что мне может потребоваться установить виртуальный хост, который, как представляется, называется целевым хостом, в HttpClientContext через setTargetHost. Как я могу сделать это через верблюда между ними?

Так, чтобы подвести итог: Я использую компонент http4 верблюда и необходимо изменить значение заголовка Host HTTP запроса исходящего прокси-сервера.

ответ

1

Вы можете настроить экземпляр HttpContext с помощью параметра httpContext, подобного этому. Убедитесь, что экземпляр HttpContext связан с «customerContext» в реестре.

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

Я принимая это как ответ, так как документы, как получить доступ к HttpClient внутренностей от верблюда, который должен в конечном итоге приведет к успеху. Однако я не мог заставить его работать сам, потому что конфигурация HttpClient очень сложна, и у меня закончилось время. – BlueDog

+0

Конфигурация HttpClient не помогает вам в этом, вам нужно применить customContext для установки значения Host так, как вы хотите. –

+0

Это разрешило это для меня: http://stackoverflow.com/questions/9499697/configuring-apache-httpclient-to-access-service-through-proxy-load-balancer-ove – jpt

0

После этого поста 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); 
         } 
        }); 
       } 

      }); 
Смежные вопросы