Нет ответа, но есть несколько точек данных. Разрешение DNS, по-видимому, исходит из httplib.py
в HTTPConnection.connect()
(строка 670 на моем python 2.5.4 stdlib)
Поток кода примерно равен:
for res in socket.getaddrinfo(self.host, self.port, 0, socket.SOCK_STREAM):
af, socktype, proto, canonname, sa = res
self.sock = socket.socket(af, socktype, proto)
try:
self.sock.connect(sa)
except socket.error, msg:
continue
break
Несколько комментариев о том, что происходит:
третий аргумент socket.getaddrinfo()
ограничивает семейства сокетов - то есть, IPv4 против IPv6. Проходящий ноль возвращает все семьи. Ноль жестко запрограммирован в stdlib.
передача имени хоста в getaddrinfo()
приведет к разрешению имени - на моем компьютере с OS X с включенным IPv6 записи A и AAAA исчезают, оба ответа возвращаются и оба возвращаются.
остальная часть цикла соединения пробует каждый возвращенный адрес до тех пор, пока один из них не будет успешным
Например:
>>> socket.getaddrinfo("python.org", 80, 0, socket.SOCK_STREAM)
[
(30, 1, 6, '', ('2001:888:2000:d::a2', 80, 0, 0)),
( 2, 1, 6, '', ('82.94.164.162', 80))
]
>>> help(socket.getaddrinfo)
getaddrinfo(...)
getaddrinfo(host, port [, family, socktype, proto, flags])
-> list of (family, socktype, proto, canonname, sockaddr)
Некоторые догадки:
Поскольку семейство сокетов в getaddrinfo()
жестко задано в ноль, вы не сможете переопределить записи A и AAAA через некоторый поддерживаемый интерфейс API в urllib. Если механизация не выполняет собственное разрешение имен по какой-либо другой причине, механизация тоже не может. Из конструкции контура соединения это By Design.
модуль сокетов Python - это тонкая оболочка для API-интерфейсов сокетов POSIX; Я ожидаю , что они разрешают каждую семью, доступную и настроенную в системе. Перепроверьте конфигурацию Gentoo IPv6.