]> git.ipfire.org Git - thirdparty/dnspython.git/commitdiff
send_https() and test for it 405/head
authorkimbo <kimballleavitt@gmail.com>
Mon, 30 Dec 2019 23:22:51 +0000 (16:22 -0700)
committerkimbo <kimballleavitt@gmail.com>
Mon, 30 Dec 2019 23:22:51 +0000 (16:22 -0700)
dns/query.py
tests/test_doh.py

index 8f4b1c256daadf31f10e134e726db7c3ae4cf5a4..c36248e3c6b05ca2b297e109c3423d7913720c74 100644 (file)
@@ -38,6 +38,7 @@ import dns.rcode
 import dns.rdataclass
 import dns.rdatatype
 
+import requests
 from requests_toolbelt.adapters.source import SourceAddressAdapter
 from requests_toolbelt.adapters.host_header_ssl import HostHeaderSSLAdapter
 
@@ -210,6 +211,19 @@ def _destination_and_source(af, where, port, source, source_port):
             source = (source, source_port, 0, 0)
     return (af, destination, source)
 
+def send_https(session, what, lifetime=None):
+    """
+    :param session: a :class:`requests.sessions.Session`
+    :param what: a :class:`requests.models.Request` or
+    :class:`requests.models.PreparedRequest`.
+    If it's a :class:`requests.models.Request`, it will be converted
+     into a :class:`requests.models.PreparedRequest`.
+    :param lifetime: timeout (in seconds)
+    :return: a :class:`requests.models.Response` object.
+    """
+    if isinstance(what, requests.models.Request):
+        what = what.prepare()
+    return session.send(what, timeout=lifetime)
 
 def https(q, where, session, timeout=None, port=443, path='/dns-query', post=True,
           bootstrap_address=None, verify=True, source=None, source_port=0,
index 481ca0c076179cabc0684d64359fe4cf8a6604a0..3819b1a4d6569f941ddaf57c7bac2842b1fa7271 100644 (file)
@@ -14,6 +14,7 @@
 # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
 # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+import base64
 import unittest
 import random
 
@@ -68,5 +69,15 @@ class DNSOverHTTPSTestCase(unittest.TestCase):
         r = dns.query.https(q, valid_tls_url, self.session, bootstrap_address=ip)
         self.assertTrue(q.is_response(r))
 
+    def test_send_https(self):
+        q = dns.message.make_query('example.com.', dns.rdatatype.A)
+        wire = q.to_wire()
+        query_string = '?dns={}'.format(base64.urlsafe_b64encode(wire).decode('utf-8').strip("="))
+        request = requests.models.Request('GET', 'https://cloudflare-dns.com/dns-query{}'.format(query_string))
+        r = request.prepare()
+        response = dns.query.send_https(self.session, r)
+        dns_resp = dns.message.from_wire(response.content)
+        self.assertTrue(q.is_response(dns_resp))
+
 if __name__ == '__main__':
     unittest.main()