Как получить соединение без прокси в Java?
Как мне избежать прохожденияProxySelector
при установлении соединения сURLConnection
или, скорее, как получить гарантированное соединение без каких-либо прокси, о которых Java знает?
Я думал, что это было то, чтоProxy.NO_PROXY был для. Цитата из Javadoc:
Параметр прокси-сервера, представляющий прямое соединение, который, в основном, указывает обработчику протокола не использовать прокси
Тем не менее, такое соединение все равно будет проходить через ProxySelector. Я не понимаю ??
Я сделал небольшой тест, чтобы доказать свою точку зрения:
public static void main(String[] args) throws MalformedURLException, IOException {
ProxySelector.setDefault(new MyProxySelector());
URL url = new URL("http://foobar.com/x1/x2");
URLConnection connection = url.openConnection(Proxy.NO_PROXY);
connection.connect();
}
и фиктивный ProxySelector, который ничего не делает, кроме как регистрирует происходящее:
public class MyProxySelector extends ProxySelector {
@Override
public List<Proxy> select(URI uri) {
System.out.println("MyProxySelector called with URI = " + uri);
return Collections.singletonList(Proxy.NO_PROXY);
}
@Override
public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {}
}
который печатает:
"MyProxySelector called with URI = socket://foobar.com:80"
(Обратите внимание, как протокол изменился сhttp
вsocket
)
Конечно, я могу создать свой ProxySelector таким образом, чтобы он всегда возвращалсяProxy.NO_PROXY
если схема URIsocket
но я думаю, что будут случаи, когда на сайте есть прокси-сервер SOCKS, и тогда это не будет правдой.
Позвольте мне повторить вопрос: мне нужен способ убедиться, чтоURLConnection
не использует прокси, независимо от того, какие свойства системы могут быть установлены или какой ProxySelector установлен.