lua http套接字超时

rip*_*pat 7 sockets lua luasocket

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

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

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

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

rip*_*pat 13

这比我想象的容易.只是

local mysocket = require("socket.http")
mysocket.TIMEOUT = 5
Run Code Online (Sandbox Code Playgroud)

  • 这有"副作用",改变执行要求的文件之外的http套接字配置吗?(即代码在同一个程序上,但在另一个自己需要http.socket的文件上) (2认同)

Stu*_*ley 7

您可以这样做为一个请求而不是整个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}
Run Code Online (Sandbox Code Playgroud)

请注意,默认行为: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}
Run Code Online (Sandbox Code Playgroud)

作为一个例子来说明两种模式之间的区别,想象一下,在发出请求之后,服务器每秒响应一次响应,总共需要七秒钟才能完成.使用req_sock:settimeout(5, 'b')(或只是req_sock:settimeout(5))设置5秒的超时,此请求将继续正常,因为没有任何基础I/O操作花费的时间超过5秒:但是,如果req_sock:settimeout(5, 't')设置超时为5秒,则请求将失败五秒钟后

当然,为这两个持续时间设置限制可能是有意义的,同时具有短暂的不活动超时以及更长的超时.因此,根据文档,您可以进行两次单独调用以指定两者:

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}
Run Code Online (Sandbox Code Playgroud)