Skip to content

Middleware

Middlewares are functions that you want to apply on many routes or globally which alter the response.

Global middlewares

You can define middlewares to be applied before any route matching occurs. A middleware is much like a route and share the same signature.

Before route matching

Here is a simple example showing how to change the header of all the routes, before the router tries to find a route.

v
module main

import khalyomede.mantis.http { create_app, App, Response, Middlewares } 
import khalyomede.mantis.http.route

fn main() {
  app := create_app(
    middlewares: Middlewares{ 
      before_route_match: [
        fn (app App) !Response {
          return app.response.set_header("X-Powered-By", "Mantis")
        }
      ]
    }
    routes: [
      route.get(path: "/", callback: fn (app App) !Response {
        return app.response.html(content: "Hello world")
      })
    ]
  )

  app.serve() or { panic(err) }
}

After route matching

When you need to change the response after the route has been found and rendered, use this middleware.

v
module main

import khalyomede.mantis.http { App, Response, Middlewares, create_app } 
import khalyomede.mantis.http.route

fn main() {
  app := create_app(
    middlewares: Middlewares{ 
      after_route_match: [
        fn (app App) !Response {
          return app.response.set_header("X-Powered-By", "Mantis")
        }
      ]
    }
    routes: [
      route.get(path: "/", callback: fn (app App) !Response {
        return app.response.html(content: "Hello world")
      })
    ]
  )

  app.serve() or { panic(err) }
}

Route middlewares

Middlewares can be declared on a route level for more fine-grain control.

Before response rendered

You can modify the response right before it will be rendered.

v
module main

import khalyomede.mantis.http { create_app, App, Response, RouteMiddlewares } 
import khalyomede.mantis.http.route

fn main() {
  app := create_app(
    routes: [
      route.get(
        path: "/"
        middlewares: RouteMiddlewares{ 
          before_response_rendered: [
            fn (app App) !Response {
              return app.response.set_header("X-Powered-By", "Mantis")
            }
          ]
        }
        callback: fn (app App) !Response {
          return app.response.html(content: "Hello world")
        }
      )
    ]
  )
}

NOTICE

Like routes, middlewares errors are catched and rendered/reported to the error handler.

After response rendered

You can also alter the response after it has been rendered from your route callback.

v
module main

import khalyomede.mantis.http { create_app, App, Response, RouteMiddlewares } 
import khalyomede.mantis.http.route

fn main() {
  app := create_app(
    routes: [
      route.get(
        path: "/"
        middlewares: RouteMiddlewares{ 
          after_response_rendered: [
            fn (app App) !Response {
              return app.response.set_header("X-Powered-By", "Mantis")
            }
          ]
        }
        callback: fn (app App) !Response {
          return app.response.html(content: "Hello world")
        }
      )
    ]
  )

  app.serve() or { panic(err) }
}