Skip to content

Commit 07be76b

Browse files
committed
add new middleware for x-forwarded-proto header support
1 parent 19baf42 commit 07be76b

2 files changed

Lines changed: 47 additions & 0 deletions

File tree

src/ring/middleware/proxy_headers.clj

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,30 @@
2020
(handler (forwarded-remote-addr-request request)))
2121
([request respond raise]
2222
(handler (forwarded-remote-addr-request request) respond raise))))
23+
24+
;; x-forwarded-proto header support
25+
(def ^:private proto-lookup
26+
{"http" :http
27+
"https" :https
28+
"ws" :ws
29+
"wss" :wss})
30+
31+
(defn forwarded-scheme-request
32+
"Change the :scheme key of the request map to the last value present in
33+
the X-Forwarded-Proto header. See: wrap-forwarded-scheme."
34+
[request]
35+
(if-let [forwarded-proto (get-in request [:headers "x-forwarded-proto"])]
36+
(if-let [scheme (proto-lookup (str/lower-case (str/trim forwarded-proto)))]
37+
(assoc request :scheme scheme)
38+
request)
39+
request))
40+
41+
(defn wrap-forwarded-scheme
42+
"Middleware that changes the :scheme of the request map to the
43+
last value present in the X-Forwarded-Proto header."
44+
[handler]
45+
(fn
46+
([request]
47+
(handler (forwarded-scheme-request request)))
48+
([request respond raise]
49+
(handler (forwarded-scheme-request request) respond raise))))

test/ring/middleware/proxy_headers_test.clj

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,3 +45,23 @@
4545
(handler req resp ex)
4646
(is (not (realized? ex)))
4747
(is (= (:body @resp) "1.2.3.4"))))))
48+
49+
50+
(deftest test-wrap-forwarded-proto
51+
(let [handler (wrap-forwarded-scheme (comp response :scheme))]
52+
(testing "without x-forwarded-proto"
53+
(let [req (request :get "/")
54+
resp (handler req)]
55+
(is (= (:body resp) :http))))
56+
57+
(testing "with x-forwarded-proto"
58+
(let [req (-> (request :get "/")
59+
(header "x-forwarded-proto" "https"))
60+
resp (handler req)]
61+
(is (= (:body resp) :https))))
62+
63+
(testing "unknown schemes are ignored"
64+
(let [req (-> (request :get "/")
65+
(header "x-forwarded-proto" "ftp"))
66+
resp (handler req)]
67+
(is (= (:body resp) :http))))))

0 commit comments

Comments
 (0)