lua http套接字超时

lua http socket timeout

LuaSocket HTTP模块文档说可以在HTTP连接上设置超时:

可以设置以下常量来控制HTTP模块的默认行为:

PORT:用于连接的默认端口;
PROXY:用于连接的默认代理;
超时:设置所有I / O操作的超时;
USERAGENT:向服务器报告的默认用户代理。
http://w3.impa.br/~diego/software/luasocket/http.htm

如何在lua脚本中设置这些常量?


这比我想的要容易。只是

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


您可以执行以下操作为一个请求而不是整个HTTP模块设置超时:

1
2
3
4
5
6
7
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,如下所示:

1
2
3
4
5
6
7
8
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}

作为说明这两种模式之间区别的示例,请想象一下,在发出请求后,服务器每秒响应一次响应块,总共花费了七秒钟。使用req_sock:settimeout(5, 'b')(或仅req_sock:settimeout(5))设置5秒钟的块超时,此请求将进行得很好,因为基本的I / O操作都不会花费超过5秒的时间:但是,使用req_sock:settimeout(5, 't')设置5 -秒的总超时,该请求将在五秒钟后失败。

当然,为这两个持续时间设置限制可能很有意义,既要有较短的不活动超时,又要有较长的总体超时。因此,根据文档,您可以进行两个单独的调用来指定两者:

1
2
3
4
5
6
7
8
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}