HTTPConnection.request not respecting timeout?
我正在尝试使用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,那么它将相应地超时。 我想知道为什么该计划的存在应该有所作为。 也就是说,以下不尊重超时
1 2 3 4
| socket.setdefaulttimeout(3)
conn = HTTPConnection('google.com:22222')
conn.timeout = 3
conn.request('GET', '') |
然而,这样做:
1 2 3 4
| socket.setdefaulttimeout(3)
conn = HTTPConnection('http://google.com:22222')
conn.timeout = 3
conn.request('GET', '') |
但是,它不会发生在所有域中。
谢谢
-
请检查stackoverflow.com/questions/265720/http-request-timeout。希望这可以帮助 :)
-
不,这个答案对我不起作用。它仍然停留在request()。一个示例网址是google.com:2222
-
您是否尝试过直接提供IP地址(而不是主机名)?调用socket.getaddrinfo(),获取IP地址。似乎与ftplib.FTP超时具有不一致行为相同的问题:request()执行多个套接字操作。每个操作都受超时限制。但是几项合并可能需要更长时间。
-
我想我已经进一步缩小了这个问题:如果我不提供该方案,它将不会尊重套接字超时。如果提供了方案,即完整的URL为http://google.com:22222,那么它会超时。我想知道为什么该计划的存在应该有所作为。
-
目前尚不清楚如何使用HTTPConnection。创建演示差异的最短程序(设置HTTPConnection.debuglevel=1)
-
@ J.F.Sebastian我现在已经添加了代码片段。
-
@ J.F.Sebastian我认为你的第一条评论中的建议解释了我的问题。
以下代码失败大约需要30秒:
1 2 3 4 5
| #!/usr/bin/env python2
from httplib import HTTPConnection
conn = HTTPConnection('google.com', 22222, timeout=2)
conn.request('GET', '') |
如果将ip传递给HTTPConnection而不是主机名,则会按预期在2秒内引发超时错误:
1 2 3 4 5 6 7 8
| #!/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是一个不正确的参数:它应该是host或host:port。 request()方法接受绝对url - 尽管它具有特殊意义 - 通常,您只需提供路径,例如'/'。