JDK 25 HttpClient не выкарыстоўвае маршруты SOCKS з ProxySelector
Выбірайце HTTP-транспарт для Java, які сапраўды падтрымлівае SOCKS, замест таго каб спадзявацца толькі на тып, які вяртае ProxySelector.
Java-аб'ект проксі апісвае маршрут. Сеткавы кліент усё ж сам вырашае, якія віды маршрутаў ён можа выкарыстоўваць. Гэта важна, калі даступная канчатковая кропка гаворыць па SOCKS, а праграма выкарыстоўвае java.net.http.HttpClient.
У разгледжанай тут рэалізацыі JDK 25 код запыту HTTP-кліента прымае HTTP-кандыдата ад селектара. Кандыдат SOCKS не прымушае яго праводзіць SOCKS-перамовы; рэалізацыя можа працягваць без проксі. Таму паспяховы адказ яшчэ не даказвае, што запіс SOCKS карыстальніцкага селектара быў выкарыстаны.
Спачатку выберыце транспарт
Для існуючай праграмы на аснове URLConnection апрацоўшчыку пратакола можна перадаць падтрыманы явны проксі пры адкрыцці злучэння:
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 з вашага сэрвісу або са спісу SOCKS-проксі. Гэта іншы кліенцкі API, а не альтэрнатыўнае напісанне HttpClient.Builder.proxy. Захоўвайце URL прызначэння, каб HTTPS і далей вызначаў патрэбны сайт.
Праграма, якая павінна захаваць java.net.http, можа замест гэтага выкарыстоўваць сумяшчальную канчатковую кропку HTTP-проксі, уключаючы ўхвалены адаптар, які бярэ на сябе далейшае SOCKS-злучэнне. Гэта дадае рэальны кампанент і яшчэ адну мяжу доступу; змена порта 8080 на 1080 не дае гэтага пераўтварэння.
Трымайце выбар і прыняцце бачнымі
Запісвайце і вынік селектара, і злучэнне, якое кліент фактычна адкрывае. Першае апісвае выхад палітыкі; другое ўстанаўлівае, ці прыняла яго рэалізацыя.
Звязвайце высновы з асяроддзем выканання і транспартам, якія выкарыстоўваюцца. Уласцівасці JVM SOCKS, якія выкарыстоўвае адна рэалізацыя сокета, не абяцаюць, што кожная HTTP-бібліятэка да іх звяртаецца. Калі маршрут абавязковы, непадтрыманы тып проксі павінен выяўляцца да прыняцця выглядна паспяховага прамога запыту.