Skip to main content

http

Исходящие HTTP-запросы, не блокирующие кадр.

Как это устроено

Запрос уходит на рабочий поток, ответ возвращается в игровой — тем же проходом, которым тикают таймеры. Ни одна строчка плагина не касается сокета, и ни один рабочий поток не касается Lua: между ними ходят только байты. Из этого следует главное свойство: постановка запроса ничего не ждёт. Вызов возвращается сразу, кадр идёт дальше, коллбэк приходит когда придёт. Потоков два. Один медленный адрес не мешает другому плагину, а плагин, обходящий список игроков в цикле, не наплодит сотню потоков — лишнее встаёт в очередь.

Транспорт

Тот, что уже есть в системе, поэтому модуль остаётся одним файлом рядом с метамодом: ни OpenSSL, ни libcurl рядом класть не нужно. На Linux libcurl не линкуется, а подгружается — поэтому для сборки не нужен 32-битный -dev пакет, а сервер без libcurl нормально загрузит модуль и скажет, чего не хватает, при первом запросе.

Объект ответа

Коллбэк получает одну таблицу — как и обработчик события. 404 — не сбой транспорта, но и не успех: ok будет false, а error заполнен, чтобы if not res.ok then print(res.error) end работал без разбора частных случаев.

Границы

На Windows таймаут применяется к каждой фазе отдельно — разрешение имени, подключение, отправка, чтение. Запрос к висящему серверу вернётся примерно за удвоенное значение, а не ровно за него.

Перезагрузка и выгрузка

Запросы, оставшиеся на проводе, переживают и lua_reload, и выгрузку своего плагина — но их коллбэки не выполняются: они ссылаются на состояние, которого больше нет. Ответ просто выбрасывается. Перезагрузка при этом не ждёт незавершённые запросы: прервать чужой сокет на середине нельзя, а держать сервер до конца самого медленного из них — хуже, чем потерять его ответ.

http.get

Выполняет GET-запрос.

Аргументы

Возвращает

Опции

Пример

Смотри также

http.post

Выполняет POST-запрос с телом.

Аргументы

Возвращает

Пример

Заголовок Content-Type не подставляется сам: сервер на той\nстороне обычно требует конкретный, и угадывать его — плохая\nидея.

http.request

Выполняет запрос произвольным методом.

Аргументы

Возвращает

Опции

Пример

http.cancel

Отменяет запрос по id.

Аргументы

Возвращает

Гарантия здесь одна: коллбэк не выполнится. Сам запрос, если он уже ушёл в сеть, доигрывается до конца — оборвать чужое соединение на середине нельзя.