Skip to content

Latest commit

 

History

History
100 lines (75 loc) · 2.84 KB

middleware.md

File metadata and controls

100 lines (75 loc) · 2.84 KB

ミドルウェア

戻る

コンテンツ

API

proc middleware*(
  self:var Routes,
  path:Regex,
  action:proc(r:Request, p:Params):Future[Response]
) =

proc middleware*(
  self:var Routes,
  httpMethods:seq[HttpMethod],
  path:Regex,
  action:proc(r:Request, p:Params):Future[Response]
) =

proc next*(status:HttpCode=HttpCode(200), body="", headers:Headers=newHeaders()):Response =

サンプル

ミドルウェアはコントローラーが呼ばれる前に実行されます。
下のサンプルソースでは、app/middleware/auth_middlware.nimに定義されているcheckCsrfTokenMiddleware()checkSessionIdMiddleware()が動きます。

main.nim

import re
import basolato
import app/middlewares/auth_middleware

var routes = newRoutes()
routes.middleware(re".*", auth_middleware.checkLoginIdMiddleware)
serve(routes)

app/middleware/auth_middlware.nim

import asyncdispatch
import basolato/middleware


proc checkLoginId*(r:Request, p:Params):Future[Response] {.async.} =
  if not r.headers.hasKey("X-login-id"):
    raise newException(Error403, "リクエストヘッダーにX-login-idがありません")

  if not r.headers.hasKey("X-login-token"):
    raise newException(Error403, "リクエストヘッダーにX-login-tokenがありません")

  return next()

もしリクエストヘッダーにX-login-id or X-login-tokenのどちらかがなければ、403を返し、そうでなければ200を返します。


もしログインチェックに失敗した時にログインページにリダイレクトさせたい時は、ErrorRedirectを使ってください。これはError 302を呼び出します。

app/middleware/auth_middlware.nim

import basolato/middleware

proc checkLoginId*(r:Request, p:Params):Future[Response] {.async.} =
  if not r.headers.hasKey("X-login-id"):
    raise newException(ErrorRedirect, "/login")

  if not r.headers.hasKey("X-login-token"):
    raise newException(ErrorRedirect, "/login")
  return next()

CORSのように、コントローラーではなくミドルウェアで作られたレスポンスをクライアントに返したい時は、next関数の引数に設定することができます。 以下の例では、setCorsMiddlewareOPTIONSメソッドでのリクエストの時のみ動きます。

main.nim

var routes = newRoutes()
routes.middleware(@[HttpOptions], re"/api/.*", cors_middleware.setCorsMiddleware)

app/middleware/cors_middlware.nim

proc setCorsMiddleware*(r:Request, p:Params):Future[Response] {.async.} =
  let headers = corsHeader() & secureHeader()
  return next(status=Http204, headers=headers)