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) }
}