Skip to content

Commit 8cf6bfe

Browse files
committed
Add :prefer-handler? to wrap-resource options
1 parent 4d3fa4d commit 8cf6bfe

File tree

2 files changed

+70
-9
lines changed

2 files changed

+70
-9
lines changed

ring-core/src/ring/middleware/resource.clj

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,31 @@
1717
(-> (response/resource-response path (assoc options :root root-path))
1818
(head/head-response request))))))
1919

20+
(defn- wrap-resource-prefer-resources [handler root-path options]
21+
(fn
22+
([request]
23+
(or (resource-request request root-path options)
24+
(handler request)))
25+
([request respond raise]
26+
(if-let [response (resource-request request root-path options)]
27+
(respond response)
28+
(handler request respond raise)))))
29+
30+
(defn- wrap-resource-prefer-handler [handler root-path options]
31+
(fn
32+
([request]
33+
(let [response (handler request)]
34+
(if (= 404 (:status response))
35+
(resource-request request root-path options)
36+
response)))
37+
([request respond raise]
38+
(handler request
39+
(fn [response]
40+
(if (= 404 (:status response))
41+
(respond (resource-request request root-path options))
42+
(respond response)))
43+
raise))))
44+
2045
(defn wrap-resource
2146
"Middleware that first checks to see whether the request map matches a static
2247
resource. If it does, the resource is returned in a response map, otherwise
@@ -27,15 +52,12 @@
2752
2853
:loader - resolve the resource using this class loader
2954
:allow-symlinks? - allow symlinks that lead to paths outside the root
30-
classpath directories (defaults to false)"
55+
classpath directories (defaults to false)
56+
:prefer-handler? - prioritize handler response over resources (defaults to
57+
false)"
3158
([handler root-path]
3259
(wrap-resource handler root-path {}))
3360
([handler root-path options]
34-
(fn
35-
([request]
36-
(or (resource-request request root-path options)
37-
(handler request)))
38-
([request respond raise]
39-
(if-let [response (resource-request request root-path options)]
40-
(respond response)
41-
(handler request respond raise))))))
61+
(if (:prefer-handler? options)
62+
(wrap-resource-prefer-handler handler root-path options)
63+
(wrap-resource-prefer-resources handler root-path options))))

ring-core/test/ring/middleware/test/resource.clj

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,3 +79,42 @@
7979
response (resource-request request "/ring/assets")]
8080
(is (= (:status response) 200))
8181
(is (nil? (:body response))))))
82+
83+
(defn- prefer-foo-handler
84+
([request]
85+
(if (= (:uri request) "/foo.html")
86+
{:status 200, :headers {}, :body "override"}
87+
{:status 404, :headers {}, :body "not found"}))
88+
([request respond raise]
89+
(respond (prefer-foo-handler request))))
90+
91+
(deftest test-wrap-resource-with-prefer-handler
92+
(let [handler (wrap-resource prefer-foo-handler
93+
"/ring/assets"
94+
{:prefer-handler? true})]
95+
96+
(testing "middleware serves resource (synchronously)"
97+
(let [response (handler {:request-method :get, :uri "/index.html"})]
98+
(is (= 200 (:status response)))
99+
(is (= "index" (slurp (:body response))))))
100+
101+
(testing "middleware serves resource (asynchronously)"
102+
(let [response (promise)
103+
error (promise)]
104+
(handler {:request-method :get, :uri "/index.html"} response error)
105+
(is (= 200 (:status @response)))
106+
(is (= "index" (slurp (:body @response))))
107+
(is (not (realized? error)))))
108+
109+
(testing "handler serves resource (synchronously)"
110+
(let [response (handler {:request-method :get, :uri "/foo.html"})]
111+
(is (= 200 (:status response)))
112+
(is (= "override" (:body response)))))
113+
114+
(testing "handler serves resource (asynchronously)"
115+
(let [response (promise)
116+
error (promise)]
117+
(handler {:request-method :get, :uri "/foo.html"} response error)
118+
(is (= 200 (:status @response)))
119+
(is (= "override" (:body @response)))
120+
(is (not (realized? error)))))))

0 commit comments

Comments
 (0)