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 Aug 30, 2018
1 parent 6aa5ccb commit a029366
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 5 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
17 changes: 14 additions & 3 deletions src/duct/middleware/web.clj
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
(ns duct.middleware.web
(:require [duct.logger :as logger]
(:require [cheshire.core :as cheshire]
[duct.logger :as logger]
[integrant.core :as ig]
[muuntaja.core :as mc]
[muuntaja.middleware :as mm]
Expand Down Expand Up @@ -129,5 +130,15 @@
(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
(fn [error content-type request]
(let [handler (or (:malformed-handler options)
(:default-malformed-handler options))]
(-> (handler error content-type request)
(update :body cheshire/generate-string)
(assoc-in [:headers "Content-Type"] "application/json"))))}}]
#(mm/wrap-exception
(mm/wrap-format % (deep-merge mc/default-options options))
malformed-handler))
5 changes: 4 additions & 1 deletion src/duct/module/web.clj
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,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,11 +81,12 @@

(def ^:private api-config
{:duct.handler.static/bad-request {:body ^:displace {:error :bad-request}}
:duct.handler.static/bad-request-malformed {:body ^:displace {:error :malformed-request-body}}
: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
{:body ^:displace {:error :internal-server-error}}
:duct.middleware.web/format {}
:duct.middleware.web/format {:default-malformed-handler (ig/ref :duct.handler.static/bad-request-malformed)}
:duct.middleware.web/defaults base-ring-defaults
:duct.core/handler
{:middleware ^:distinct [(ig/ref :duct.middleware.web/not-found)
Expand Down Expand Up @@ -113,6 +115,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
11 changes: 10 additions & 1 deletion test/duct/module/web_test.clj
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,9 @@
:duct.handler.static/bad-request
{:headers {"Content-Type" "text/plain; charset=UTF-8"}
:body "Bad Request"}
:duct.handler.static/bad-request-malformed
{:headers {"Content-Type" "text/plain; charset=UTF-8"}
:body "Bad Request Malformed"}
:duct.handler.static/not-found
{:headers {"Content-Type" "text/plain; charset=UTF-8"}
:body "Not Found"}
Expand Down Expand Up @@ -102,13 +105,16 @@
:logger (ig/ref :duct/logger)}
:duct.handler.static/bad-request
{:body {:error :bad-request}}
:duct.handler.static/bad-request-malformed
{:body {:error :malformed-request-body}}
:duct.handler.static/not-found
{:body {:error :not-found}}
:duct.handler.static/method-not-allowed
{:body {:error :method-not-allowed}}
:duct.handler.static/internal-server-error
{:body {:error :internal-server-error}}
:duct.middleware.web/format {}
:duct.middleware.web/format
{:default-malformed-handler (ig/ref :duct.handler.static/bad-request-malformed)}
:duct.middleware.web/stacktrace {}
:duct.middleware.web/hide-errors
{:error-handler (ig/ref :duct.handler.static/internal-server-error)}
Expand Down Expand Up @@ -155,6 +161,9 @@
:duct.middleware.web/webjars {}
:duct.middleware.web/stacktrace {}
:duct.handler.static/bad-request
{:headers {"Content-Type" "text/html; charset=UTF-8"}
:body (io/resource "duct/module/web/errors/400.html")}
:duct.handler.static/bad-request-malformed
{:headers {"Content-Type" "text/html; charset=UTF-8"}
:body (io/resource "duct/module/web/errors/400.html")}
:duct.handler.static/not-found
Expand Down

0 comments on commit a029366

Please sign in to comment.