Skip to content

Commit f74f34a

Browse files
committed
Add async support to wrap-forwarded-remote-addr
1 parent 8fb7052 commit f74f34a

2 files changed

Lines changed: 35 additions & 5 deletions

File tree

src/ring/middleware/proxy_headers.clj

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,21 @@
22
"Middleware for handling headers set by HTTP proxies."
33
(:require [clojure.string :as str]))
44

5+
(defn forwarded-remote-addr-request
6+
"Change the :remote-addr key of the request map to the last value present in
7+
the X-Forwarded-For header. See: wrap-forwarded-remote-addr."
8+
[request]
9+
(if-let [forwarded-for (get-in request [:headers "x-forwarded-for"])]
10+
(let [remote-addr (str/trim (re-find #"[^,]*$" forwarded-for))]
11+
(assoc request :remote-addr remote-addr))
12+
request))
13+
514
(defn wrap-forwarded-remote-addr
615
"Middleware that changes the :remote-addr of the request map to the
716
last value present in the X-Forwarded-For header."
817
[handler]
9-
(fn [request]
10-
(if-let [forwarded-for (get-in request [:headers "x-forwarded-for"])]
11-
(let [remote-addr (str/trim (re-find #"[^,]*$" forwarded-for))]
12-
(handler (assoc request :remote-addr remote-addr)))
13-
(handler request))))
18+
(fn
19+
([request]
20+
(handler (forwarded-remote-addr-request request)))
21+
([request respond raise]
22+
(handler (forwarded-remote-addr-request request) respond raise))))

test/ring/middleware/proxy_headers_test.clj

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,24 @@
2424
(header "x-forwarded-for" "10.0.1.9, 192.168.4.98, 1.2.3.4"))
2525
resp (handler req)]
2626
(is (= (:body resp) "1.2.3.4"))))))
27+
28+
(deftest test-wrap-forwarded-remote-addr-cps
29+
(let [handler (wrap-forwarded-remote-addr
30+
(fn [request respond _] (respond (response (:remote-addr request)))))]
31+
(testing "without x-forwarded-for"
32+
(let [req (assoc (request :get "/") :remote-addr "1.2.3.4")
33+
resp (promise)
34+
ex (promise)]
35+
(handler req resp ex)
36+
(is (not (realized? ex)))
37+
(is (= (:body @resp) "1.2.3.4"))))
38+
39+
(testing "with x-forwarded-for"
40+
(let [req (-> (request :get "/")
41+
(assoc :remote-addr "127.0.0.1")
42+
(header "x-forwarded-for" "1.2.3.4"))
43+
resp (promise)
44+
ex (promise)]
45+
(handler req resp ex)
46+
(is (not (realized? ex)))
47+
(is (= (:body @resp) "1.2.3.4"))))))

0 commit comments

Comments
 (0)