これを行うと、HTTPモジュール全体ではなく、1つのリクエストのタイムアウトを設定できます。
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
の時間制限を設定することに注意してください。つまり、タイムアウトする前に操作がアクティビティなしで実行できる時間です。操作に全体的な上限を設定する場合(アクティビティに関係なく、全体的な要求が超えられない時間)、次のように、2番目のパラメーターとしての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}
2つのモードの違いを説明する例として、リクエストを行った後、サーバーが1秒に1回応答のチャンクで応答し、完了までに全体で7秒かかると想像してください。5秒のブロックタイムアウトを設定すると(または単に)、req_sock:settimeout(5, 'b')
基になるI / O操作のいずれも5秒より長くはかからなかったため、この要求は問題なく進行します。ただし、合計5秒のタイムアウトを設定すると、要求は失敗します。 5秒後。req_sock:settimeout(5)
req_sock:settimeout(5, 't')
もちろん、これらの期間の両方に制限を設定して、非アクティブなタイムアウトを短くし、全体的なタイムアウトを長くすることは理にかなっています。そのため、ドキュメントに従って、 2つの別々の呼び出しを行って両方を指定できます。
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}