🐛 Properly handle errors on body parsing middleware.

This commit is contained in:
Andrey Antukh 2021-12-28 23:20:00 +01:00 committed by Alonso Torres
parent 01c89f6554
commit 224aa5b89a
2 changed files with 24 additions and 30 deletions

View file

@ -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)}))

View file

@ -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