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:
Ссылка
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:
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.
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.)
Tags und Links python http dns python-requests urllib