std/asynchttpserver
Source EditЭтот модуль реализует высокопроизводительный асинхронный HTTP-сервер.
Этот HTTP-сервер не предназначен для использования в производстве, а только для тестирования приложений локально. По этой причине при развертывании приложения в производстве следует использовать обратный прокси-сервер (например, nginx), а не разрешать пользователям подключаться непосредственно к этому серверу.
Пример: cmd: -r:off
import std/asynchttpserver
# This example will create an HTTP server on an automatically chosen port.
# It will respond to all requests with a `200 OK` response code and "Hello World"
# as the response body.
import std/asyncdispatch
proc main {.async.} =
var server = newAsyncHttpServer()
proc cb(req: Request) {.async.} =
echo (req.reqMethod, req.url, req.headers)
let headers = {"Content-type": "text/plain; charset=utf-8"}
await req.respond(Http200, "Hello World", headers.newHttpHeaders())
server.listen(Port(0)) # or Port(8080) to hardcode the standard HTTP port.
let port = server.getPort
echo "test this with: curl localhost:" & $port.uint16 & "/"
while true:
if server.shouldAcceptRequest():
await server.acceptRequest(cb)
else:
# too many concurrent connections, `maxFDs` exceeded
# wait 500ms for FDs to be closed
await sleepAsync(500)
waitFor main() Импорты
- asyncnet, asyncdispatch, parseutils, uri, strutils, httpcore, nativesockets, since
Типы
Константы
Процедуры
proc acceptRequest(server: AsyncHttpServer; callback: proc (request: Request): Future[ void] {.closure, ...gcsafe.}): owned(Future[void]) {....stackTrace: false, raises: [Exception], tags: [RootEffect], forbids: [].}- Принимает один запрос. Необходимо написать явную петлю вокруг этой процедуры для правильной обработки ошибок. Source Edit
proc getPort(self: AsyncHttpServer): Port {....raises: [OSError, Exception], tags: [], forbids: [].}-
Возвращает порт, к которому
selfбыл привязан.Полезно для определения порта, к которому
selfпривязан, если он был выбран автоматически, например, черезlisten(Port(0)).Пример:
from std/nativesockets import Port let server = newAsyncHttpServer() server.listen(Port(0)) assert server.getPort.uint16 > 0 server.close()
Source Edit proc respond(req: Request; code: HttpCode; content: string; headers: HttpHeaders = nil): Future[void] {....raises: [Exception], tags: [RootEffect], forbids: [].}-
Отвечает на запрос указанным
HttpCode, заголовками и содержимым.Эта процедура не закроет сокет клиента.
Пример:
import std/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")Source Edit proc serve(server: AsyncHttpServer; port: Port; callback: proc (request: Request): Future[void] {.closure, ...gcsafe.}; address = ""; assumedDescriptorsPerRequest = -1; domain = AF_INET): owned( Future[void]) {....stackTrace: false, raises: [Exception], tags: [ WriteIOEffect, ReadIOEffect, RootEffect, TimeEffect], forbids: [].}-
Запускает процесс прослушивания входящих HTTP-соединений на указанном адресе и порту.
При получении запроса клиентом вызывается указанная функция обратного вызова.
Если
assumedDescriptorsPerRequestравно 0 или больше, сервер учитывает максимальный лимит дескрипторов файлов процесса. Затем он гарантирует, что у процесса все еще есть ресурсы дляassumedDescriptorsPerRequestдескрипторов файлов перед принятием соединения.Вы должны предпочесть вызывать
Source EditacceptRequestвместо этого с пользовательской петлей сервера, чтобы контролировать обработку ошибок и ведение журнала. proc shouldAcceptRequest(server: AsyncHttpServer; assumedDescriptorsPerRequest = 5): bool {.inline, ...raises: [], tags: [], forbids: [].}- Возвращает true, если текущее число открытых дескрипторов файлов процесса все еще находится в пределах максимального лимита, и поэтому прием еще одного запроса оправдан. Source Edit
© 2006–2024 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/asynchttpserver.html