我正在寻找一种在一个特定python脚本中抑制AAAA解析的通用方法。有没有一种简单的方法可以做到这一点?
我使用youtube Data API for python,它使用httplib2作为握手的东西。我想我需要像套接字覆盖一样的低级内容。
要查找的域名是Google域名,因此使用特定前缀的IPv6偏好设置选项无法正常工作。
底层问题是我的IPv6地址目前位于伊拉克的地理位置是错误的......我已经提交了修复该请求的请求,但希望在此期间运行该脚本。
答案 0 :(得分:6)
没有全局Python开关,httplib2
似乎也没有任何方法可以控制它。
httplib2
使用socket.getaddrinfo
(请参阅httplib2.HTTPConnectionWithTimeout.connect
的来源)根据域名查找要连接的地址。它将0
作为族参数传递,这意味着使用任何可用的族。
所以,要解决这个问题,你需要有一些方法来覆盖它。一种方法是实现自己的连接类,让我们称之为IPv4Connection
,继承自httplib2.HTTPConnectionWithTimeout
或httplib.Connection
并覆盖connect
以强制它使用IPv4,然后通过在调用connection_type
时作为Http.request(uri, connection_type=IPv4Connection)
参数。
另一种方法是修补socket.getaddrinfo
以强制家庭参数始终为socket.AF_INET
。
另一种方法是使用底层方法让您的C库更喜欢IPv4或禁用IPv6。这将因平台而异,但在使用glibc的Linux上,您可以编辑/etc/gai.conf
以始终优先选择IPv4 over IPv6:
precedence ::ffff:0:0/96 100
答案 1 :(得分:1)
我使用gai.conf方法来降低整个/ 32 IPv6前缀的首选项。对我的用例来说足够好了。