Можно ли избежать вызова CONNECT для изменения конфигурации HTTP-прокси при использовании WebClient?

Во время миграции spring-web в spring-reactive-web мы заблокировали реализацию HTTP proxy в методе WebClient билдера.

Ранее мы уже пробовали приведенный ниже фрагмент кода, на который ссылается Как я могу поддерживать HTTP-прокси с помощью Spring 5 WebClient?.

WebClient.Builder currentWebClient = WebClient.builder();
if (StringUtils.isNotBlank(customRequest.getConnectionMap().get(GatewayConstants.PROXY_HOST))) {
    HttpClient httpClient = HttpClient.create()
             .tcpConfiguration(tcpClient ->
                                tcpClient.proxy(proxy -> proxy.type(ProxyProvider.Proxy.HTTP).host(customRequest.getConnectionMap().get(GatewayConstants.PROXY_HOST)).port(Integer.valueOf(customRequest.getConnectionMap().get(GatewayConstants.PROXY_PORT)))));
    ReactorClientHttpConnector connector = new ReactorClientHttpConnector(httpClient);
    currentWebClient = currentWebClient.clientConnector(connector);
}

Для упомянутого фрагмента кода требуется поддержка прокси с поддержкой TLS. Он пытается установить соединение с помощью метода HTTP-Connect, и в нашем случае мы получаем status: 403 Forbidden, так как у нас пока нет поддержки https. Чтобы отключить функции HTTPS из httpClient, я даже пробовал noSSL(), но у меня это не сработает,

HttpClient httpClient = HttpClient.create()
                        .tcpConfiguration(tcpClient ->
                                tcpClient
                                        .noSSL() 
                                        ...

Независимо от того, пытаюсь ли я включить или отключить часть SSL из HTTP-клиента, временная шкала сетевой активности выглядит одинаково, я имею в виду, что во всех случаях она вызывает метод HTTP CONNECT, когда я использую прокси.

введите здесь описание изображения

Код ниже выглядит хорошо и помогает нам вызывать API красиво, но мы не нашли стандартного способа связать с ним конфигурацию HTTP_PROXY (Without HTTP CONNECT method call).

WebClient.Builder currentWebClient = WebClient.builder();

Mono<CustomHttpResponse> response = WebClient.builder().build()
                    .method(HttpMethod.GET)
                    .uri(url)
                    .exchange()
                    .flatMap(r -> r.bodyToMono(String.class).flatMap(b -> {
                        customHttpResponse.setBodyMap(convertToMap(customRequest, b));
                        return Mono.just(customHttpResponse);
                    }))
                    .timeout(Duration.ofMillis(10000))
                    .doOnRequest(r -> logger.info("BACKEND_CALL start"))
                    .doOnError(r -> logger.info("BACKEND_CALL ERROR"));

Здесь мы ищем стандартный способ реализации механизма HTTP-вызовов для HTTP-методов GET, POST, PUT и DELETE с использованием WebClient с учетом доменных SOCKET_TIMEOUT, CONNECTION_TIMEOUT, HTTP_PROXY (Without HTTP CONNECT method call), Number of RETRY для некоторых внутренних вызовов.

Что касается зависимостей, действующая версия нашего веб-клиента исходит из Gradle: org.springframework:spring-web:5.1.7.RELEASE.

Пожалуйста, не стесняйтесь комментировать ниже, если у вас есть какие-либо дополнительные вопросы, относящиеся к этому.


person Md. Hasan Basri Angel    schedule 08.10.2019    source источник
comment
Возможный дубликат Как я могу поддерживать HTTP-прокси используя веб-клиент Spring 5?   -  person Isank    schedule 09.10.2019
comment
@Isank Спасибо, сегодня я немного изменил содержание и попытался уточнить свой вопрос более подробно, упомянув некоторые ссылки.   -  person Md. Hasan Basri Angel    schedule 10.10.2019
comment
Быстрый ответ - нет. github.com/reactor/reactor-netty/issues/159   -  person Violeta Georgieva    schedule 11.10.2019