HTTPConnection.request不尊重超时?

时间:2015-02-23 08:43:02

标签: python httpconnection httplib

我正在尝试使用HTTPConnection(2.7.8)发出请求,并使用HTTPConnection(host, timeout=10)将超时设置为10。但是,HTTPConnection.request()似乎在10秒后没有超时。事实上,HTTPConnection.timeout似乎甚至没有HTTPConnection.request()阅读HTTPConnection.connect()只能阅读timeout。我的理解是否正确?connect()仅适用于{{1}而不是request()?有没有办法超时request()

更新

我想我已经进一步缩小了这个问题:如果我不提供该方案,它将不会尊重套接字超时。如果提供了该方案,即完整的URL为http://google.com:22222,则它会相应地超时。我想知道为什么该计划的存在应该有所作为。也就是说,以下内容不考虑超时

    socket.setdefaulttimeout(3)
    conn = HTTPConnection('google.com:22222')
    conn.timeout = 3
    conn.request('GET', '')

然而,这样做:

    socket.setdefaulttimeout(3)
    conn = HTTPConnection('http://google.com:22222')
    conn.timeout = 3
    conn.request('GET', '')

但是,它不会发生在所有域中。

由于

1 个答案:

答案 0 :(得分:5)

以下代码失败大约需要30秒:

#!/usr/bin/env python2
from httplib import HTTPConnection

conn = HTTPConnection('google.com', 22222, timeout=2)
conn.request('GET', '')

如果ip传递给HTTPConnection而不是主机名,则超时错误会在2秒内按预期提高:

#!/usr/bin/env python2
import socket
from httplib import HTTPConnection

host, port = 'google.com', 22222
ip, port = socket.getaddrinfo(host, port)[0][-1]
conn = HTTPConnection(ip, port, timeout=2)
conn.request('GET', '')

解释与ftplib.FTP timeout has inconsistent behaviour中的解释相同:超时可能会限制单个套接字操作,但它没有说明HTTPConnection()调用本身的持续时间,可能会尝试{{1}返回的多个IP地址并且超时仅限制各个套接字操作。合并的几项操作可能需要更长的时间。

您的getaddrinfo()很快就会失败,因为网址不正确:它应该是HTTPConnection('http://google.com:22222')host。绝对host:porturl方法接受 - 尽管它具有特殊意义 - 通常,您只需提供request()等路径。