Как получить соединение без прокси в 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 установлен.

Ответы на вопрос(1)

Ваш ответ на вопрос