Como obter uma conexão sem proxy em Java?
Como evito passar peloProxySelector
ao fazer uma conexão comURLConnection
ou melhor, como obter uma conexão garantida livre de quaisquer proxies que o Java conheça?
Eu pensei que era issoProxy.NO_PROXY era para. Citando o Javadoc:
Uma configuração de proxy que representa uma conexão DIRETA, basicamente dizendo ao manipulador de protocolo para não usar nenhum proxy
No entanto, essa conexão ainda passará pelo ProxySelector. Eu não entendi?
Fiz um pequeno teste para provar meu argumento:
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();
}
e um ProxySelector fictício que não faz nada além de registrar o que está acontecendo:
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) {}
}
que imprime:
"MyProxySelector called with URI = socket://foobar.com:80"
(Observe como o protocolo mudou dehttp
parasocket
)
É claro que posso criar meu ProxySelector de tal maneira que ele sempre retorneProxy.NO_PROXY
se o esquema de URI forsocket
mas acho que haveria ocasiões em que houvesse um proxy SOCKS no site e isso não seria verdade.
Permitam-me reafirmar a pergunta: preciso de uma maneira de garantir que um específicoURLConnection
não usa um proxy, independentemente de quais propriedades do sistema possam ser definidas ou de que ProxySelector está instalado.