Обработчик HTTP-прокси в Reactor Netty создаёт туннель CONNECT даже для обычного HTTP-адресата. Если предполагаемый прокси принимает обычную пересылку HTTP/1.1, Spring WebClient может использовать другой поддерживаемый коннектор.

Для Spring 6.2 с клиентским API Jetty 12.0.35 и совместимой интеграцией Jetty Reactive Streams:

var jetty = new org.eclipse.jetty.client.HttpClient(
    new org.eclipse.jetty.client.transport.HttpClientTransportOverHTTP());
jetty.getProxyConfiguration().addProxy(
    new org.eclipse.jetty.client.HttpProxy("proxy.example", 8080));

var client = WebClient.builder()
    .clientConnector(new JettyClientHttpConnector(jetty))
    .build();

WebClient и JettyClientHttpConnector — классы Spring. Управляйте запуском и остановкой предоставленного клиента Jetty через обычный жизненный цикл приложения.

HTTP/1.1-прокси Jetty может пересылать обычный HTTP/1.1-запрос без туннеля, когда протоколы адресата и клиентского прокси совпадают. Его политика requiresTunnel использует CONNECT для защищённых адресатов и несовместимых протокольных путей.

Это не способ убрать CONNECT из обычного туннеля HTTPS. Сохраняйте правильную схему адресата.

Используйте addProxy в указанном API Jetty. getProxies возвращает неизменяемый список, поэтому старый рецепт getProxies().add(...) не является текущим интерфейсом изменения.

Для публичных HTTP-адресатов на разрешённом публичном прокси-маршруте список HTTP-прокси предоставляет кандидатов для хоста и порта прокси Jetty. При сравнении коннекторов читайте фактический ответ прокси. Аутентификация, политика адресата и недоступный адресат остаются отдельно от выбора пересылаемого HTTP или CONNECT.

Похожие статьи