From 62caa9399ddabc19ee53b4b0c99a00b8f214e2d4 Mon Sep 17 00:00:00 2001 From: Juho Teperi Date: Mon, 2 Nov 2020 13:15:07 +0200 Subject: [PATCH] Add route-data to coerce-request compile failure --- modules/reitit-core/src/reitit/coercion.cljc | 2 +- .../reitit-ring/src/reitit/ring/coercion.cljc | 31 ++++++++++++------- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/modules/reitit-core/src/reitit/coercion.cljc b/modules/reitit-core/src/reitit/coercion.cljc index 57d55628..ac154961 100644 --- a/modules/reitit-core/src/reitit/coercion.cljc +++ b/modules/reitit-core/src/reitit/coercion.cljc @@ -164,7 +164,7 @@ "A router :compile implementation which reads the `:parameters` and `:coercion` data to create compiled coercers into Match under `:result. A pre-requisite to use [[coerce!]]." - [[_ {:keys [parameters coercion]}] opts] + [[_ {:keys [parameters coercion] :as match}] opts] (if (and parameters coercion) (request-coercers coercion parameters opts))) diff --git a/modules/reitit-ring/src/reitit/ring/coercion.cljc b/modules/reitit-ring/src/reitit/ring/coercion.cljc index 3f1c280d..e0ae6fa2 100644 --- a/modules/reitit-ring/src/reitit/ring/coercion.cljc +++ b/modules/reitit-ring/src/reitit/ring/coercion.cljc @@ -24,7 +24,7 @@ and :parameters from route data, otherwise does not mount." {:name ::coerce-request :spec ::rs/parameters - :compile (fn [{:keys [coercion parameters]} opts] + :compile (fn [{:keys [coercion parameters] :as route-data} opts] (cond ;; no coercion, skip (not coercion) nil @@ -32,16 +32,25 @@ (not parameters) {} ;; mount :else - (if-let [coercers (coercion/request-coercers coercion parameters opts)] - (fn [handler] - (fn - ([request] - (let [coerced (coercion/coerce-request coercers request)] - (handler (impl/fast-assoc request :parameters coerced)))) - ([request respond raise] - (let [coerced (coercion/coerce-request coercers request)] - (handler (impl/fast-assoc request :parameters coerced) respond raise))))) - {})))}) + (try + (if-let [coercers (coercion/request-coercers coercion parameters opts)] + (fn [handler] + (fn + ([request] + (let [coerced (coercion/coerce-request coercers request)] + (handler (impl/fast-assoc request :parameters coerced)))) + ([request respond raise] + (let [coerced (coercion/coerce-request coercers request)] + (handler (impl/fast-assoc request :parameters coerced) respond raise))))) + {}) + (catch Exception e + (throw (ex-info (str "Coerce-request-middleware failed: " (.getMessage e)) + ;; TODO: Format error properly + {:type :coerce-request-middleware-fail + ;; TODO: Add path? + :data {:route-data (select-keys route-data [:parameters]) + :cause-data (ex-data e)}} + e))))))}) (def coerce-response-middleware "Middleware for pluggable response coercion.