2015-02-23 101 views
1

我正在嘗試使用HTTPConnection(2.7.8)發出請求,並使用HTTPConnection(host, timeout=10)將超時設置爲10。但是,HTTPConnection.request()在10秒後似乎沒有超時。事實上,HTTPConnection.timeout甚至不似乎被HTTPConnection.request()讀取(它只能通過HTTPConnection.connect()讀。我的理解是否正確?是timeout只適用於connect()而不是request()?有沒有辦法超時request()HTTPConnection.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', '') 

但是,它不會發生在所有域。

感謝

+0

請檢查http://stackoverflow.com/questions/265720/http-request-timeout。希望這有助於:) – itzMEonTV 2015-02-23 08:50:53

+0

不,這個答案不適合我。它仍然堅持'request()'。 url示例是google.com:2222 – Kar 2015-02-23 10:41:52

+1

您是否試圖直接提供IP地址(而不是主機名)?調用'socket.getaddrinfo()',獲取IP地址。它似乎與[ftplib.FTP超時具有不一致的行爲]相同的問題(http://stackoverflow.com/q/28429501/4279):'request()'執行多個套接字操作。每個操作都受限於超時。但是幾項合併操作可能需要更長時間 – jfs 2015-02-23 10:52:33

回答

3

需要大約〜以下代碼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:超時可能會限制個別插座的操作,但它沒有說阿布t HTTPConnection()調用本身的持續時間,它可能會嘗試由getaddrinfo()返回的多個IP地址,超時限制僅限於單個套接字操作。幾項操作可能需要更長的時間。

您的HTTPConnection('http://google.com:22222')失敗,因爲url是一個不正確的參數:它應該是hosthost:port。絕對urlrequest()方法所接受 - 雖然它在那裏有特殊含義 - 通常,您只需提供路徑,如'/'