как заставить библиотеку Python httplib использовать только запросы - PullRequest
2 голосов
/ 09 октября 2009

Проблема в том, что 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]

Ответы [ 2 ]

6 голосов
/ 10 октября 2009

Правильный ответ:

http://docs.python.org/library/socket.html

Библиотека сокетов Python использует следующее:

socket.socket ([family [, type [, 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.

Помните, что кэширование результатов разрешения в вашем приложении - ДЕЙСТВИТЕЛЬНО ПЛОХАЯ ИДЕЯ. Никогда не делай этого!

0 голосов
/ 09 октября 2009

Смотрите здесь: how-do-i-resol-an-srv-record-in-python

Как только вы решили правильный IP, используйте его в своем запросе, вместо DNS.

...