10

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

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

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

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

4

2 回答 2

13

这比我想象的要容易。简单地

local mysocket = require("socket.http")
mysocket.TIMEOUT = 5
于 2011-05-16T18:48:27.317 回答
11

您可以这样做来为一个请求而不是整个 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}

请注意, 的默认行为:settimeout以及诸如 之类的全局设置为请求中的任何单个操作http.TIMEOUT设置了时间限制- 换句话说,它是在超时之前操作在没有任何活动的情况下可以进行多长时间。如果您希望设置操作的总体上限-无论活动如何,总体请求都不能超过的时间- 您应该将 mode 参数作为第二个参数传递给,如下所示:'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}

举个例子来说明这两种模式之间的区别,想象一下,在发出你的请求之后,服务器每秒响应一次响应的一部分,总共需要 7 秒才能完成。使用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}
于 2011-05-16T18:35:37.293 回答