2014-09-04 11 views
5

Gestisco molti proxy HTTPS (sono proxy che hanno una propria connessione SSL). Sto creando uno strumento diagnostico in python che tenta di connettersi a una pagina tramite ciascun proxy e inviarmi un'e-mail se non riesce a connettersi attraverso uno di essi.Testare un proxy HTTPS in python

Il modo in cui ho deciso di fare questo è di usare urllib per connettersi attraverso ogni proxy e restituire una pagina che dovrebbe dire "successo" con il codice sottostante.

def fetch(url): 
    connection = urllib.urlopen(
    url, 
    proxies={'http':"https://"+server+':443'} 
    ) 
    return connection.read() 


print fetch(testURL) 

Questa recupera Vorrei chiedere alla perfezione il problema è che sarà ancora prendere Vorrei chiedere anche se le informazioni del server proxy non è corretto o il server proxy è inattivo. Quindi o non usa mai il server proxy o lo prova e si connette senza di esso quando fallisce.

Come posso risolvere questo?

Modifica: nessuno sembra sapere come farlo. Inizierò a leggere le altre librerie di lingue per vedere se riescono a gestirle meglio. Qualcuno sa se è più semplice in un'altra lingua come Go?

Edit: Ho appena scritto questo in un commento qui sotto, ma penso che potrebbe essere un equivoco andare in giro. "Il proxy ha la propria connessione SSL, quindi se vado su google.com, prima faccio uno scambio di chiavi con foo.com e poi un altro con l'indirizzo di destinazione bar.com o l'indirizzo di destinazione baz.com La destinazione non lo fa t devono essere https, il proxy è https "

risposta

1

Presumo che non funzioni per richieste https. È corretto? Se sì, il codice precedente definisce un proxy solo per http. Prova ad aggiungere per https:

proxies={'https':"https://"+server+':443'}

Un'altra opzione è quella di utilizzare il modulo python requests invece di urllib. Date un'occhiata a http://docs.python-requests.org/en/latest/user/advanced/#proxies

+0

ho provato. Non ha aiutato. Quale sarebbe il vantaggio delle richieste in questo scenario? –

+0

Ok, quindi l'ho eseguito sul mio ambiente utilizzando un'acquisizione di pacchetti e mostra che urllib non sta inviando una richiesta CONNECT al proxy che non è corretta. Ho quindi letto https://docs.python.org/2/howto/urllib2.html che afferma che "Attualmente urllib2 non supporta il recupero di posizioni https tramite un proxy. Tuttavia, questo può essere abilitato estendendo urllib2 come mostrato nel ricetta http://code.activestate.com/recipes/456195. Ho suggerito di richiedere il modulo python in quanto sembra più semplice e facile da usare che cerca di raggiungere questo obiettivo usando urllib – Yuvika

0

Come su un timeout? Se il proxy non riesce a connettersi entro 30 sec, allora dovrebbe essere notato come non connesso.

def fetch(url, server): 
proxy_handler = urllib2.ProxyHandler({'http':'https://'+server+':443'}) 
opener = urllib2.build_opener(proxy_handler, urllib2.HTTPHandler(debuglevel=0)) 
urllib2.install_opener(opener) 

try: 
    response = opener.open(url, timeout = 30) 
    return response.read() 
except: 
    print "Can't connect with proxy %s" % (server) 

print fetch(url,serverIp) 

È possibile cambiare la debuglevel = 1 per vedere i dettagli della connessione

Io lo uso per i proxy a livello mondiale e con la mia connessione internet è 30 sec max timeout di sapere se ho collegato o meno. Nei miei test se la connessione è più lunga di 30 secondi è sempre stato un fallimento.

2

La maggior parte delle persone a capire https proxy come proxy che capisca CONNECT richiesta. Il mio esempio crea una connessione ssl diretta.

try: 
    import http.client as httplib # for python 3.2+ 
except ImportError: 
    import httplib # for python 2.7 


con = httplib.HTTPSConnection('proxy', 443) # create proxy connection 
# download http://example.com/ through proxy 
con.putrequest('GET', 'http://example.com/', skip_host=True) 
con.putheader('Host', 'example.com') 
con.endheaders() 
res = con.getresponse() 
print(res.read()) 

Se il proxy è reverse proxy quindi modificare

con.putrequest('GET', 'http://example.com/', skip_host=True) 

a

con.putrequest('GET', '/', skip_host=True)`