2011-05-16 470 views
7

的LuaSocket HTTP模塊文件說,超時可以在HTTP連接上設置:LUA HTTP套接字超時

以下常量可以設置來控制HTTP模塊的默認行爲:

PORT :用於連接的默認端口; PROXY:用於連接的默認代理; TIMEOUT:設置所有I/O操作的超時時間; USERAGENT:默認的用戶代理報告給服務器。 http://w3.impa.br/~diego/software/luasocket/http.htm

如何在lua腳本中設置這些常量?

+1

將您的解決方案作爲答案並接受它,因此此問題將完成。 – 2011-05-16 12:03:36

+0

我試過了,但我必須在第一篇文章發佈之後的8小時後才能回答我自己的問題。我今晚會做(CET)。 – ripat 2011-05-16 12:19:27

+0

現在您的限制應該已經超過10個重點。 – BMitch 2011-05-16 13:26:15

回答

6

爲此,您可以設置爲一個請求,而不是整個HTTP模塊超時:

local socket = require "socket" 
local http = require "socket.http" 
response = http.request{url=URL, create=function() 
    local req_sock = socket.tcp() 
    req_sock:settimeout(5) 
    return req_sock 
end} 

注意的:settimeout默認行爲,以及像http.TIMEOUT全局設置,設置一個時間限制對於請求中的任何單獨操作 - 換句話說,操作可能會持續多長時間沒有任何活動超時。如果您希望在操作上設置總體上限 - 整個請求不能超過的時間,,而不管活動 - 您應該將't'的模式參數作爲第二個參數傳遞給:settimeout,如下所示:

local socket = require "socket" 
local http = require "socket.http" 
response = http.request{url=URL, create=function() 
    local req_sock = socket.tcp() 
    -- note the second parameter here 
    req_sock:settimeout(5, 't') 
    return req_sock 
end} 

作爲一個例子來說明這兩種模式之間的區別,想象一下,讓你的請求後,服務器響應的塊每秒一次的迴應,採取7秒全面完成。與req_sock:settimeout(5, 'b')(或只是req_sock:settimeout(5))設置一個5秒鐘的超時,則該請求將進行得很好,因爲沒有基礎I/O操作花費的時間超過5秒:然而,與req_sock:settimeout(5, 't')設置一個五秒鐘總計超時,請求將在5秒後失敗

當然,它可能是有意義的設置這些持續時間這兩個限制,既具有短期活動超時以及更長的整體超時。因此,per the documentation,可以讓兩個單獨的呼叫指定

local socket = require "socket" 
local http = require "socket.http" 
response = http.request{url=URL, create=function() 
    local req_sock = socket.tcp() 
    req_sock:settimeout(5, 'b') 
    req_sock:settimeout(30, 't') 
    return req_sock 
end} 
+0

我不知道我明白這一點。有了我發現的解決方案(現在下面發佈),我是否真的改變了所有新HTTP套接字的超時時間?如果是這種情況,我可以在連接成功後將其值重置爲默認的60秒。你能解釋一下你的代碼片段,特別是'create = function()'部分嗎? – ripat 2011-05-16 18:52:17

+0

我剛做了一些測試,實際上,當我使用'mysocket.TIMEOUT'更改超時時,它會爲所有後來創建的新HTTP套接字保留該值,除非您再次更改它。有了你的建議,你不用創建兩個套接字嗎?一個http和一個tcp? – ripat 2011-05-16 19:22:13

+1

@ripat請求的'create'參數指定了*創建*它用來執行* HTTP請求([HTTP應用層通過TCP傳輸層](http:// en。 wikipedia.org/wiki/TCP/IP_model))。如果你沒有指定一個創建函數,默認情況下,http.request將對'tcp()'使用一個普通的調用(參見[manual](http://w3.impa.br/~diego/software/luasocket/) http.html))。 – 2011-05-16 20:11:44

12

這比我想象中的簡單。只需

local mysocket = require("socket.http") 
mysocket.TIMEOUT = 5 
+2

這是正確的答案 – javsmo 2014-09-05 16:57:43

+2

這是否有'副作用',更改要求的文件之外的http套接字配置? (即代碼在同一個程序上,但在另一個文件上,它自己需要http.socket) – josinalvo 2014-10-31 18:45:34

+1

@josinalvo:是的,一個程序中的所有文件在'package.loaded'下共享它們公共模塊的相同實例。請參閱[我的答案](http://stackoverflow.com/a/6021774/34799)以獲得無副作用的方法。 – 2017-03-22 02:03:32