Skip to content

Skip DNS resolving if provided host is already an ip address#874

Closed
lphuberdeau wants to merge 1 commit intoaio-libs:masterfrom
lphuberdeau:skip-resolve-on-ip
Closed

Skip DNS resolving if provided host is already an ip address#874
lphuberdeau wants to merge 1 commit intoaio-libs:masterfrom
lphuberdeau:skip-resolve-on-ip

Conversation

@lphuberdeau
Copy link
Contributor

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.

ipaddress.ip_address(host)
return True
except ValueError:
return False
Copy link
Member

@popravich popravich May 12, 2016

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.

Copy link
Contributor Author

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.

@kaniini
Copy link

kaniini commented May 27, 2016

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

@asvetlov asvetlov added the sprint label Jun 2, 2016
@boylea boylea mentioned this pull request Jun 3, 2016
3 tasks
@asvetlov
Copy link
Member

asvetlov commented Jun 3, 2016

Fixed by #905

@asvetlov asvetlov closed this Jun 3, 2016
@lock
Copy link

lock bot commented Oct 29, 2019

This thread has been automatically locked since there has not been
any recent activity after it was closed. Please open a new issue for
related bugs.

If you feel like there's important points made in this discussion,
please include those exceprts into that new issue.

@lock lock bot added the outdated label Oct 29, 2019
@lock lock bot locked as resolved and limited conversation to collaborators Oct 29, 2019
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants