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

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

Closed
wants to merge 1 commit into from

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