JDK 25 HttpClient не използва SOCKS маршрути от ProxySelector
Изберете Java HTTP транспорт, който наистина поддържа 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 библиотека се допитва до тях. Когато маршрутът е задължителен, неподдържан тип прокси трябва да бъде открит преди приемането на привидно успешна директна заявка.