【问题标题】:HTTPConnection.request not respecting timeout?HTTPConnection.request 不考虑超时?
【发布时间】:2015-04-24 12:55:02
【问题描述】:

我正在尝试使用 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', '')

但是,并非所有域都会发生这种情况。

谢谢

【问题讨论】:

  • 请查看stackoverflow.com/questions/265720/http-request-timeout。希望这会有所帮助:)
  • 不,这个答案对我不起作用。它仍然停留在request()。一个示例网址是 google.com:2222
  • 您是否尝试过直接提供 IP 地址(而不是主机名)?拨打socket.getaddrinfo(),获取IP地址。这似乎与ftplib.FTP timeout has inconsistent behaviour 相同的问题:request() 执行多个套接字操作。每个操作都受超时限制。但是多个操作合并起来可能需要更长的时间。
  • 我想我已经进一步缩小了问题的范围:如果我不提供方案,它就不会遵守套接字超时。如果提供了方案,即完整的 URL 为http://google.com:22222,那么它就会超时。我想知道为什么该计划的存在会有所作为。
  • 不清楚你如何使用HTTPConnection。 Create the shortest program that demonstrates the difference(设置HTTPConnection.debuglevel=1

标签: python httpconnection httplib


【解决方案1】:

以下代码失败大约需要 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() 调用本身的持续时间,它可能会尝试getaddrinfo() 返回的多个IP 地址和超时限制只有个别的套接字操作。多个操作结合起来可能需要更长时间。

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

【讨论】:

    猜你喜欢
    • 2018-08-19
    • 2021-03-11
    • 2017-10-24
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 2016-01-12
    相关资源
    最近更新 更多