import dns.rdataclass
import dns.rdatatype
-import requests
-from requests_toolbelt.adapters.source import SourceAddressAdapter
-from requests_toolbelt.adapters.host_header_ssl import HostHeaderSSLAdapter
+try:
+ import requests
+ from requests_toolbelt.adapters.source import SourceAddressAdapter
+ from requests_toolbelt.adapters.host_header_ssl import HostHeaderSSLAdapter
+ have_doh = True
+except ImportError:
+ have_doh = False
+
try:
import ssl
self.rcode = rcode
+class NoDOH(dns.exception.DNSException):
+ """DNS over HTTPS (DOH) was requested but the requests module is not
+ available."""
+
+
def _compute_expiration(timeout):
if timeout is None:
return None
:param lifetime: timeout (in seconds)
:return: a :class:`requests.models.Response` object.
"""
+ if not have_doh:
+ raise NoDOH
if isinstance(what, requests.models.Request):
what = what.prepare()
return session.send(what, timeout=lifetime)
Returns a ``dns.message.Message``.
"""
+ if not have_doh:
+ raise NoDOH
+
wire = q.to_wire()
(af, destination, source) = _destination_and_source(af, where, port,
source, source_port,
--------------------
.. autoexception:: dns.query.BadResponse
+.. autoexception:: dns.query.NoDOH
.. autoexception:: dns.query.UnexpectedSource
.. autoexception:: dns.query.TransferError
'python_requires': '>=3.4',
'test_suite': 'tests',
'provides': ['dns'],
- 'install_requires': ['requests', 'requests-toolbelt'],
'tests_require': ['typing ; python_version<"3.5"'],
'extras_require': {
+ 'DOH': ['requests', 'requests-toolbelt'],
'IDNA': ['idna>=2.1'],
'DNSSEC': ['cryptography>=2.6'],
},
'https://dns.google/dns-query',
'https://dns11.quad9.net/dns-query']
+@unittest.skipUnless(dns.query.have_doh,
+ "Python requests cannot be imported; no DNS over HTTPS (DOH)")
class DNSOverHTTPSTestCase(unittest.TestCase):
def setUp(self):
self.session = requests.sessions.Session()