Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix AsyncResolver to match ThreadedResolver behavior #8270

Merged
merged 46 commits into from
Apr 5, 2024
Merged
Changes from 1 commit
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
a6b09c3
Fix AsyncResolver to match ThreadedResolver behavior
bdraco Mar 30, 2024
d512342
fixes
bdraco Mar 30, 2024
13ff9cf
fix tests
bdraco Mar 30, 2024
28d3651
fix tests
bdraco Mar 30, 2024
b17c087
use async api
bdraco Mar 30, 2024
67e99e7
avoid looped runtime construction of enums
bdraco Mar 30, 2024
763f26e
typing
bdraco Mar 30, 2024
1c22202
match actual signature
bdraco Mar 30, 2024
8fbc80d
match actual signature
bdraco Mar 30, 2024
692b599
match actual signature
bdraco Mar 30, 2024
88bd82c
match actual signature
bdraco Mar 30, 2024
8aec247
match actual signature
bdraco Mar 30, 2024
f90cbab
typing
bdraco Mar 30, 2024
19d9019
link local
bdraco Mar 30, 2024
23824d9
link local threaded
bdraco Mar 30, 2024
7c4d0b1
preen
bdraco Mar 30, 2024
2d2d33d
Merge remote-tracking branch 'upstream/master' into aiodns_fixes
bdraco Mar 30, 2024
c05fea7
typing
bdraco Mar 30, 2024
4c858a6
typing
bdraco Mar 30, 2024
71d96b3
>=3.9.0 required for scope_id
bdraco Mar 31, 2024
ea7cb59
remove unreachable code
bdraco Mar 31, 2024
68cddb1
remove unreachable code
bdraco Mar 31, 2024
97a3ea9
remove unreachable code
bdraco Mar 31, 2024
10ee0e1
Bump aiodns to 3.2.0+
bdraco Mar 31, 2024
c8527a6
changes
bdraco Mar 31, 2024
df90484
changes
bdraco Mar 31, 2024
420e170
changes
bdraco Mar 31, 2024
8ed7095
Update CHANGES/8270.bugfix.rst
bdraco Mar 31, 2024
d2db4b0
adjust
bdraco Mar 31, 2024
a909646
Merge remote-tracking branch 'upstream/aiodns_fixes' into aiodns_fixes
bdraco Mar 31, 2024
c61211c
fix typo
bdraco Mar 31, 2024
dd7bd22
missed some
bdraco Mar 31, 2024
4f49265
tweak changes
bdraco Mar 31, 2024
3d5175f
resolvers are currently not documented
bdraco Mar 31, 2024
aa1f2e5
Update docs/conf.py
bdraco Mar 31, 2024
4347ba2
fixes from manual testing - fix tuple construction
bdraco Mar 31, 2024
e2974d5
Merge remote-tracking branch 'upstream/aiodns_fixes' into aiodns_fixes
bdraco Mar 31, 2024
9ca6a96
add Abstract Resolver
bdraco Mar 31, 2024
9ea1eb4
no autoclass
bdraco Mar 31, 2024
f9120e7
no autoclass
bdraco Mar 31, 2024
a1e592d
missing .
bdraco Mar 31, 2024
4606536
spelling
bdraco Mar 31, 2024
ce0f58a
Merge branch 'master' into aiodns_fixes
bdraco Mar 31, 2024
0516042
Update conf.py
bdraco Mar 31, 2024
009e3c6
Merge branch 'master' into aiodns_fixes
bdraco Apr 2, 2024
c3e3f40
Merge branch 'master' into aiodns_fixes
bdraco Apr 2, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 36 additions & 6 deletions aiohttp/resolver.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import asyncio
import socket
from typing import Any, Dict, List, Type, Union
from typing import Any, Dict, List, Tuple, Type, Union

from .abc import AbstractResolver

Expand Down Expand Up @@ -85,19 +85,49 @@ def __init__(self, *args: Any, **kwargs: Any) -> None:
self._resolver = aiodns.DNSResolver(*args, loop=self._loop, **kwargs)

async def resolve(
self, host: str, port: int = 0, family: int = socket.AF_INET
self, hostname: str, port: int = 0, family: int = socket.AF_INET
bdraco marked this conversation as resolved.
Show resolved Hide resolved
) -> List[Dict[str, Any]]:
try:
resp = await self._resolver.gethostbyname(host, family)
resp = await self._resolver.getaddrinfo(
hostname,
port=port,
type=socket.SOCK_STREAM,
family=family,
flags=socket.AI_ADDRCONFIG,
)
except aiodns.error.DNSError as exc:
msg = exc.args[1] if len(exc.args) >= 1 else "DNS lookup failed"
raise OSError(msg) from exc
hosts = []
for address in resp.addresses:
for node in resp.nodes:
address: Union[Tuple[bytes, int], Tuple[bytes, int, int, int]] = node.addr
family = node.family
if family == socket.AF_INET6:
if len(address) < 3:
# IPv6 is not supported by Python build,
# or IPv6 is not enabled in the host
continue
if address[3]:
# This is essential for link-local IPv6 addresses.
# LL IPv6 is a VERY rare case. Strictly speaking, we should use
# getnameinfo() unconditionally, but performance makes sense.
host, _port = await self._loop.getnameinfo(
bdraco marked this conversation as resolved.
Show resolved Hide resolved
address[0].decode("ascii"),
*address[1:],
socket.NI_NUMERICHOST | socket.NI_NUMERICSERV
)
port = int(_port)
else:
host = address[0].decode("ascii")
port = address[1]
else: # IPv4
assert family == socket.AF_INET
host = address[0].decode("ascii")
port = address[1]
hosts.append(
{
"hostname": host,
"host": address,
"hostname": hostname,
"host": host,
"port": port,
"family": family,
"proto": 0,
Expand Down
Loading