Я пытаюсь заставить Socks v4 работать из коробки в java. net, и, похоже, мне это удалось! Обычно я использую следующий код:
class SocketImplFactorySocks4 implements SocketImplFactory {
@Override
public SocketImpl createSocketImpl() {
System.out.println("Socket implementation triggered");
try {
return socketSocks4Factory();
} catch (Exception e) {
e.printStackTrace();
throw new Error("Can't go further");
}
}
private SocketImpl socketSocks4Factory() throws
[...] {
Class<?> aClass = Class.forName("java.net.SocksSocketImpl");
Constructor<?> cons = aClass.getDeclaredConstructor();
if (!cons.isAccessible())
cons.setAccessible(true);
Object socket = cons.newInstance();
Method method = socket.getClass().getDeclaredMethod("setV4");
if (!method.isAccessible())
method.setAccessible(true);
method.invoke(socket);
Field field = socket.getClass().getDeclaredField("useV4");
field.setAccessible(true);
Object value = field.get(socket);
return (SocketImpl) socket;
}
}
Короче говоря, он работает, когда я создаю сокет и передаю -DsocksProxyHost и -DsocksProxyPort.
Моя проблема заключается в том, что я используйте тот же код в моем тесте junit, я могу проверить с помощью Reflections, что Socket.impl.useV4 имеет значение true, настройки socksProxy * установлены в масштабе всей системы, но когда я использую свой сокет, он вообще не использует прокси (я вижу это в wireshark).
Это либо JUnit, либо Gradle, но я достиг своих пределов. Пожалуйста, совет, где я должен go дальше. build.gradle.kts для справки:
tasks{
test{
systemProperty("socksProxyHost", "localhost")
systemProperty("socksProxyPort", "8080")
}
}
Заранее спасибо!