HTTPConnection.request不考虑超时



我正在尝试使用HTTPConnection(2.7.8)进行请求,并且我已使用HTTPConnection(host, timeout=10)将超时设置为10。然而,HTTPConnection.request()似乎在10秒后不会超时。事实上,HTTPConnection.timeout似乎甚至不被HTTPConnection.request()读取(它只被HTTPConnection.connect()读取。我的理解正确吗?timeout是否只适用于connect()而不适用于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', '')

然而,并不是所有域都会发生这种情况。

感谢

以下代码失败大约需要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超时具有不一致的行为:超时可能会限制单个套接字操作,但它没有说明HTTPConnection()调用本身的持续时间,该调用本身可能会尝试getaddrinfo()返回的几个ip地址,并且超时仅限制单个套接字操作。几个操作加在一起可能需要更长的时间。

您的HTTPConnection('http://google.com:22222')会提前失败,因为url参数不正确:它应该是hosthost:port。绝对urlrequest()方法接受——尽管即使在那里它也有特殊的含义——通常,您只提供路径,例如'/'

相关内容

  • 没有找到相关文章

最新更新