|
1 | 1 | (ns duct.middleware.web |
2 | 2 | (:require [duct.logger :as logger] |
3 | 3 | [integrant.core :as ig] |
4 | | - [muuntaja.core :as mc] |
5 | | - [muuntaja.middleware :as mm] |
6 | 4 | [ring.middleware.defaults :refer [wrap-defaults]] |
7 | 5 | [ring.middleware.stacktrace :refer [wrap-stacktrace]] |
8 | 6 | [ring.middleware.webjars :refer [wrap-webjars]] |
|
51 | 49 | (defn- internal-error [response] |
52 | 50 | (response/status response 500)) |
53 | 51 |
|
54 | | -(defn- not-found [response] |
55 | | - (response/status response 404)) |
56 | | - |
57 | 52 | (defn wrap-hide-errors |
58 | 53 | "Middleware that hides any uncaught exceptions behind a 500 'Internal Error' |
59 | 54 | response generated by an error handler. Intended for use in production when |
|
69 | 64 | (handler request respond (fn [_] (respond (internal-error (error-handler request))))) |
70 | 65 | (catch Throwable _ (respond (internal-error (error-handler request)))))))) |
71 | 66 |
|
72 | | -(defn wrap-not-found |
73 | | - "Middleware that returns a 404 'Not Found' response from an error handler if |
74 | | - the base handler returns nil." |
75 | | - [handler error-handler] |
76 | | - (fn |
77 | | - ([request] |
78 | | - (or (handler request) (not-found (error-handler request)))) |
79 | | - ([request respond raise] |
80 | | - (handler request #(respond (or % (not-found (error-handler request)))) raise)))) |
81 | | - |
82 | | -(defn- route-aliases-request [request aliases] |
83 | | - (if-let [alias (aliases (:uri request))] |
84 | | - (assoc request :uri alias) |
85 | | - request)) |
86 | | - |
87 | | -(defn wrap-route-aliases |
88 | | - "Middleware that takes a map of URI aliases. If the URI of the request matches |
89 | | - a URI in the map's keys, the URI is changed to the value corresponding to that |
90 | | - key." |
91 | | - [handler aliases] |
92 | | - (fn |
93 | | - ([request] |
94 | | - (handler (route-aliases-request request aliases))) |
95 | | - ([request respond raise] |
96 | | - (handler (route-aliases-request request aliases) respond raise)))) |
97 | | - |
98 | 67 | (defmethod ig/init-key ::log-requests |
99 | 68 | [_ {:keys [logger options]}] |
100 | 69 | #(wrap-log-requests % logger (dissoc options :logger))) |
|
105 | 74 | (defmethod ig/init-key ::hide-errors [_ {:keys [error-handler]}] |
106 | 75 | #(wrap-hide-errors % error-handler)) |
107 | 76 |
|
108 | | -(defmethod ig/init-key ::not-found [_ {:keys [error-handler]}] |
109 | | - #(wrap-not-found % error-handler)) |
110 | | - |
111 | | -(defmethod ig/init-key ::route-aliases [_ aliases] |
112 | | - #(wrap-route-aliases % aliases)) |
113 | | - |
114 | 77 | (defmethod ig/init-key ::defaults [_ defaults] |
115 | 78 | #(wrap-defaults % defaults)) |
116 | 79 |
|
|
119 | 82 |
|
120 | 83 | (defmethod ig/init-key ::stacktrace [_ options] |
121 | 84 | #(wrap-stacktrace % options)) |
122 | | - |
123 | | -(defn- deep-merge [a b] |
124 | | - (if (and (map? a) (map? b)) |
125 | | - (merge-with deep-merge a b) |
126 | | - b)) |
127 | | - |
128 | | -(defmethod ig/init-key ::format [_ options] |
129 | | - #(mm/wrap-format % (deep-merge mc/default-options options))) |
0 commit comments