2015-11-06 28 views
7

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.

+1

Penso che si possa anche impostare 'ProxySelector.setDefault (null);'. Ciò consentirà la connessione diretta. – Tunaki

+0

@Tunaki. Sfortunatamente ciò spegnerà ProxySelector completamente e per * tutte * le connessioni. – peterh

+1

Il fatto che le connessioni dirette passino attraverso 'ProxySelector' è un dettaglio di implementazione. Perché ti interessi? Hai un * problema * reale? – EJP

risposta