Skip to main content

Default handler

By default, if no routes match, nil is returned, which is not a valid response in Ring:

(require '[reitit.ring :as ring])

(defn handler [_]
{:status 200, :body ""})

(def app
(ring/ring-handler
(ring/router
["/ping" handler])))

(app {:uri "/invalid"})
; nil

Setting the default-handler as a second argument to ring-handler:

(def app
(ring/ring-handler
(ring/router
["/ping" handler])
(constantly {:status 404, :body ""})))

(app {:uri "/invalid"})
; {:status 404, :body ""}

To get more correct http error responses, ring/create-default-handler can be used. It differentiates :not-found (no route matched), :method-not-allowed (no method matched) and :not-acceptable (handler returned nil).

With defaults:

(def app
(ring/ring-handler
(ring/router
[["/ping" {:get handler}]
["/pong" (constantly nil)]])
(ring/create-default-handler)))

(app {:request-method :get, :uri "/ping"})
; {:status 200, :body ""}

(app {:request-method :get, :uri "/"})
; {:status 404, :body ""}

(app {:request-method :post, :uri "/ping"})
; {:status 405, :body ""}

(app {:request-method :get, :uri "/pong"})
; {:status 406, :body ""}

With custom responses:

(def app
(ring/ring-handler
(ring/router
[["/ping" {:get handler}]
["/pong" (constantly nil)]])
(ring/create-default-handler
{:not-found (constantly {:status 404, :body "kosh"})
:method-not-allowed (constantly {:status 405, :body "kosh"})
:not-acceptable (constantly {:status 406, :body "kosh"})})))

(app {:request-method :get, :uri "/ping"})
; {:status 200, :body ""}

(app {:request-method :get, :uri "/"})
; {:status 404, :body "kosh"}

(app {:request-method :post, :uri "/ping"})
; {:status 405, :body "kosh"}

(app {:request-method :get, :uri "/pong"})
; {:status 406, :body "kosh"}