How do I avoid going through the ProxySelector
when making a connection with URLConnection
or rather how to get a connection guaranteed free of whatever proxies Java knows about ?
I thought this was what Proxy.NO_PROXY was for. Quoting from the Javadoc:
A proxy setting that represents a DIRECT connection, basically telling the protocol handler not to use any proxying
Yet such a connection will still go through the ProxySelector. I don't get it ??
I've made a small test to prove my point:
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();
}
and a dummy ProxySelector which does nothing but log what is going on:
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) {}
}
which prints:
"MyProxySelector called with URI = socket://foobar.com:80"
(Note how the protocol has changed from http
to socket
)
I can of course create my ProxySelector in such a way so that it always returns Proxy.NO_PROXY
if the URI scheme is socket
but I guess there would be occasions where there's a SOCKS proxy on the site and then it wouldn't be true.
Let me restate the question: I need a way to make sure a specific URLConnection
doesn't use a proxy, regardless of what System Properties may be set or what ProxySelector is installed.
This is tracked as JDK bug 8144008.