JDK 25 HttpClient verwendet keine SOCKS-Routen aus dem ProxySelector
Wählen Sie einen Java-HTTP-Transport, der SOCKS tatsächlich unterstützt, statt sich allein auf den von einem ProxySelector zurückgegebenen Typ zu verlassen.
Ein Java-Proxyobjekt beschreibt eine Route. Der Netzwerkclient entscheidet weiterhin, welche Arten von Routen er verwenden kann. Das ist wichtig, wenn der verfügbare Endpunkt SOCKS spricht und die Anwendung java.net.http.HttpClient verwendet.
In der hier untersuchten JDK-25-Implementierung akzeptiert der Anforderungscode des HTTP-Clients einen HTTP-Kandidaten vom Selektor. Ein SOCKS-Kandidat veranlasst ihn nicht, eine SOCKS-Aushandlung durchzuführen; die Implementierung kann ohne Proxy fortfahren. Eine erfolgreiche Antwort ist daher kein ausreichender Beleg dafür, dass der SOCKS-Eintrag eines benutzerdefinierten Selektors verwendet wurde.
Zuerst den Transport wählen
Bei einer bestehenden URLConnection-basierten Anwendung kann dem Protokollhandler beim Öffnen der Verbindung ein unterstützter expliziter Proxy übergeben werden:
Proxy route = new Proxy(Proxy.Type.SOCKS,
new InetSocketAddress("proxy.example", 1080));
URLConnection connection = URI.create("https://service.example/")
.toURL().openConnection(route);
connection.setConnectTimeout(5000);
connection.setReadTimeout(15000);
Für erlaubte Tests öffentlicher Ziele verwenden Sie einen passenden SOCKS-Endpunkt aus Ihrem Dienst oder aus der SOCKS-Proxy-Liste. Dies ist eine andere Client-API, keine alternative Schreibweise von HttpClient.Builder.proxy. Behalten Sie die Ziel-URL bei, damit HTTPS weiterhin die beabsichtigte Website identifiziert.
Eine Anwendung, die java.net.http beibehalten muss, kann stattdessen einen kompatiblen HTTP-Proxy-Endpunkt verwenden, einschließlich eines genehmigten Adapters, der die weitere SOCKS-Verbindung übernimmt. Das fügt eine echte Komponente und eine weitere Zugriffsgrenze hinzu; Port 8080 auf 1080 zu ändern liefert diese Übersetzung nicht.
Auswahl und Übernahme sichtbar halten
Zeichnen Sie sowohl das Ergebnis des Selektors als auch die Verbindung auf, die der Client tatsächlich öffnet. Das erste beschreibt die Richtlinienausgabe; das zweite stellt fest, ob die Implementierung sie übernommen hat.
Binden Sie Schlussfolgerungen an die verwendete Laufzeit und den Transport. JVM-SOCKS-Eigenschaften, die eine Socket-Implementierung nutzt, sind kein Versprechen, dass jede HTTP-Bibliothek sie heranzieht. Wenn die Route zwingend ist, sollte ein nicht unterstützter Proxytyp erkannt werden, bevor eine scheinbar erfolgreiche direkte Anfrage akzeptiert wird.