2011-05-16 472 views
7

的LuaSocket HTTP模块文件说,超时可以在HTTP连接上设置:LUA HTTP套接字超时

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

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

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

+1

将您的解决方案作为答案并接受它,因此此问题将完成。 – 2011-05-16 12:03:36

+0

我试过了,但我必须在第一篇文章发布之后的8小时后才能回答我自己的问题。我今晚会做(CET)。 – ripat 2011-05-16 12:19:27

+0

现在您的限制应该已经超过10个重点。 – BMitch 2011-05-16 13:26:15

回答

6

为此,您可以设置为一个请求,而不是整个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全局设置,设置一个时间限制对于请求中的任何单独操作 - 换句话说,操作可能会持续多长时间没有任何活动超时。如果您希望在操作上设置总体上限 - 整个请求不能超过的时间,,而不管活动 - 您应该将'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秒后失败

当然,它可能是有意义的设置这些持续时间这两个限制,既具有短期活动超时以及更长的整体超时。因此,per the documentation,可以让两个单独的呼叫指定

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} 
+0

我不知道我明白这一点。有了我发现的解决方案(现在下面发布),我是否真的改变了所有新HTTP套接字的超时时间?如果是这种情况,我可以在连接成功后将其值重置为默认的60秒。你能解释一下你的代码片段,特别是'create = function()'部分吗? – ripat 2011-05-16 18:52:17

+0

我刚做了一些测试,实际上,当我使用'mysocket.TIMEOUT'更改超时时,它会为所有后来创建的新HTTP套接字保留该值,除非您再次更改它。有了你的建议,你不用创建两个套接字吗?一个http和一个tcp? – ripat 2011-05-16 19:22:13

+1

@ripat请求的'create'参数指定了*创建*它用来执行* HTTP请求([HTTP应用层通过TCP传输层](http:// en。 wikipedia.org/wiki/TCP/IP_model))。如果你没有指定一个创建函数,默认情况下,http.request将对'tcp()'使用一个普通的调用(参见[manual](http://w3.impa.br/~diego/software/luasocket/) http.html))。 – 2011-05-16 20:11:44

12

这比我想象中的简单。只需

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

这是正确的答案 – javsmo 2014-09-05 16:57:43

+2

这是否有'副作用',更改要求的文件之外的http套接字配置? (即代码在同一个程序上,但在另一个文件上,它自己需要http.socket) – josinalvo 2014-10-31 18:45:34

+1

@josinalvo:是的,一个程序中的所有文件在'package.loaded'下共享它们公共模块的相同实例。请参阅[我的答案](http://stackoverflow.com/a/6021774/34799)以获得无副作用的方法。 – 2017-03-22 02:03:32