Spring WebClient с Jetty: обычное HTTP-проксирование без CONNECT
Используйте коннектор Jetty из Spring с согласованными протоколами HTTP/1.1 клиента и прокси, когда требуется обычный пересылаемый HTTP-запрос.
Обработчик 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.