Anfragen library https-get über proxy führt zu error
Senden möchten, einen einfachen get-request über einen proxy. Ich habe die "Proxy-Authorization' und 'Authorization' - Header, glaube nicht, ich brauchte die 'Authorization' - header, aber hat es trotzdem.
import requests
URL = 'https://www.google.com'
sess = requests.Session()
user = 'someuser'
password = 'somepass'
token = base64.encodestring('%s:%s'%(user,password)).strip()
sess.headers.update({'Proxy-Authorization':'Basic %s'%token})
sess.headers['Authorization'] = 'Basic %s'%token
resp = sess.get(URL)
Bekomme ich die folgende Fehlermeldung:
requests.packages.urllib3.exceptions.ProxyError: Cannot connect to proxy. Socket error: Tunnel connection failed: 407 Proxy Authentication Required.
Jedoch wenn ich die URL auf einfache http://www.google.com
es funktioniert gut.
Tun Proxys verwenden Sie Basic -, Digest-oder eine andere Art der Authentifizierung für https? Ist es die proxy-server-spezifisch ist? Wie kann ich entdecken, dass die info? Ich brauche, um dies zu erreichen mit den Anforderungen der Bibliothek.
UPDATE
Sein scheint, dass mit HTTP-Anfragen, die wir zu Durchlaufen haben, in einer Proxy-Authorization
header, aber mit HTTPS-Anforderungen, die wir brauchen, um format der proxy-URL mit username und Passwort
#HTTP
import requests, base64
URL = 'http://www.google.com'
user = <username>
password = <password>
proxy = {'http': 'http://<IP>:<PORT>}
token = base64.encodestring('%s:%s' %(user, password)).strip()
myheader = {'Proxy-Authorization': 'Basic %s' %token}
r = requests.get(URL, proxies = proxies, headers = myheader)
print r.status_code # 200
#HTTPS
import requests
URL = 'https://www.google.com'
user = <username>
password = <password>
proxy = {'http': 'http://<user>:<password>@<IP>:<PORT>}
r = requests.get(URL, proxies = proxy)
print r.status_code # 200
Beim senden eines HTTP-request, wenn ich Sie aus dem Kopf und übergeben Sie einen proxy-formatiert mit user/pass, bekomme ich einen 407-Antwort.
Beim senden einer HTTPS-Anforderung, wenn ich den pass in der überschrift und lassen Sie die unformatierte proxy bekomme ich eine ProxyError erwähnt.
Ich bin mit Anfragen 2.0.0, und ein Squid proxy-caching web server. Warum funktioniert der header-option Arbeit für HTTPS? Warum wird der formatierte proxy nicht für HTTP?
InformationsquelleAutor mingxiao | 2013-10-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Antwort ist, dass der HTTP-Fall ist verbuggt. Das erwartete Verhalten in diesem Fall ist der gleiche wie der HTTPS-Fall:,, geben Sie Ihre Anmeldeinformationen für die Authentifizierung bei der proxy-URL.
Den Grund der header-option funktioniert nicht für HTTPS ist, die über HTTPS-proxies ist völlig anders über HTTP-proxies. Wenn Sie route eine HTTP-Anforderung über einen proxy, den du im wesentlichen nur einen standard-HTTP-Anfrage an den proxy mit einem Pfad, der angibt, einer völlig anderen host, so wie hier:
Den proxy dann im Grunde leitet diese auf.
Für HTTPS, können Sie möglicherweise nicht arbeiten, weil Sie brauchen, um zu verhandeln, die eine SSL-Verbindung mit dem remote-server. Anstatt etwas zu tun, wie der HTTP-Fall verwenden Sie das VERBINDEN-verb. Der proxy-server eine Verbindung zu dem entfernten Ende auf den Namen des Kunden, und von Ihnen nur proxies die TCP-Daten. (Mehr Informationen hier.)
Beim anfügen eines
Proxy-Authorization
header auf die HTTPS-Anforderung, die wir nicht setzen es auf die CONNECT-Nachricht, wir setzen es auf die HTTPS getunnelt Nachricht. Dies bedeutet, dass die proxy-nie sieht es, so verweigert Sie Ihre Verbindung. Wir Spezial-Fall der Authentifizierung Informationen in die proxy-URL, um sicherzustellen, dass es fügt die header richtig, um die Meldung CONNECT.Anfragen und urllib3 sind derzeit in der Diskussion um den richtigen Platz für das bug-fix zu gehen. Die GitHub-Problem ist derzeit hier. Ich erwarte, dass der fix wird im nächsten release Anfragen.
InformationsquelleAutor Lukasa