Skip to content

Commit cba8c55

Browse files
committed
Drop slingshot use
Still supports catching slingshotted exceptions with :exception :handlers. Catching slingshotted exceptions is tested.
1 parent 885bed0 commit cba8c55

4 files changed

Lines changed: 27 additions & 19 deletions

File tree

project.clj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
[lein-ring "0.9.7"]
3131
[funcool/codeina "0.3.0"]]
3232
:dependencies [[org.clojure/clojure "1.7.0"]
33+
[slingshot "0.12.2"]
3334
[peridot "0.4.2"]
3435
[javax.servlet/servlet-api "2.5"]
3536
[midje "1.8.3"]

src/compojure/api/meta.clj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
[ring.swagger.common :refer :all]
1010
[ring.swagger.json-schema :as js]
1111
[ring.util.http-response :refer [internal-server-error]]
12-
[slingshot.slingshot :refer [throw+]]
1312
[schema.core :as s]
1413
[schema.coerce :as sc]
1514
[schema.utils :as su]
@@ -88,7 +87,8 @@
8887
(let [coerce (coercer (value-of schema) matcher)
8988
body (coerce (:body response))]
9089
(if (su/error? body)
91-
(throw+ (assoc body :type ::ex/response-validation))
90+
(throw (ex-info "Response validation error"
91+
(assoc body :type ::ex/response-validation)))
9292
(assoc response
9393
::serializable? true
9494
:body body)))
@@ -105,7 +105,7 @@
105105
(let [coerce# (~+compojure-api-coercer+ ~schema matcher#)
106106
result# (coerce# value#)]
107107
(if (su/error? result#)
108-
(throw+ (assoc result# :type ::ex/request-validation))
108+
(throw (ex-info "Request validation failed" (assoc result# :type ::ex/request-validation)))
109109
result#))
110110
value#)))
111111

src/compojure/api/middleware.clj

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
[ring.swagger.middleware :as rsm]
1313
[ring.swagger.coerce :as rsc]
1414
[ring.util.http-response :refer :all]
15-
[slingshot.slingshot :refer [try+ throw+]]
1615
[schema.core :as s])
1716
(:import [com.fasterxml.jackson.core JsonParseException]
1817
[org.yaml.snakeyaml.parser ParserException]))
@@ -55,18 +54,17 @@
5554
(let [default-handler (get handlers ::ex/default ex/safe-handler)]
5655
(assert (fn? default-handler) "Default exception handler must be a function.")
5756
(fn [request]
58-
(try+
57+
(try
5958
(handler request)
60-
(catch (get % :type) {:keys [type] :as data}
61-
(let [type (or (get ex/legacy-exception-types type) type)]
62-
(if-let [handler (get handlers type)]
63-
(call-error-handler handler (:throwable &throw-context) data request)
64-
(call-error-handler default-handler (:throwable &throw-context) data request))))
65-
(catch Object _
66-
; FIXME: Used for validate
67-
(if (rethrow-exceptions? request)
68-
(throw+)
69-
(call-error-handler default-handler (:throwable &throw-context) nil request)))))))
59+
(catch Throwable e
60+
(let [{:keys [type] :as data} (ex-data e)
61+
type (or (get ex/legacy-exception-types type) type)]
62+
; FIXME: Used for validate
63+
(if (rethrow-exceptions? request)
64+
(throw e)
65+
(if-let [handler (get handlers type)]
66+
(call-error-handler handler e data request)
67+
(call-error-handler default-handler e data request)))))))))
7068

7169
;;
7270
;; Component integration
@@ -144,8 +142,8 @@
144142
;; i.e. (handler req) is inside try-catch. If r-m-f was changed to catch only
145143
;; exceptions from parsing the request, we wouldn't need to check the exception class.
146144
(if (or (instance? JsonParseException e) (instance? ParserException e))
147-
(throw+ {:type ::ex/request-parsing} e)
148-
(throw+ e)))
145+
(throw (ex-info "Error parsing request" {:type ::ex/request-parsing} e))
146+
(throw e)))
149147

150148
(defn serializable?
151149
"Predicate which return true if the response body is serializable.

test/compojure/api/middleware_test.clj

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
[midje.sweet :refer :all]
44
[ring.util.http-response :refer [ok]]
55
[ring.util.http-status :as status]
6-
ring.util.test)
6+
ring.util.test
7+
[slingshot.slingshot :refer [throw+]])
78
(:import [java.io PrintStream ByteArrayOutputStream]))
89

910
(defmacro without-err
@@ -49,4 +50,12 @@
4950
(fact "converts exceptions into safe internal server errors"
5051
(handler {}) => (contains {:status status/internal-server-error
5152
:body (contains {:class exception-class
52-
:type "unknown-exception"})}))))))
53+
:type "unknown-exception"})})))))
54+
55+
(with-out-str
56+
(without-err
57+
(fact "Slingshot exception map type can be matched"
58+
(let [handler (-> (fn [_] (throw+ {:type ::test} (RuntimeException. "kosh")))
59+
(wrap-exceptions {:handlers {::test (fn [ex _ _] {:status 500 :body "hello"})}}))]
60+
(handler {}) => (contains {:status status/internal-server-error
61+
:body "hello"}))))))

0 commit comments

Comments
 (0)