как заставить библиотеку python httplib использовать только запросы
Вопрос
Проблема в том, что urllib, использующий httplib, запрашивает записи AAAA.
Я бы хотел избежать этого.Есть ли хороший способ сделать это?
>>> import socket
>>> socket.gethostbyname('www.python.org')
'82.94.164.162'
21:52:37.302028 IP 192.168.0.9.44992 > 192.168.0.1.53: 27463+ A? www.python.org. (32)
21:52:37.312031 IP 192.168.0.1.53 > 192.168.0.9.44992: 27463 1/0/0 A 82.94.164.162 (48)
python /usr/lib/python2.6/urllib.py -t http://www.python.org >/dev/null 2>&1
21:53:44.118314 IP 192.168.0.9.40669 > 192.168.0.1.53: 32354+ A? www.python.org. (32)
21:53:44.118647 IP 192.168.0.9.40669 > 192.168.0.1.53: 50414+ AAAA? www.python.org. (32)
21:53:44.122547 IP 192.168.0.1.53 > 192.168.0.9.40669: 32354 1/0/0 A 82.94.164.162 (48)
21:53:44.135215 IP 192.168.0.1.53 > 192.168.0.9.40669: 50414 1/0/0 AAAA[|domain]
Решение
Правильный ответ таков:
http://docs.python.org/library/socket.html
Библиотека сокетов Python использует следующее:
сокет.сокет([семейство[, тип[, proto]]]) Создайте новый сокет, используя заданное семейство адресов, тип сокета и номер протокола.Семейством адресов должно быть AF_INET (по умолчанию), AF_INET6 или AF_UNIX.Типом сокета должен быть SOCK_STREAM (по умолчанию), SOCK_DGRAM или, возможно, одна из других констант SOCK_.Номер протокола обычно равен нулю и в этом случае может быть опущен.
/* Supported address families. */
#define AF_UNSPEC 0
#define AF_INET 2 /* Internet IP Protocol */
#define AF_INET6 10 /* IP version 6 */
По умолчанию он использует 0, и если вы вызовете его с помощью 2, он будет запрашивать только записи A.
Помните, что кэширование результатов разрешения в вашем приложении - ДЕЙСТВИТЕЛЬНО ПЛОХАЯ ИДЕЯ.Никогда не делай этого!
Другие советы
Смотри сюда: как-разрешить-srv-запись в Python
Как только вы определите правильный IP-адрес A, используйте его в своем запросе вместо DNS.