mirror of
https://github.com/metosin/reitit.git
synced 2025-12-18 17:01:11 +00:00
Merge pull request #739 from Ramblurr/fix/top-level-mw-registry
Apply router options to top-level middleware chain
This commit is contained in:
commit
1cdca2e3d5
3 changed files with 36 additions and 3 deletions
|
|
@ -52,6 +52,20 @@ Router creation fails fast if the registry doesn't contain the middleware:
|
||||||
;| :bonus | reitit.ring_test$wrap_bonus@59fddabb |
|
;| :bonus | reitit.ring_test$wrap_bonus@59fddabb |
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Middleware defined in the registry can also be used on the `ring-handler` level:
|
||||||
|
|
||||||
|
```clj
|
||||||
|
(def app
|
||||||
|
(ring/ring-handler
|
||||||
|
(ring/router
|
||||||
|
["/api"
|
||||||
|
["/bonus" {:get (fn [{:keys [bonus]}]
|
||||||
|
{:status 200, :body {:bonus bonus}})}]]
|
||||||
|
{::middleware/registry {:bonus wrap-bonus}})
|
||||||
|
nil
|
||||||
|
{:middleware [[:bonus 15]]}))
|
||||||
|
```
|
||||||
|
|
||||||
## When to use the registry?
|
## When to use the registry?
|
||||||
|
|
||||||
Middleware as Keywords helps to keep the routes (all but handlers) as literal data (i.e. data that evaluates to itself), enabling the routes to be persisted in external formats like EDN-files and databases. Duct is a good example, where the [middleware can be referenced from EDN-files](https://github.com/duct-framework/duct/wiki/Configuration). It should be easy to make Duct configuration a Middleware Registry in `reitit-ring`.
|
Middleware as Keywords helps to keep the routes (all but handlers) as literal data (i.e. data that evaluates to itself), enabling the routes to be persisted in external formats like EDN-files and databases. Duct is a good example, where the [middleware can be referenced from EDN-files](https://github.com/duct-framework/duct/wiki/Configuration). It should be easy to make Duct configuration a Middleware Registry in `reitit-ring`.
|
||||||
|
|
|
||||||
|
|
@ -370,7 +370,7 @@
|
||||||
([router default-handler {:keys [middleware inject-match? inject-router?]
|
([router default-handler {:keys [middleware inject-match? inject-router?]
|
||||||
:or {inject-match? true, inject-router? true}}]
|
:or {inject-match? true, inject-router? true}}]
|
||||||
(let [default-handler (or default-handler (fn ([_]) ([_ respond _] (respond nil))))
|
(let [default-handler (or default-handler (fn ([_]) ([_ respond _] (respond nil))))
|
||||||
wrap (if middleware (partial middleware/chain middleware) identity)
|
wrap (if middleware #(middleware/chain middleware % nil (r/options router)) identity)
|
||||||
enrich-request (create-enrich-request inject-match? inject-router?)
|
enrich-request (create-enrich-request inject-match? inject-router?)
|
||||||
enrich-default-request (create-enrich-default-request inject-router?)]
|
enrich-default-request (create-enrich-default-request inject-router?)]
|
||||||
(with-meta
|
(with-meta
|
||||||
|
|
|
||||||
|
|
@ -114,6 +114,25 @@
|
||||||
(is (= {:status 200, :body [:top :api :ok]}
|
(is (= {:status 200, :body [:top :api :ok]}
|
||||||
(app {:uri "/api/get" :request-method :get}))))))
|
(app {:uri "/api/get" :request-method :get}))))))
|
||||||
|
|
||||||
|
(testing "middleware from registry"
|
||||||
|
(let [router (ring/router
|
||||||
|
["/api" {:middleware [:mw-foo]}
|
||||||
|
["/get" {:middleware [[:mw :inner]]
|
||||||
|
:get handler}]]
|
||||||
|
{::middleware/registry {:mw mw
|
||||||
|
:mw-foo #(mw % :foo)}})
|
||||||
|
app (ring/ring-handler router nil {:middleware [[:mw :top]]})]
|
||||||
|
|
||||||
|
(testing "router can be extracted"
|
||||||
|
(is (= router (ring/get-router app))))
|
||||||
|
|
||||||
|
(testing "not found"
|
||||||
|
(is (= nil (app {:uri "/favicon.ico"}))))
|
||||||
|
|
||||||
|
(testing "on match"
|
||||||
|
(is (= {:status 200, :body [:top :foo :inner :ok]}
|
||||||
|
(app {:uri "/api/get" :request-method :get}))))))
|
||||||
|
|
||||||
(testing "named routes"
|
(testing "named routes"
|
||||||
(let [router (ring/router
|
(let [router (ring/router
|
||||||
[["/api"
|
[["/api"
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue