From: URenko <18209292+URenko@users.noreply.github.com> Date: Wed, 28 Aug 2024 13:42:57 +0000 (+0000) Subject: Avoid instantiating Resolver when it is not necessary for DoH (#1123) X-Git-Tag: v2.7.0rc1~21 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=3f4bf3d562deebf5f54f7e662fab53be7294e461;p=thirdparty%2Fdnspython.git Avoid instantiating Resolver when it is not necessary for DoH (#1123) * Avoid instantiating Resolver when bootstrap_address is present for DoH * Avoid instantiating Resolver when hostname is ip address for DoH --- diff --git a/dns/_asyncio_backend.py b/dns/_asyncio_backend.py index 0c5e3bf8..7ab16242 100644 --- a/dns/_asyncio_backend.py +++ b/dns/_asyncio_backend.py @@ -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 diff --git a/dns/_trio_backend.py b/dns/_trio_backend.py index 1d2bdda9..0ed904dd 100644 --- a/dns/_trio_backend.py +++ b/dns/_trio_backend.py @@ -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 diff --git a/dns/asyncquery.py b/dns/asyncquery.py index 05163fa9..b93e267d 100644 --- a/dns/asyncquery.py +++ b/dns/asyncquery.py @@ -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, diff --git a/dns/query.py b/dns/query.py index 4af4eb23..1880a3f3 100644 --- a/dns/query.py +++ b/dns/query.py @@ -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,