def _resolve_special(hostname, family): if not isinstance(hostname, hostname_types): raise TypeError("argument 1 must be str, bytes or bytearray, not %s" % (type(hostname),)) if hostname in (u'', b''): result = native_getaddrinfo(None, 0, family, SOCK_DGRAM, 0, AI_PASSIVE) if len(result) != 1: raise error('wildcard resolved to multiple address') return result[0][4][0] return hostname
def getaddrinfo(self, host, port, family=0, socktype=0, proto=0, flags=0): host = self._hostname_to_bytes(host) if host is not None else None if (not isinstance(host, bytes) # 1, 2 or (flags & AI_NUMERICHOST) # 3 or host in self._LOCAL_HOSTNAMES # 4 or (is_ipv6_addr(host) and host.startswith(b'fe80')) # 5 ): # This handles cases which do not require network access # 1) host is None # 2) host is of an invalid type # 3) AI_NUMERICHOST flag is set # 4) It's a well-known alias. TODO: This is special casing for c-ares that we don't # really want to do. It's here because it resolves a discrepancy with the system # resolvers caught by test cases. In gevent 20.4.0, this only worked correctly on # Python 3 and not Python 2, by accident. # 5) host is a link-local ipv6; dnspython returns the wrong # scope-id for those. return native_getaddrinfo(host, port, family, socktype, proto, flags) return self._getaddrinfo(host, port, family, socktype, proto, flags)