在lua中,http.TIMEOUT无法使用。

我正在进行一个长轮询请求,设置了10秒的超时时间,但似乎没有起作用。我的理解是,如果在指定的超时时间内没有从后端获得响应,后端调用应以“超时”错误代码结束。是这样吗?

但是,如果我使用非常小的超时时间,例如0.001秒,它就能正常工作。因此,我认为如果请求已经发送到后端,则超时不起作用。

对于我的长轮询请求,如果在发送请求并等待响应时我的网络出现问题,lua套接字就会卡在那里,永远无法从这种情况中恢复。请问我是否可以以其他方式处理这个问题?

我的Lua版本-Lua 5.1.4版版权所有(C)1994-2008 Lua.org,PUC-Rio(双int32)

Spinet代码:

local http = require "socket.http"
local https = require "ssl.https"
http.TIMEOUT = 10
local r,s,h = https.request({
    url = url,
    method = "GET",
    sink = ltn12.sink.table(results),
    headers = {
        ["Cache-Control"] = "no-cache",
        ["X-Token"] = config.token
    }
})
点赞
用户3519002
用户3519002

我在设置https连接超时时也遇到了问题。http.TIMEOUT = ... 设置超时是正确的做法,即使是https(当使用非常小的超时时也已确认)。

在我的情况下,DNS解析是问题的罪魁祸首。这似乎是同步发生的,没有来自lua侧的强制超时,只有在系统调用getaddrinfo(或者luasec内部使用的其他调用)运行结束后才会超时。

对我而言的解决办法是使用IP而不是主机名,以绕过DNS解析。然后超时对我有效了。 另一种可能有助于解决你的问题的选择是为连接创建一个时间过期的线程。

2017-09-01 19:15:46