--- urllib2.py 2007-09-25 09:05:46.346939560 +0530 +++ urllib2-getaddrinfo.py 2007-09-25 09:04:59.019134480 +0530 @@ -1193,6 +1193,24 @@ return [part.strip() for part in res] +def gethost_addrinfo(hostname): + if socket.has_ipv6: + try: + for res in socket.getaddrinfo(hostname, None, socket.AF_INET6, + socket.SOCK_DGRAM, socket.IPPROTO_IP, socket.AI_CANONNAME): + af, socktype, proto, canonname, sa = res + except socket.gaierror: + for res in socket.getaddrinfo(hostname, None, socket.AF_INET, + socket.SOCK_DGRAM, socket.IPPROTO_IP, socket.AI_CANONNAME): + af, socktype, proto, canonname, sa = res + else: + for res in socket.getaddrinfo(hostname, None, socket.AF_INET, + socket.SOCK_DGRAM, socket.IPPROTO_IP, socket.AI_CANONNAME): + af, socktype, proto, canonname, sa = res + + return sa[0] + + class FileHandler(BaseHandler): # Use local file or FTP depending on form of URL def file_open(self, req): @@ -1208,10 +1226,10 @@ def get_names(self): if FileHandler.names is None: try: - FileHandler.names = (socket.gethostbyname('localhost'), - socket.gethostbyname(socket.gethostname())) + FileHandler.names = (gethost_addrinfo('localhost'), + gethost_addrinfo(socket.gethostname())) except socket.gaierror: - FileHandler.names = (socket.gethostbyname('localhost'),) + FileHandler.names = (gethost_addrinfo('localhost'),) return FileHandler.names # not entirely sure what the rules are here @@ -1232,7 +1250,7 @@ if host: host, port = splitport(host) if not host or \ - (not port and socket.gethostbyname(host) in self.get_names()): + (not port and gethost_addrinfo(host) in self.get_names()): return addinfourl(open(localfile, 'rb'), headers, 'file:'+file) except OSError, msg: @@ -1264,7 +1282,7 @@ passwd = unquote(passwd or '') try: - host = socket.gethostbyname(host) + host = gethost_addrinfo(host) except socket.error, msg: raise URLError(msg) path, attrs = splitattr(req.get_selector())