Skip to content

Commit

Permalink
Fix duct-framework#8 unhandled exception when parsing malformed body
Browse files Browse the repository at this point in the history
  • Loading branch information
LukasRychtecky committed May 25, 2018
1 parent 52cd93c commit 05025a6
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 2 deletions.
5 changes: 5 additions & 0 deletions src/duct/handler/static.clj
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,11 @@
(defmethod ig/init-key ::bad-request [_ response]
(make-handler (assoc response :status 400)))

(defmethod ig/init-key ::bad-request-malformed [_ response]
(let [handler (make-handler (assoc response :status 400))]
(fn [_ _ request]
(handler request))))

(defmethod ig/init-key ::not-found [_ response]
(make-handler (assoc response :status 404)))

Expand Down
9 changes: 7 additions & 2 deletions src/duct/middleware/web.clj
Original file line number Diff line number Diff line change
Expand Up @@ -123,5 +123,10 @@
(merge-with deep-merge a b)
b))

(defmethod ig/init-key ::format [_ options]
#(mm/wrap-format % (deep-merge mc/default-options options)))
(defmethod ig/init-key ::format [_ {:keys [malformed-handler]
:as options
:or {malformed-handler
(ig/ref :duct.handler.static/bad-request-malformed)}}]
#(mm/wrap-exception
(mm/wrap-format % (deep-merge mc/default-options options))
malformed-handler))
5 changes: 5 additions & 0 deletions src/duct/module/web.clj
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
(ns duct.module.web
(:require [clojure.java.io :as io]
[clojure.string :as str]
[cheshire.core :as cheshire]
[duct.core :as core]
[duct.core.env :as env]
[duct.core.merge :as merge]
Expand Down Expand Up @@ -70,6 +71,7 @@

(def ^:private base-config
{:duct.handler.static/bad-request (plaintext-response "Bad Request")
:duct.handler.static/bad-request-malformed (plaintext-response "Bad Request Malformed")
:duct.handler.static/not-found (plaintext-response "Not Found")
:duct.handler.static/method-not-allowed (plaintext-response "Method Not Allowed")
:duct.handler.static/internal-server-error (plaintext-response "Internal Server Error")
Expand All @@ -80,6 +82,8 @@

(def ^:private api-config
{:duct.handler.static/bad-request {:body ^:displace {:error :bad-request}}
:duct.handler.static/bad-request-malformed {:body (cheshire/generate-string {:error "Malformed request body"})
:headers {"Content-Type" "application/json"}}
:duct.handler.static/not-found {:body ^:displace {:error :not-found}}
:duct.handler.static/method-not-allowed {:body ^:displace {:error :method-not-allowed}}
:duct.handler.static/internal-server-error
Expand Down Expand Up @@ -113,6 +117,7 @@

(defn- site-config [project-ns]
{:duct.handler.static/bad-request (html-response error-400)
:duct.handler.static/bad-request-malformed (html-response error-400)
:duct.handler.static/not-found (html-response error-404)
:duct.handler.static/method-not-allowed (html-response error-405)
:duct.handler.static/internal-server-error (html-response error-500)
Expand Down

0 comments on commit 05025a6

Please sign in to comment.