Skip to content

Commit 85af729

Browse files
committed
Add async support to wrap-frame-options
1 parent f74f34a commit 85af729

2 files changed

Lines changed: 34 additions & 4 deletions

File tree

src/ring/middleware/x_headers.clj

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,14 @@
1313
(str "ALLOW-FROM " (:allow-from frame-options))
1414
(str/upper-case (name frame-options))))
1515

16+
(defn- add-header [response header value]
17+
(some-> response (resp/header header value)))
18+
19+
(defn frame-options-response
20+
"Add the X-Frame-Options header to the response. See: wrap-frame-options."
21+
[response frame-options]
22+
(add-header response "X-Frame-Options" (format-frame-options frame-options)))
23+
1624
(defn wrap-frame-options
1725
"Middleware that adds the X-Frame-Options header to the response. This governs
1826
whether your site can be rendered in a <frame>, <iframe> or <object>, and is
@@ -33,10 +41,13 @@
3341
{:pre [(or (= frame-options :deny)
3442
(= frame-options :sameorigin)
3543
(allow-from? frame-options))]}
36-
(let [header-value (format-frame-options frame-options)]
37-
(fn [request]
38-
(if-let [response (handler request)]
39-
(resp/header response "X-Frame-Options" header-value)))))
44+
(let [header-name "X-Frame-Options"
45+
header-value (format-frame-options frame-options)]
46+
(fn
47+
([request]
48+
(add-header (handler request) header-name header-value))
49+
([request respond raise]
50+
(handler request #(respond (add-header % header-name header-value)) raise)))))
4051

4152
(defn wrap-content-type-options
4253
"Middleware that adds the X-Content-Type-Options header to the response. This

test/ring/middleware/x_headers_test.clj

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,25 @@
4141
(let [handler (wrap-frame-options (constantly nil) :deny)]
4242
(is (nil? (handler (request :get "/"))))))))
4343

44+
(deftest test-wrap-frame-options-cps
45+
(testing "deny"
46+
(let [handler (-> (fn [_ respond _] (respond (response "hello")))
47+
(wrap-frame-options :deny))
48+
resp (promise)
49+
ex (promise)]
50+
(handler (request :get "/") resp ex)
51+
(is (not (realized? ex)))
52+
(is (= (:headers @resp) {"X-Frame-Options" "DENY"}))))
53+
54+
(testing "nil response"
55+
(let [handler (-> (fn [_ respond _] (respond nil))
56+
(wrap-frame-options :deny))
57+
resp (promise)
58+
ex (promise)]
59+
(handler (request :get "/") resp ex)
60+
(is (not (realized? ex)))
61+
(is (nil? @resp)))))
62+
4463
(deftest test-wrap-content-type-options
4564
(let [handle-hello (constantly
4665
(-> (response "hello")

0 commit comments

Comments
 (0)