[ Web Proxy ]
URL:
Viewing: https://bugs.python.org/file7833/urllib2-getaddrinfo.patch [Back]  [Original]

--- python-trunk/Lib/urllib2.py.ipv6	2007-03-05 17:58:36.000000000 -0500
+++ python-trunk/Lib/urllib2.py	2007-03-07 00:05:46.000000000 -0500
@@ -1200,14 +1200,43 @@
     # names for the localhost
     names = None
     def get_names(self):
+        def make_host_tuple(searchlist):
+            names = []
+
+            for hostname in searchlist:
+                for res in socket.getaddrinfo(host=hostname, port=None,
+                                              flags=socket.AI_CANONNAME):
+                    af, socktype, proto, canonname, sa = res
+                    try:
+                        i = names.index(canonname)
+                    except ValueError:
+                        names.append(canonname)
+
+            return tuple(names)
+
+        if socket.has_ipv6:
+            searchlist = ['::1', 'localhost']
+        else:
+            searchlist = ['localhost']
+
         if FileHandler.names is None:
             try:
-                FileHandler.names = (socket.gethostbyname('localhost'),
-                                    socket.gethostbyname(socket.gethostname()))
+                searchlist.append(socket.gethostname())
+                FileHandler.names = make_host_tuple(searchlist)
             except socket.gaierror:
-                FileHandler.names = (socket.gethostbyname('localhost'),)
+                FileHandler.names = make_host_tuple(searchlist)
         return FileHandler.names
 
+    # check for given host name in local host name list
+    def check_host(self, host):
+        locals = self.get_names()
+        for res in socket.getaddrinfo(host=host, port=None,
+                                      flags=socket.AI_CANONNAME):
+            af, socktype, proto, canonname, sa = res
+            if canonname in locals:
+                return True
+        return False
+
     # not entirely sure what the rules are here
     def open_local_file(self, req):
         import email.utils
@@ -1224,8 +1253,7 @@
             (mtype or 'text/plain', size, modified)))
         if host:
             host, port = splitport(host)
-        if not host or \
-           (not port and socket.gethostbyname(host) in self.get_names()):
+        if not host or (not port and self.check_host(host)):
             return addinfourl(open(localfile, 'rb'),
                               headers, 'file:'+file)
         raise URLError('file not on local host')
@@ -1237,6 +1265,7 @@
         host = req.get_host()
         if not host:
             raise IOError, ('ftp error', 'no host given')
+
         host, port = splitport(host)
         if port is None:
             port = ftplib.FTP_PORT
@@ -1253,36 +1282,41 @@
         user = unquote(user or '')
         passwd = unquote(passwd or '')
 
-        try:
-            host = socket.gethostbyname(host)
-        except socket.error, msg:
-            raise URLError(msg)
         path, attrs = splitattr(req.get_selector())
         dirs = path.split('/')
         dirs = map(unquote, dirs)
         dirs, file = dirs[:-1], dirs[-1]
         if dirs and not dirs[0]:
             dirs = dirs[1:]
+
         try:
-            fw = self.connect_ftp(user, passwd, host, port, dirs)
-            type = file and 'I' or 'D'
-            for attr in attrs:
-                attr, value = splitvalue(attr)
-                if attr.lower() == 'type' and \
-                   value in ('a', 'A', 'i', 'I', 'd', 'D'):
-                    type = value.upper()
-            fp, retrlen = fw.retrfile(file, type)
-            headers = ""
-            mtype = mimetypes.guess_type(req.get_full_url())[0]
-            if mtype:
-                headers += "Content-type: %s\n" % mtype
-            if retrlen is not None and retrlen >= 0:
-                headers += "Content-length: %d\n" % retrlen
-            sf = StringIO(headers)
-            headers = mimetools.Message(sf)
-            return addinfourl(fp, headers, req.get_full_url())
-        except ftplib.all_errors, msg:
-            raise IOError, ('ftp error', msg), sys.exc_info()[2]
+            for res in socket.getaddrinfo(host=host, port=None,
+                                          flags=socket.AI_CANONNAME):
+                af, socktype, proto, host, sa = res
+
+                try:
+                    fw = self.connect_ftp(user, passwd, host, port, dirs)
+                    type = file and 'I' or 'D'
+                    for attr in attrs:
+                        attr, value = splitvalue(attr)
+                        if attr.lower() == 'type' and \
+                           value in ('a', 'A', 'i', 'I', 'd', 'D'):
+                            type = value.upper()
+                    fp, retrlen = fw.retrfile(file, type)
+                    headers = ""
+                    mtype = mimetypes.guess_type(req.get_full_url())[0]
+                    if mtype:
+                        headers += "Content-type: %s\n" % mtype
+                    if retrlen is not None and retrlen >= 0:
+                        headers += "Content-length: %d\n" % retrlen
+                    sf = StringIO(headers)
+                    headers = mimetools.Message(sf)
+                    return addinfourl(fp, headers, req.get_full_url())
+                except ftplib.all_errors, msg:
+                    raise IOError, ('ftp error', msg), sys.exc_info()[2]
+
+        except socket.error, msg:
+            raise URLError(msg)
 
     def connect_ftp(self, user, passwd, host, port, dirs):
         fw = ftpwrapper(user, passwd, host, port, dirs)

 	  	 

Web Proxy Viewer  |  New URL  |  Original Page