]> git.ipfire.org Git - thirdparty/dnspython.git/commitdiff
Avoid instantiating Resolver when it is not necessary for DoH (#1123)
authorURenko <18209292+URenko@users.noreply.github.com>
Wed, 28 Aug 2024 13:42:57 +0000 (13:42 +0000)
committerGitHub <noreply@github.com>
Wed, 28 Aug 2024 13:42:57 +0000 (06:42 -0700)
* Avoid instantiating Resolver when bootstrap_address is present for DoH

* Avoid instantiating Resolver when hostname is ip address for DoH

dns/_asyncio_backend.py
dns/_trio_backend.py
dns/asyncquery.py
dns/query.py

index 0c5e3bf8f8181e42f8c7c366320de23143efd734..7ab162427d742f59f71dca109b0ebdb4b4a460db 100644 (file)
@@ -197,7 +197,7 @@ if dns._features.have("doh"):
             family=socket.AF_UNSPEC,
             **kwargs,
         ):
-            if resolver is None:
+            if resolver is None and bootstrap_address is None:
                 # pylint: disable=import-outside-toplevel,redefined-outer-name
                 import dns.asyncresolver
 
index 1d2bdda981a0581e4a6d26b952455c0b17bb8a57..0ed904ddcf13a544630c3bd1b8176d50cba32a98 100644 (file)
@@ -174,7 +174,7 @@ if dns._features.have("doh"):
             family=socket.AF_UNSPEC,
             **kwargs,
         ):
-            if resolver is None:
+            if resolver is None and bootstrap_address is None:
                 # pylint: disable=import-outside-toplevel,redefined-outer-name
                 import dns.asyncresolver
 
index 05163fa9d7097ff38d514cf2e62b6ce3c7fa6aad..b93e267dde884819c0669621139d072d79f2f908 100644 (file)
@@ -560,21 +560,23 @@ async def https(
     else:
         url = where
 
+    if bootstrap_address is None:
+        parsed = urllib.parse.urlparse(url)
+        if parsed.hostname is None:
+            raise ValueError("no hostname in URL")
+        if dns.inet.is_address(parsed.hostname):
+            bootstrap_address = parsed.hostname
+        if parsed.port is not None:
+            port = parsed.port
+
     if http_version == HTTPVersion.H3 or (
         http_version == HTTPVersion.DEFAULT and not have_doh
     ):
         if bootstrap_address is None:
-            parsed = urllib.parse.urlparse(url)
             resolver = _maybe_get_resolver(resolver)
-            if parsed.hostname is None:
-                raise ValueError("no hostname in URL")
-            if dns.inet.is_address(parsed.hostname):
-                bootstrap_address = parsed.hostname
-            else:
-                answers = await resolver.resolve_name(parsed.hostname, family)
-                bootstrap_address = random.choice(list(answers.addresses()))
-            if parsed.port is not None:
-                port = parsed.port
+            assert parsed.hostname is not None  # for mypy
+            answers = await resolver.resolve_name(parsed.hostname, family)
+            bootstrap_address = random.choice(list(answers.addresses()))
         return await _http3(
             q,
             bootstrap_address,
index 4af4eb23475f5a99dd381c4d550d6fcf7b175d49..1880a3f35eea1455bb9f09cc2e98223f0777a7d8 100644 (file)
@@ -131,7 +131,7 @@ if _have_httpx:
             family=socket.AF_UNSPEC,
             **kwargs,
         ):
-            if resolver is None:
+            if resolver is None and bootstrap_address is None:
                 # pylint: disable=import-outside-toplevel,redefined-outer-name
                 import dns.resolver
 
@@ -449,21 +449,23 @@ def https(
     else:
         url = where
 
+    if bootstrap_address is None:
+        parsed = urllib.parse.urlparse(url)
+        if parsed.hostname is None:
+            raise ValueError("no hostname in URL")
+        if dns.inet.is_address(parsed.hostname):
+            bootstrap_address = parsed.hostname
+        if parsed.port is not None:
+            port = parsed.port
+
     if http_version == HTTPVersion.H3 or (
         http_version == HTTPVersion.DEFAULT and not have_doh
     ):
         if bootstrap_address is None:
-            parsed = urllib.parse.urlparse(url)
             resolver = _maybe_get_resolver(resolver)
-            if parsed.hostname is None:
-                raise ValueError("no hostname in URL")
-            if dns.inet.is_address(parsed.hostname):
-                bootstrap_address = parsed.hostname
-            else:
-                answers = resolver.resolve_name(parsed.hostname, family)
-                bootstrap_address = random.choice(list(answers.addresses()))
-            if parsed.port is not None:
-                port = parsed.port
+            assert parsed.hostname is not None  # for mypy
+            answers = resolver.resolve_name(parsed.hostname, family)
+            bootstrap_address = random.choice(list(answers.addresses()))
         return _http3(
             q,
             bootstrap_address,