2014-08-05 6 views
0

Я делаю длинный запрос опроса, задавая тайм-аут 10 секунд, но он, похоже, не работает. Мое понимание заключается в том, что если мы не получим ответ от бэкэнд в течение указанного таймаута, бэкэнд-код должен заканчиваться кодом ошибки timedout. Это так?http.TIMEOUT не работает в lua

Но если я использую очень малый тайм-аут, например. 0.001, он работает. Поэтому я думаю, что если запрос уже отправлен на бэкэнд, тайм-аут не работает.

Для моего запроса на длительный опрос, если моя сеть отключена, когда запрос отправлен и ждет ответа, там висит разъем lua, и он никогда не восстанавливается из этой ситуации. Не могли бы вы помочь мне, если я могу с этим справиться?

Моя Lua версия - Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio (двойной int32)

Код Спинет:

local http = require "socket.http" 
local https = require "ssl.https" 
http.TIMEOUT = 10 
local r,s,h = https.request({ 
    url = url, 
    method = "GET", 
    sink = ltn12.sink.table(results), 
    headers = { 
     ["Cache-Control"] = "no-cache", 
     ["X-Token"] = config.token 
    } 
}) 
+0

Вы используете 'https.request' вместо' http.request' – hjpotter92

+0

Да, это правильно. В другом потоке (ниже) говорится, что http.TIMEOUT также должен использоваться для запроса https. 'http://stackoverflow.com/questions/20193454/lua-https-timeout-is-not-working' – Dilip

ответ

0

У меня также были проблемы с получением тайм-аут для подключения https для работы. Настройка таймаута как http.TIMEOUT = ... - это правильная вещь, даже для https (что подтверждается при использовании очень малых тайм-аутов).

В моем случае причиной было разрешение DNS. Это, похоже, происходит синхронно без принудительного тайм-аута со стороны lua и будет только тайм-аут, когда возвращается syscall getaddrinfo (или что-то, что luasec использует внутренне).

Обходной путь для меня состоял в том, чтобы использовать IP вместо имени хоста, чтобы обойти DNS-разрешение. Тогда тайм-аут работает на меня. Другим вариантом, который также может помочь в вашей проблеме, является создание потока истечения времени для соединения.