Το JDK 25 HttpClient δεν χρησιμοποιεί διαδρομές SOCKS από τον ProxySelector
Επιλέξτε μεταφορά HTTP για Java που υποστηρίζει πραγματικά SOCKS αντί να βασίζεστε μόνο στον τύπο που επιστρέφει ένας ProxySelector.
Ένα αντικείμενο proxy της Java περιγράφει μια διαδρομή. Ο πελάτης δικτύου εξακολουθεί να αποφασίζει ποιους τύπους διαδρομής μπορεί να χρησιμοποιήσει. Αυτό έχει σημασία όταν το διαθέσιμο τελικό σημείο μιλά SOCKS και η εφαρμογή χρησιμοποιεί java.net.http.HttpClient.
Στην υλοποίηση JDK 25 που εξετάζεται εδώ, ο κώδικας αιτήματος του πελάτη HTTP δέχεται υποψήφιο HTTP από τον επιλογέα. Ένας υποψήφιος SOCKS δεν τον κάνει να εκτελέσει διαπραγμάτευση SOCKS· η υλοποίηση μπορεί να συνεχίσει χωρίς proxy. Επομένως μια επιτυχής απόκριση δεν αποτελεί επαρκή απόδειξη ότι χρησιμοποιήθηκε η καταχώριση SOCKS ενός προσαρμοσμένου επιλογέα.
Επιλέξτε πρώτα τη μεταφορά
Για μια υπάρχουσα εφαρμογή βασισμένη σε URLConnection, μπορεί να δοθεί στον χειριστή πρωτοκόλλου ένα υποστηριζόμενο ρητό proxy κατά το άνοιγμα της σύνδεσης:
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);
Για επιτρεπόμενες δοκιμές δημόσιων στόχων, χρησιμοποιήστε ένα αντίστοιχο τελικό σημείο SOCKS από την υπηρεσία σας ή από τη λίστα proxy SOCKS. Πρόκειται για διαφορετικό API πελάτη, όχι για εναλλακτική γραφή του HttpClient.Builder.proxy. Διατηρήστε το URL προορισμού ώστε το HTTPS να συνεχίσει να αναγνωρίζει τον επιδιωκόμενο ιστότοπο.
Μια εφαρμογή που πρέπει να διατηρήσει το java.net.http μπορεί αντί αυτού να χρησιμοποιήσει ένα συμβατό τελικό σημείο proxy HTTP, συμπεριλαμβανομένου ενός εγκεκριμένου προσαρμογέα που χειρίζεται την επόμενη σύνδεση SOCKS. Αυτό προσθέτει ένα πραγματικό στοιχείο και ένα ακόμη όριο πρόσβασης· η αλλαγή της θύρας 8080 σε 1080 δεν παρέχει αυτή τη μετάφραση.
Κρατήστε την επιλογή και την υιοθέτηση ορατές
Καταγράψτε και το αποτέλεσμα του επιλογέα και τη σύνδεση που ανοίγει πραγματικά ο πελάτης. Το πρώτο περιγράφει την έξοδο πολιτικής· το δεύτερο καθορίζει αν την υιοθέτησε η υλοποίηση.
Συνδέστε τα συμπεράσματα με το περιβάλλον εκτέλεσης και τη μεταφορά που χρησιμοποιούνται. Οι ιδιότητες SOCKS του JVM που χρησιμοποιεί μια υλοποίηση socket δεν είναι υπόσχεση ότι κάθε βιβλιοθήκη HTTP τις συμβουλεύεται. Όταν η διαδρομή είναι υποχρεωτική, ένας μη υποστηριζόμενος τύπος proxy θα πρέπει να εντοπίζεται πριν γίνει αποδεκτό ένα φαινομενικά επιτυχές άμεσο αίτημα.