Fork me on GitHub
#ring-swagger
<
2018-09-20
>
Andy15:09:51

Hi, In my use case, I need to have different middle-ware for specific routes. This is the code:

(ns my-api.handler
  (:require [compojure.api.sweet :refer :all]
            [ring.util.http-response :refer :all]))

(defn echo0[handler]
  (fn [request]
    (prn "ECHO0" #_request)
    (handler request)
    ))

(defn echo1[handler]
  (fn [request]
    (prn "ECHO1" #_request)
    (handler request)
    ))

(def app
  (api
   (middleware [echo0] (swagger-routes))
   (context "/api" []
            :middleware [echo1]
            (GET "/test" [] (ok "1")))))
However, when I run the code echo0 is invoked for /api/test as well. Is there is any way to make those completely separate?

ikitommi17:09:40

@happy.lisper good question. The middleware is removed in 2.0.0 in favour of route-middleware, which should do what you want. The root cause here is that in Compojure, the routing tree is an application where the middleware are applied in-place - there is no good way to delay the computation to see if the route will eventually match.

Andy19:09:13

@ikitommi ITY. I will try to play with route-middleware. In meantime, I just do the brute force filtering on :uri in a middleware applied to all routes.