Python 'Anfragen' Bibliothek - definieren Sie spezifische DNS?

7

In meinem Projekt behandle ich alle HTTP-Anfragen mit Python requests library .

Nun muss ich den HTTP-Server mit einem bestimmten DNS abfragen - es gibt zwei Umgebungen, die jeweils einen eigenen DNS-Server verwenden, und Änderungen werden unabhängig voneinander vorgenommen.

Wenn der Code ausgeführt wird, sollte er daher DNS verwenden, das für die Umgebung spezifisch ist, und nicht das DNS, das in meiner Internetverbindung angegeben ist.

Hat jemand das mit Python-Anfragen versucht? Ich habe nur eine Lösung für urllib2 gefunden:
Ссылка

    
Taku 24.03.2014, 12:28
quelle

2 Antworten

14

requests verwendet urllib3 , das letztlich auch httplib.HTTPConnection verwendet, also die Techniken aus Ссылка (jetzt gelöscht, verlinkt nur mit Teilen Sie urllib2, um benutzerdefinierte DNS zu verwenden ), bis zu einem gewissen Grad noch zutreffen.

Die urllib3.connection Modulunterklassen httplib.HTTPConnection unter dem gleichen Namen, wobei die Methode .connect() durch eine Methode ersetzt wurde, die self._new_conn aufruft. Dies delegiert wiederum an urllib3.util.connection.create_connection() . Es ist vielleicht am einfachsten, diese Funktion zu patchen:

%Vor%

und Sie würden Ihren eigenen Code bereitstellen, um den host -Abschnitt der Adresse in eine IP-Adresse aufzulösen, statt sich auf den connection.create_connection() -Aufruf (der socket.create_connection() umschließt) zu verlassen, um den Hostnamen für Sie aufzulösen.

Achten Sie bei allen Monkey-Anpassungen darauf, dass sich der Code in späteren Versionen nicht wesentlich geändert hat. Der Patch hier wurde gegen urllib3 version 1.21.1 erstellt. sollte aber für Versionen bis 1.9 funktionieren.

Beachten Sie, dass diese Antwort neu geschrieben wurde, um mit neueren urllib3 releases zu arbeiten, die einen viel bequemeren Patch-Ort hinzugefügt haben. Siehe den Bearbeitungsverlauf für die alte Methode, anwendbar auf Version & lt; 1.9, als Patch für die vendored urllib3 -Version anstelle einer eigenständigen Installation.

    
Martijn Pieters 24.03.2014, 15:57
quelle
10

Sie sollten sich die TransportAdapters einschließlich des Quellcodes ansehen. Die Dokumentation zu ihnen ist nicht großartig, aber sie bieten Low-Level-Zugriff auf eine Menge der Funktionalität beschrieben in RFC 2818 und RFC 6125 . Diese Dokumente ermutigen (erfordern?) Insbesondere clientseitigen Code, anwendungsspezifisches DNS zu unterstützen, um den CommonName und den SubjectAltName der Zertifikate zu überprüfen. Das Schlüsselwortargument, das Sie in diesen Aufrufen benötigen, ist "assert_hostname". So legen Sie es mit der Anforderungsbibliothek fest:

%Vor%

Ich verwende common_name für den Namen, der auf dem Zertifikat erwartet wird, und wie Ihr Code den gewünschten Rechner referenziert. Ich verwende host für einen Namen, der von der externen Welt erkannt wird - FQDN, IP, DNS-Eintrag, ... Natürlich muss das SSL_OPTIONS-Wörterbuch (in meinem Beispiel) die entsprechenden Zertifikats- / Schlüsseldateinamen auf Ihrem Computer auflisten. (Außerdem sollten NAME und PASSWORD die Zeichenfolgen korrigieren.)

    
Sarah Messer 20.10.2014 19:34
quelle