Skip to content

Instantly share code, notes, and snippets.

@khy
Created November 28, 2013 03:13
Show Gist options
  • Save khy/7686756 to your computer and use it in GitHub Desktop.
Save khy/7686756 to your computer and use it in GitHub Desktop.
Rack-like middleware for Play actions
object Middleware {
def stack[A](middlewares: Middleware[A]*) = {
middlewares.toSeq.reduceLeft[Action[A]] { (result, middleware)
middleware(result)
}
}
}
trait Middleware[A] {
def apply(action: Action[A]): Action[A]
}
object Logger[A] extends Middleware[A] {
def apply(action: Action[A]) = Action.async(action.parser) { request =>
Logger.info("Logging this, like, right now.")
action(request)
}
}
object Timer[A] extends Middleware[A] {
def apply(action: Action[A]) = Action.async(action.parser) { request =>
val start = System.currentTimeMillis
val result = action(request)
val duration = System.currentTimeMillis - start
result.withHeaders("X-Request-Time" -> duration)
}
}
Middleware.stack(
Logger,
Timer
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment