2014-05-09 281 views
1

我繼承了一些通過HTTP請求/響應與服務器通信的Lua代碼。這已經在現場運行了好幾年了,但我最近注意到系統中HTTP請求超時的一些掛起。每條消息都有能力定義自己的超時時間,但如果沒有設置,則使用30秒的默認超時時間。幾周前我在系統上注意到,在恢復並繼續處理之前,在超時時間約15分鐘之前發生了掛起。但我目前正在查看一個系統,在超過30秒的超時時間內掛了3個多小時。這裏是請求的設置:Lua HTTP請求超時掛起

local socket = require "socket" 
local http = require "socket.http" 
local ltn12 = require "ltn12" 
local ssl = require "ssl" 
local try = socket.try 
local protect = socket.protect 
... 
function serverapi.http_request(request, timeout) 
    ... (local variable setup and logging) 
    socket.TIMEOUT = timeout 
    socket.http.TIMEOUT = timeout 

    result, status_code, content = socket.http.request { 
     url = request.url, 
     method = request.method, 
     headers = request.header, 
     source = ltn12.source.string(request_body), 
     sink = ltn12.sink.table(response_body), 
    } 

    ... (receive response and process) 

我應該注意的是掛起在它們掛起的消息類型方面是不穩定的。所以這與一條消息不一致。而且,正如我所說,這已經在現場部署並運行了好幾年。

任何人有任何想法嗎?即使這只是一種幫助調試正在進行的方法。我甚至不知道如何在發送請求並等待超時之後獲取任何類型的日誌記錄。

感謝

+0

掛鉤看起來像什麼?請求中的哪個地方掛?初始連接?發送請求?等待響應開始?等待響應結束? –

+0

緊接在調用'socket.http.request'之前有一條日誌消息記錄了超時值,並且在打印接收到的狀態碼之後立即記錄一條日誌消息。所以必須在那個電話中掛。 – linsek

+1

你可以捕捉wireshark的請求,然後回放,看看你是否得到相同的掛起?你可以附加一個調試器的過程? – Schollii

回答

0

我有類似的問題,以及套接字庫是舊的,在2007年最後一次更新?我修復了socket/http.lua中的一個錯誤,但它仍然偶爾掛起,所以不是這樣。我試過luacurl,它也掛起,所以它可能是編譯代碼級別的問題。我在Windows上。 nodejs現在有更多的勢頭,所以我不確定我想追求Lua多少,除非支持改進。

while string.find(line, "^%s") do 
    value = value .. line 
    line, err = sock:receive() -- was line = sock:receive() 
    if err then return nil, err end 
end