UniSet 2.44.3
(JScript) Mini HTTP Server (uniset2-minit-http.js)

Лёгкий неблокирующий HTTP-сервер на js и частью кода написанного на c++.
Предназначен для встроенного использования JScript и интеграции с простым роутером.
Поддерживает keep-alive, обработку событий в общем цикле выполнения (poll/step), фиксированные ответы с Content-Length и потоковые ответы с Transfer-Encoding: chunked.
Не поддерживает: TLS, HTTP/2.

API

startMiniHttp(opts)

Запускает сервер и возвращает объект управления.

Предупреждения
Сервер может быть только один.

Параметры:

  • opts.host (string, по умолчанию "0.0.0.0")
  • opts.port (number, по умолчанию 8080)
  • opts.onRequest(req,res) (function) — обработчик запросов

Возвращает:

{
stop: function() { ... } // мягкая остановка (дожидается завершения обработки очереди)
}

Request (req)

  • req.method — строка ("GET", "POST", ...)
  • req.url — оригинальный URI
  • req.path — путь без query
  • req.query — объект параметров
  • req.headers — объект заголовков
  • req.body — тело запроса как строка

Response (res)

  • res.status(code[,reason])
  • res.setHeader(name,value)
  • res.end([data])
  • res.json(obj)
  • res.sendStatus(code)

Поведение:

  • Ровно один вызов завершающего метода (end / json / sendStatus). Повторные игнорируются.
  • Если разработчик не установил Transfer-Encoding и не задал Content-Length вручную: Content-Length выставляется автоматически по длине тела при вызове end / json.
  • Для потоковой передачи данных необходимо явно включить:
    res.setHeader("Transfer-Encoding", "chunked");
    В этом режиме Content-Length не используется.

Ошибки и таймауты

Сервер использует внутреннюю очередь запросов.

Если очередь заполнена:

  • Клиент получает 503 Service Unavailable
  • Тело может содержать текст "Server is busy"

Если обработчик не завершил ответ за время processTimeout (по умолчанию ~10 секунд):

  • Клиент получает 504 Gateway Timeout
  • Обработка запроса в JS прекращается

При внутренних ошибках (исключения из js или c++):

  • Клиент получает 500 Internal Server Error
  • Соединение может быть закрыто

При мягкой остановке (srv.stop()):

  • Сервер перестает принимать новые запросы
  • Но корректно обрабатывает те, что уже в очереди

Примеры

Минимальный сервер

load("uniset2-mini-http.js");
var srv = startMiniHttp({
port: 9090,
onRequest: function(req, res){
if (req.method === 'GET' && req.path === '/ping')
return res.end('pong');
res.json({ ok: true });
}
});

Интеграция с роутером

load("uniset2-mini-http-router.js");
var r = createRouter();
r.route('GET', '/api/v1/info', function(req,res){ res.json({hello:'world'}); });
var srv = startMiniHttp({
onRequest: function(req,res){ r.handle(req,res); }
});
См. также
(JScript): Mini HTTP router (uniset2-mini-http-router.js)