Можно ли избежать вызова CONNECT, изменяющего конфигурацию HTTP-прокси при использовании WebClient? - PullRequest
1 голос
/ 08 октября 2019

Во время миграции 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, когда я использую прокси.

enter image description here

Ниже код выглядит хорошо и помогает нам вызывать 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-вызовов для GET, POST, PUT и DELETE HTTP-методы с использованием WebClient, учитывающие специфику домена SOCKET_TIMEOUT, CONNECTION_TIMEOUT, HTTP_PROXY (Without HTTP CONNECT method call), Number of RETRY для некоторых внутренних вызовов.

Для зависимой части - эффективная версиядля нашего веб-клиента: Gradle: org.springframework:spring-web:5.1.7.RELEASE

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

...