我继承了一些通过HTTP请求/响应与服务器通信的Lua代码。这已经在现场运行了好几年,但我最近注意到系统的HTTP请求超时时出现了一些问题。每条消息都有能力定义自己的超时,但如果没有设置,则使用30秒的默认超时。几个星期前我在一个系统上注意到,在恢复和处理继续之前,有一个超时约15分钟。但我目前正在研究一个系统,它在30秒的超时时间内挂了超过3个小时。以下是请求的设置:
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)
我遇到过类似的问题,套接字库是旧的,最后一次更新是在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