From 224aa5b89af00f1fa44b18c9d46c15057ed7d7a5 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 28 Dec 2021 23:20:00 +0100 Subject: [PATCH] :bug: Properly handle errors on body parsing middleware. --- backend/src/app/http/errors.clj | 2 +- backend/src/app/http/middleware.clj | 52 +++++++++++++---------------- 2 files changed, 24 insertions(+), 30 deletions(-) diff --git a/backend/src/app/http/errors.clj b/backend/src/app/http/errors.clj index 91b25beb1d..e4ff27bcfd 100644 --- a/backend/src/app/http/errors.clj +++ b/backend/src/app/http/errors.clj @@ -54,7 +54,7 @@ {:status 400 :body (ex-data err)}) (defmethod handle-exception :validation - [err req] + [err _] (let [edata (ex-data err)] {:status 400 :body (dissoc edata ::s/problems)})) diff --git a/backend/src/app/http/middleware.clj b/backend/src/app/http/middleware.clj index 394240d890..a8cf674458 100644 --- a/backend/src/app/http/middleware.clj +++ b/backend/src/app/http/middleware.clj @@ -34,38 +34,32 @@ (t/read! reader))) (parse-json [body] - (json/read body)) - - (parse [type body] - (try - (case type - :json (parse-json body) - :transit (parse-transit body)) - (catch Exception e - (let [data {:type :parse - :hint "unable to parse request body" - :message (ex-message e)}] - {:status 400 - :headers {"content-type" "application/transit+json"} - :body (t/encode-str data {:type :json-verbose})}))))] - + (json/read body))] (fn [{:keys [headers body] :as request}] - (let [ctype (get headers "content-type")] - (handler - (case ctype - "application/transit+json" - (let [params (parse :transit body)] - (-> request - (assoc :body-params params) - (update :params merge params))) + (try + (let [ctype (get headers "content-type")] + (handler (case ctype + "application/transit+json" + (let [params (parse-transit body)] + (-> request + (assoc :body-params params) + (update :params merge params))) - "application/json" - (let [params (parse :json body)] - (-> request - (assoc :body-params params) - (update :params merge params))) + "application/json" + (let [params (parse-json body)] + (-> request + (assoc :body-params params) + (update :params merge params))) - request)))))) + request))) + (catch Exception e + (let [data {:type :validation + :code :unable-to-parse-request-body + :hint "malformed params"}] + (l/error :hint (ex-message e) :cause e) + {:status 400 + :headers {"content-type" "application/transit+json"} + :body (t/encode-str data {:type :json-verbose})})))))) (def parse-request-body {:name ::parse-request-body