Come evitare di passare attraverso lo ProxySelector
quando si effettua una connessione con URLConnection
o meglio come ottenere una connessione garantita da qualsiasi proxy a conoscenza di Java?Come ottenere una connessione senza proxy in Java?
Ho pensato che questo era il motivo per cui era Proxy.NO_PROXY. Citando dal Javadoc:
Un'impostazione proxy che rappresenta un collegamento diretto, in sostanza dicendo il gestore di protocollo non utilizzare alcun proxy
Eppure una tale connessione sarà ancora passare attraverso il ProxySelector. Non capisco ??
ho fatto un piccolo test per dimostrare il mio punto:
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 un ProxySelector manichino, che non fa altro che registrare quello che sta succedendo:
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) {}
}
che stampa:
"MyProxySelector called with URI = socket://foobar.com:80"
(Nota come il protocollo è cambiato da http
a socket
)
Posso ovviamente creare il mio ProxySelector in modo tale che restituisca sempre Proxy.NO_PROXY
se lo schema URI è socket
ma suppongo che ci siano occasioni in cui c'è un proxy SOCKS sul sito e quindi non sarebbe vero .
Permettetemi di riaffermare la domanda: ho bisogno di un modo per assicurarmi che uno specifico URLConnection
non usi un proxy, indipendentemente da quale Proprietà di sistema può essere impostata o da cosa ProxySelector è installato.
Penso che si possa anche impostare 'ProxySelector.setDefault (null);'. Ciò consentirà la connessione diretta. – Tunaki
@Tunaki. Sfortunatamente ciò spegnerà ProxySelector completamente e per * tutte * le connessioni. – peterh
Il fatto che le connessioni dirette passino attraverso 'ProxySelector' è un dettaglio di implementazione. Perché ti interessi? Hai un * problema * reale? – EJP