Spring WebClient mit Jetty: einfaches HTTP-Proxying ohne CONNECT
Verwenden Sie Springs Jetty-Connector mit passenden HTTP/1.1-Client- und Proxy-Protokollen, wenn eine gewöhnliche weitergeleitete HTTP-Anfrage erforderlich ist.
Der HTTP-Proxy-Handler von Reactor Netty baut selbst für ein einfaches HTTP-Ziel einen CONNECT-Tunnel auf. Wenn der vorgesehene Proxy stattdessen eine gewöhnliche HTTP/1.1-Weiterleitung akzeptiert, kann Spring WebClient einen anderen unterstützten Connector verwenden.
Für Spring 6.2 mit der Client-API von Jetty 12.0.35 und einer kompatiblen Jetty Reactive Streams-Integration:
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 und JettyClientHttpConnector sind Spring-Klassen. Verwalten Sie Start und Stopp des bereitgestellten Jetty-Clients über den normalen Lebenszyklus der Anwendung.
Der HTTP/1.1-Proxy von Jetty kann eine gewöhnliche HTTP/1.1-Anfrage ohne Tunnel weiterleiten, wenn Ziel- und Client-Proxy-Protokolle übereinstimmen. Seine requiresTunnel-Richtlinie verwendet CONNECT für sichere Ziele und für inkompatible Protokollpfade.
Dies ist kein Weg, CONNECT aus einem gewöhnlichen HTTPS-Tunnel zu entfernen. Halten Sie das Schema des Ziels korrekt.
Verwenden Sie addProxy in der genannten Jetty-API. getProxies gibt eine unveränderliche Liste zurück, daher ist das ältere Rezept getProxies().add(...) nicht ihre aktuelle Mutationsschnittstelle.
Für öffentliche HTTP-Ziele auf einer zulässigen öffentlichen Proxy-Route liefert die HTTP-Proxy-Liste Kandidaten für Host und Port des Jetty-Proxys. Lesen Sie die tatsächliche Proxy-Antwort, wenn Sie Connectoren vergleichen. Authentifizierung, Zielrichtlinie und ein nicht erreichbares Ziel bleiben getrennt von der Wahl zwischen weitergeleitetem HTTP und CONNECT.