From dbaa8170bc71a53f0874cc9fce0e1ff0719219cf Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Thu, 10 Oct 2024 10:28:10 -0500 Subject: [PATCH 1/2] [3.11] Fix AsyncResolver query fallback swallowing the error message Same change as #9451 but for the query fallback code for older versions of aiodns --- aiohttp/resolver.py | 4 ++-- tests/test_resolver.py | 30 ++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/aiohttp/resolver.py b/aiohttp/resolver.py index 5240bfbd8d..a988b0bf47 100644 --- a/aiohttp/resolver.py +++ b/aiohttp/resolver.py @@ -159,7 +159,7 @@ async def _resolve_with_query( resp = await self._resolver.query(host, qtype) except aiodns.error.DNSError as exc: msg = exc.args[1] if len(exc.args) >= 1 else "DNS lookup failed" - raise OSError(msg) from exc + raise OSError(None, msg) from exc hosts = [] for rr in resp: @@ -175,7 +175,7 @@ async def _resolve_with_query( ) if not hosts: - raise OSError("DNS lookup failed") + raise OSError(None, "DNS lookup failed") return hosts diff --git a/tests/test_resolver.py b/tests/test_resolver.py index 842618c305..b460606707 100644 --- a/tests/test_resolver.py +++ b/tests/test_resolver.py @@ -332,6 +332,36 @@ async def test_async_resolver_query_ipv6_positive_lookup(loop) -> None: mock().query.assert_called_with("www.python.org", "AAAA") +@pytest.mark.skipif(not getaddrinfo, reason="aiodns >=3.2.0 required") +async def test_async_resolver_query_fallback_error_messages_passed( + loop: asyncio.AbstractEventLoop, +) -> None: + """Ensure error messages are passed through from aiodns with query fallback.""" + with patch("aiodns.DNSResolver", autospec=True, spec_set=True) as mock: + del mock().gethostbyname + mock().query.side_effect = aiodns.error.DNSError(1, "Test error message") + resolver = AsyncResolver() + with pytest.raises(OSError, match="Test error message") as excinfo: + await resolver.resolve("x.org") + + assert excinfo.value.strerror == "Test error message" + + +@pytest.mark.skipif(not getaddrinfo, reason="aiodns >=3.2.0 required") +async def test_async_resolver_query_fallback_error_messages_passed_no_hosts( + loop: asyncio.AbstractEventLoop, +) -> None: + """Ensure error messages are passed through from aiodns with query fallback.""" + with patch("aiodns.DNSResolver", autospec=True, spec_set=True) as mock: + del mock().gethostbyname + mock().query.return_value = fake_query_result([]) + resolver = AsyncResolver() + with pytest.raises(OSError, match="DNS lookup failed") as excinfo: + await resolver.resolve("x.org") + + assert excinfo.value.strerror == "DNS lookup failed" + + @pytest.mark.skipif(not getaddrinfo, reason="aiodns >=3.2.0 required") async def test_async_resolver_error_messages_passed( loop: asyncio.AbstractEventLoop, From fc8d676d5701002f1f3c8c4174075d1157564f52 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Thu, 10 Oct 2024 10:28:55 -0500 Subject: [PATCH 2/2] changelog --- CHANGES/9455.bugfix.rst | 1 + 1 file changed, 1 insertion(+) create mode 120000 CHANGES/9455.bugfix.rst diff --git a/CHANGES/9455.bugfix.rst b/CHANGES/9455.bugfix.rst new file mode 120000 index 0000000000..da8457a1de --- /dev/null +++ b/CHANGES/9455.bugfix.rst @@ -0,0 +1 @@ +9451.bugfix.rst \ No newline at end of file