-
-
Notifications
You must be signed in to change notification settings - Fork 2k
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
Skip DNS resolving if provided host is already an ip address #874
Conversation
ipaddress.ip_address(host) | ||
return True | ||
except ValueError: | ||
return False |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Everybody most of their time use host names not IP addresses,
so most of time this method will raise and except ValueError what is not very efficient.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Anything else to suggest? The ipaddress module does not have a way to verify the format while avoiding the exception. Custom-made validation does not seem like a better route.
For this, we have: class IPAwareAsyncResolver(AsyncResolver):
@asyncio.coroutine
def resolve(self, host, port=0, family=socket.AF_INET):
if not host or family not in {socket.AF_UNSPEC, socket.AF_INET, socket.AF_INET6}:
return []
if hasattr(socket, 'inet_pton'):
if family == socket.AF_UNSPEC:
afs = [socket.AF_INET, socket.AF_INET6]
else:
afs = [family]
for af in afs:
# Linux's inet_pton doesn't accept an IPv6 zone index after host,
# like '::1%lo0', so strip it. If we happen to make an invalid
# address look valid, we fail later in sock.connect or sock.bind.
try:
if af == socket.AF_INET6:
socket.inet_pton(af, host.partition('%')[0])
else:
socket.inet_pton(af, host)
return [{'hostname': host, 'host': host, 'port': port, 'family': family, 'proto': 0, 'flags': socket.AI_NUMERICHOST}]
except OSError:
pass
# ... if we reach here, this means it's not a valid IP. try a DNS lookup.
hosts = yield from super(IPAwareAsyncResolver, self).resolve(host, port, family)
return hosts |
Fixed by #905 |
When using the AsyncResolver, there is a DNSError when trying to access a url where the host is an ip address.
This patch skips the resolver step if the host is an ip address.
An alternative would have been to move the same patch to the AsyncResolver, but other resolvers would likely have the same issue. Also, there was also a condition formatting the result properly in the TCPConnector.