Skip to content

Commit 7e9fc0b

Browse files
committed
[3.12] Fix AsyncResolver not using the loop argument (#10951)
fixes #10787 (cherry picked from commit 12ff66d)
1 parent ab84403 commit 7e9fc0b

File tree

3 files changed

+36
-1
lines changed

3 files changed

+36
-1
lines changed

CHANGES/10951.bugfix.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fixed :py:class:`~aiohttp.resolver.AsyncResolver` not using the ``loop`` argument in versions 3.x where it should still be supported -- by :user:`bdraco`.

aiohttp/resolver.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,8 @@ def __init__(
9393
if aiodns is None:
9494
raise RuntimeError("Resolver requires aiodns library")
9595

96-
self._resolver = aiodns.DNSResolver(*args, **kwargs)
96+
loop = loop or asyncio.get_running_loop()
97+
self._resolver = aiodns.DNSResolver(*args, loop=loop, **kwargs)
9798

9899
if not hasattr(self._resolver, "gethostbyname"):
99100
# aiodns 1.1 is not available, fallback to DNSResolver.query

tests/test_resolver.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,3 +404,36 @@ def test_aio_dns_is_default() -> None:
404404
@pytest.mark.skipif(getaddrinfo, reason="aiodns <3.2.0 required")
405405
def test_threaded_resolver_is_default() -> None:
406406
assert DefaultResolver is ThreadedResolver
407+
408+
409+
@pytest.mark.skipif(aiodns is None, reason="aiodns required")
410+
def test_async_resolver_uses_provided_loop() -> None:
411+
"""Test that AsyncResolver uses the loop parameter when provided."""
412+
# Create a custom event loop
413+
custom_loop = asyncio.new_event_loop()
414+
415+
try:
416+
# Need to set the loop as current for get_running_loop() to work
417+
asyncio.set_event_loop(custom_loop)
418+
419+
# Create resolver with explicit loop parameter
420+
resolver = AsyncResolver(loop=custom_loop)
421+
422+
# Check that the resolver uses the provided loop
423+
assert resolver._resolver.loop is custom_loop
424+
finally:
425+
asyncio.set_event_loop(None)
426+
custom_loop.close()
427+
428+
429+
@pytest.mark.skipif(aiodns is None, reason="aiodns required")
430+
async def test_async_resolver_uses_running_loop_when_none_provided() -> None:
431+
"""Test that AsyncResolver uses get_running_loop() when no loop is provided."""
432+
# Create resolver without loop parameter
433+
resolver = AsyncResolver()
434+
435+
# Check that the resolver uses the current running loop
436+
assert resolver._resolver.loop is asyncio.get_running_loop()
437+
438+
# Clean up
439+
await resolver.close()

0 commit comments

Comments
 (0)