Using Clack.Middleware.Static

Clack contains these useful middlewares:

Clack.Middleware.Csrf which protects Clack applications from CSRF attacks is also available as a contrib package.

Let’s take a look at Clack.Middleware.Static as a real example of a Clack middleware. It returns a static file if a request matches a specified pattern.

Here’s an example source code to show how to use Clack.Middleware.Static. This wrapped application returns “Hello, Clack!” for most requests, but a file in /path/to/static-files/ when request pathes match /public/*.

(import '(clack:wrap

(defun app (env)
  (declare (ignore env))
    (:content-type "text/plain")
    ("Hello, Clack!")))

(defvar mw
    (make-instance '<clack-middleware-static>
       :path "/public/"
       :root #p"/path/to/static-files/"))

  (wrap mw #'app))

Every middleware implements a wrap method, which provides a mechanism to generate wrapped applications. An application can be wrapped by multiple middlewares through calling wraps consecutively:

  (wrap mw3
    (wrap mw2
      (wrap mw1 #'app))))

However, this nesting wraps looks tedious. Clack has a solution to write this with a DSL style syntax. That’s the topic of the next chapter.