JDK 25 HttpClient n'utilise pas les routes SOCKS du ProxySelector
Choisissez un transport HTTP Java qui prend réellement en charge SOCKS au lieu de vous fier uniquement au type renvoyé par un ProxySelector.
Un objet proxy Java décrit une route. Le client réseau décide toujours quels types de route il peut utiliser. Cela compte lorsque le point de terminaison disponible parle SOCKS et que l'application utilise java.net.http.HttpClient.
Dans l'implémentation JDK 25 examinée ici, le code de requête du client HTTP accepte un candidat HTTP provenant du sélecteur. Un candidat SOCKS ne le conduit pas à effectuer une négociation SOCKS ; l'implémentation peut continuer sans proxy. Une réponse réussie ne prouve donc pas suffisamment que l'entrée SOCKS d'un sélecteur personnalisé a été utilisée.
Choisissez d'abord le transport
Pour une application existante basée sur URLConnection, le gestionnaire de protocole peut recevoir un proxy explicite pris en charge lors de l'ouverture de la connexion :
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);
Pour les tests autorisés sur des cibles publiques, utilisez un point de terminaison SOCKS correspondant de votre service ou de la liste de proxys SOCKS. Il s'agit d'une autre API cliente, pas d'une orthographe alternative de HttpClient.Builder.proxy. Conservez l'URL de destination afin qu'HTTPS continue d'identifier le site voulu.
Une application qui doit conserver java.net.http peut plutôt utiliser un point de terminaison proxy HTTP compatible, y compris un adaptateur approuvé qui gère la connexion SOCKS en aval. Cela ajoute un composant réel et une autre frontière d'accès ; remplacer le port 8080 par 1080 ne fournit pas cette traduction.
Gardez la sélection et l'adoption visibles
Enregistrez à la fois le résultat du sélecteur et la connexion que le client ouvre réellement. Le premier décrit la sortie de la politique ; le second établit si l'implémentation l'a adoptée.
Rattachez les conclusions au runtime et au transport utilisés. Les propriétés SOCKS de la JVM utilisées par une implémentation de socket ne garantissent pas que chaque bibliothèque HTTP les consulte. Lorsque la route est obligatoire, un type de proxy non pris en charge devrait être détecté avant d'accepter une requête directe apparemment réussie.