asynchttpserver
Этот модуль реализует высокопроизводительный асинхронный HTTP-сервер.
Этот HTTP-сервер не предназначен для использования в производстве, а для тестирования приложений локально. По этой причине при развертывании вашего приложения в производстве вы должны использовать обратный прокси (например, nginx) вместо того, чтобы разрешать пользователям подключаться напрямую к этому серверу.
Пример
Этот пример создаст HTTP-сервер на порту 8080. Сервер будет отвечать на все запросы с кодом ответа 200 OK и "Hello World" в качестве тела ответа.
import asynchttpserver, asyncdispatch
proc main {.async.} =
var server = newAsyncHttpServer()
proc cb(req: Request) {.async.} =
let headers = {"Date": "Tue, 29 Apr 2014 23:40:08 GMT",
"Content-type": "text/plain; charset=utf-8"}
await req.respond(Http200, "Hello World", headers.newHttpHeaders())
server.listen Port(8080)
while true:
if server.shouldAcceptRequest():
await server.acceptRequest(cb)
else:
poll()
asyncCheck main()
runForever() Импорты
- asyncnet, asyncdispatch, parseutils, uri, strutils, httpcore
Типы
Request = object client*: AsyncSocket reqMethod*: HttpMethod headers*: HttpHeaders protocol*: tuple[orig: string, major, minor: int] url*: Uri hostname*: string ## The hostname of the client that made the request. body*: string
- Исходный код Редактировать
AsyncHttpServer = ref object socket: AsyncSocket reuseAddr: bool reusePort: bool maxBody: int ## The maximum content-length that will be read for the body. maxFDs: int
- Исходный код Редактировать
Константы
nimMaxDescriptorsFallback = 16000
- значение по умолчанию, используемое, когда
maxDescriptorsнедоступно. Это значение может быть установлено в командной строке во время компиляции с помощью-d:nimMaxDescriptorsFallback=NИсходный код Редактировать
Процедуры
proc newAsyncHttpServer(reuseAddr = true; reusePort = false; maxBody = 8388608): AsyncHttpServer {...}{. raises: [], tags: [].}- Создает новый экземпляр
AsyncHttpServer. Исходный код Редактировать proc sendHeaders(req: Request; headers: HttpHeaders): Future[void] {...}{. raises: [Exception], tags: [RootEffect].}- Отправляет указанные заголовки запрошивающему клиенту. Исходный код Редактировать
proc respond(req: Request; code: HttpCode; content: string; headers: HttpHeaders = nil): Future[void] {...}{.raises: [Exception], tags: [RootEffect].}-
Отвечает на запрос с указанным
HttpCode, заголовками и содержимым.Эта процедура не закроет сокет клиента.
Пример:
import json proc handler(req: Request) {.async.} = if req.url.path == "/hello-world": let msg = %* {"message": "Hello World"} let headers = newHttpHeaders([("Content-Type","application/json")]) await req.respond(Http200, $msg, headers) else: await req.respond(Http404, "Not Found")Исходный код Редактировать proc listen(server: AsyncHttpServer; port: Port; address = "") {...}{. raises: [OSError, Exception, ValueError], tags: [RootEffect, WriteIOEffect, ReadIOEffect].}- Прослушивает указанный порт и адрес. Исходный код Редактировать
proc shouldAcceptRequest(server: AsyncHttpServer; assumedDescriptorsPerRequest = 5): bool {...}{.inline, raises: [], tags: [].}- Возвращает true, если текущее количество открытых дескрипторов файла процесса все еще находится в пределах максимального предела, и поэтому разумно принять еще один запрос. Исходный код Редактировать
proc acceptRequest(server: AsyncHttpServer; callback: proc (request: Request): Future[ void] {...}{.closure, gcsafe.}): owned(Future[void]) {...}{.raises: [Exception], tags: [RootEffect].}- Принимает один запрос. Напишите явную петлю вокруг этой процедуры, чтобы правильно обработать ошибки. Исходный код Редактировать
proc serve(server: AsyncHttpServer; port: Port; callback: proc (request: Request): Future[void] {...}{.closure, gcsafe.}; address = ""; assumedDescriptorsPerRequest = -1): owned(Future[void]) {...}{. raises: [Exception], tags: [RootEffect, WriteIOEffect, ReadIOEffect, TimeEffect].}-
Начинает процесс прослушивания входящих HTTP-соединений по указанному адресу и порту.
Когда клиент отправляет запрос, вызывается указанная функция обратного вызова.
Если
assumedDescriptorsPerRequestравно 0 или больше, сервер учитывает максимальный предел дескрипторов файла процесса. Затем он гарантирует, что у процесса все еще есть ресурсы дляassumedDescriptorsPerRequestдескрипторов файлов перед принятием соединения.Вы должны предпочесть вызывать
Исходный код РедактироватьacceptRequestвместо этого с пользовательской петлей сервера, чтобы контролировать обработку ошибок и ведение журнала. proc close(server: AsyncHttpServer) {...}{.raises: [Exception, LibraryError, SslError], tags: [RootEffect].}- Завершает экземпляр асинхронного HTTP-сервера. Исходный код Редактировать
Экспорт
- Http417, Http503, Http431, ==, contains, Http304, Http406, ==, $, clear, Http408, $, Http411, is3xx, Http418, Http206, HttpMethod, Http101, httpNewLine, Http505, Http413, newHttpHeaders, Http200, []=, Http414, add, Http401, Http205, ==, Http407, Http500, Http404, Http416, Http308, Http302, HttpHeaders, Http300, Http428, Http410, is2xx, Http202, Http502, headerLimit, HttpHeaderValues, contains, newHttpHeaders, $, [], Http305, Http451, Http409, Http504, Http426, hasKey, del, pairs, Http429, HttpVersion, []=, Http421, Http307, Http301, is4xx, Http203, getOrDefault, Http100, Http501, len, Http400, Http403, is5xx, Http415, toString, Http412, Http405, Http303, Http204,
- Http201, HttpCode, Http422, []
© 2006–2021 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/asynchttpserver.html