2018-08-22 19:46:42 +00:00
# Transforming the Middleware Chain
2018-08-22 18:51:02 +00:00
2018-12-30 14:53:15 +00:00
There is an extra option in ring-router (actually, in the underlying middleware-router): `:reitit.middleware/transform` to transform the middleware chain per endpoint. Value should be a function or a vector of functions that get a vector of compiled middleware and should return a new vector of middleware.
2018-08-22 18:51:02 +00:00
2018-12-30 14:53:15 +00:00
## Example Application
2018-08-22 18:51:02 +00:00
```clj
2018-12-30 14:53:15 +00:00
(require '[reitit.ring :as ring])
(require '[reitit.middleware :as middleware])
(defn wrap [handler id]
(fn [request]
(handler (update request ::acc (fnil conj []) id))))
(defn handler [{:keys [::acc]}]
{:status 200, :body (conj acc :handler)})
2018-08-22 18:51:02 +00:00
(def app
(ring/ring-handler
(ring/router
2018-12-30 14:53:15 +00:00
["/api" {:middleware [[wrap 1] [wrap 2]]}
["/ping" {:get {:middleware [[wrap 3]]
:handler handler}}]])))
(app {:request-method :get, :uri "/api/ping"})
; {:status 200, :body [1 2 3 :handler]}
2018-08-22 18:51:02 +00:00
```
2018-12-30 14:53:15 +00:00
### Reversing the Middleware Chain
2018-08-22 18:51:02 +00:00
```clj
2018-12-30 14:53:15 +00:00
(def app
(ring/ring-handler
(ring/router
["/api" {:middleware [[wrap 1] [wrap 2]]}
["/ping" {:get {:middleware [[wrap 3]]
:handler handler}}]]
{::middleware/transform reverse})))
2018-08-22 18:51:02 +00:00
(app {:request-method :get, :uri "/api/ping"})
2018-12-30 14:53:15 +00:00
; {:status 200, :body [3 2 1 :handler]}
2018-08-22 18:51:02 +00:00
```
2018-12-30 14:53:15 +00:00
## Interleaving Middleware
2018-08-22 18:51:02 +00:00
```clj
(def app
(ring/ring-handler
(ring/router
2018-12-30 14:53:15 +00:00
["/api" {:middleware [[wrap 1] [wrap 2]]}
["/ping" {:get {:middleware [[wrap 3]]
2018-08-22 18:51:02 +00:00
:handler handler}}]]
2018-12-30 14:53:15 +00:00
{::middleware/transform #(interleave % (repeat [wrap :debug]))})))
(app {:request-method :get, :uri "/api/ping"})
; {:status 200, :body [1 :debug 2 :debug 3 :debug :handler]}
2018-08-22 18:51:02 +00:00
```
2018-12-30 14:53:15 +00:00
### Printing Request Diffs
2018-08-22 18:51:02 +00:00
```clj
2019-06-16 17:20:49 +00:00
[metosin/reitit-middleware "0.3.9"]
2018-08-22 18:51:02 +00:00
```
2018-12-30 14:53:15 +00:00
Using `reitit.ring.middleware.dev/print-request-diffs` transformation, the request diffs between each middleware are printed out to the console. To use it, add the following router option:
```clj
:reitit.middleware/transform reitit.ring.middleware.dev/print-request-diffs
```
Sample output:
