Spring WebClient con Jetty: proxy HTTP simple sin CONNECT
Usa el conector Jetty de Spring con protocolos de cliente y proxy HTTP/1.1 coincidentes cuando se requiere una solicitud HTTP reenviada ordinaria.
El controlador de proxy HTTP de Reactor Netty establece un túnel CONNECT incluso para un destino HTTP simple. Si el proxy previsto acepta en cambio un reenvío HTTP/1.1 ordinario, Spring WebClient puede usar otro conector compatible.
Para Spring 6.2 con la API de cliente de Jetty 12.0.35 y una integración compatible de 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 y JettyClientHttpConnector son clases de Spring. Gestiona el arranque y la parada del cliente Jetty proporcionado mediante el ciclo de vida normal de la aplicación.
El proxy HTTP/1.1 de Jetty puede reenviar una solicitud HTTP/1.1 ordinaria sin túnel cuando coinciden los protocolos de destino y de cliente-proxy. Su política requiresTunnel usa CONNECT para destinos seguros y para rutas de protocolo incompatibles.
Esto no es una forma de eliminar CONNECT de un túnel HTTPS ordinario. Mantén correcto el esquema del destino.
Usa addProxy en la API de Jetty indicada. getProxies devuelve una lista no modificable, así que la receta anterior getProxies().add(...) no es su interfaz de mutación actual.
Para destinos HTTP públicos en una ruta de proxy público permitida, la lista de proxies HTTP ofrece candidatos para el host y el puerto del proxy de Jetty. Lee la respuesta real del proxy al comparar conectores. La autenticación, la política de destino y un destino no disponible siguen siendo independientes de elegir HTTP reenviado o CONNECT.