asynchttpserver

このモジュールは高性能な非同期型 HTTP サーバの実装です。

この HTTP サーバは本番環境での運用を想定した設計ではなく、ローカル環境でのアプリケーションテスト用に設計してあります。このため、アプリケーションのデプロイ時は、このサーバへのユーザ接続を禁止してリバースプロクシ (nginx など) をお使いください。

基本の用法

この用例ではポート 8080 を使って HTTP サーバを作成します。このサーバは、すべてのリクエストにレスポンスコ―ド 200 OKを、 本文 (body) は "Hello World" で応答します。

import asynchttpserver, asyncdispatch

var server = newAsyncHttpServer()
proc cb(req: Request) {.async.} =
  await req.respond(Http200, "Hello World")

waitFor server.serve(Port(8080), cb)

Request = object
  client*: AsyncSocket
  reqMethod*: HttpMethod
  headers*: HttpHeaders
  protocol*: tuple[orig: string, major, minor: int]
  url*: Uri
  hostname*: string            ## リクエストをしたクライアントのホスト名。
  body*: string
  ソース 編集
AsyncHttpServer = ref object
  socket: AsyncSocket
  reuseAddr: bool
  reusePort: bool
  maxBody: int                 ## body (本文) を読み込んだときの最大コンテンツ長です。
  
  ソース 編集

プロシージャ

proc newAsyncHttpServer(reuseAddr = true; reusePort = false; maxBody = 8388608): AsyncHttpServer {...}{.
    raises: [], tags: [].}
新しい AsyncHttpServer インスタンスを作成します。  ソース 編集
proc sendHeaders(req: Request; headers: HttpHeaders): Future[void] {...}{.
    raises: [Exception, FutureError], tags: [RootEffect].}
リクエスト側のクライアントへ指定されたヘッダを送信します。  ソース 編集
proc respond(req: Request; code: HttpCode; content: string; headers: HttpHeaders = nil): Future[
    void] {...}{.raises: [Exception, FutureError], 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 serve(server: AsyncHttpServer; port: Port;
          callback: proc (request: Request): Future[void] {...}{.closure, gcsafe.};
          address = ""): owned(Future[void]) {...}{.raises: [Exception, FutureError],
    tags: [RootEffect, WriteIOEffect, ReadIOEffect].}

HTTP 接続で指定されたアドレスとポートの着信待ち受け処理を開始します。

クライアントによるリクエスト時は指定されたコールバックが呼び出されます。

  ソース 編集
proc close(server: AsyncHttpServer) {...}{.raises: [Exception, SslError, OSError],
                                   tags: [RootEffect].}
非同期 http サーバのインスタンスを終了します。  ソース 編集