Skip to content

Commit 0a20a0e

Browse files
authored
Revert "feat(): add CF-Connecting-IP (#908)" (#966)
This reverts commit cbaac31.
1 parent d9d5e31 commit 0a20a0e

File tree

2 files changed

+19
-81
lines changed

2 files changed

+19
-81
lines changed

middleware/realip.go

+19-32
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,9 @@ import (
99
"strings"
1010
)
1111

12-
var defaultHeaders = []string{
13-
"True-Client-IP", // Cloudflare Enterprise plan
14-
"X-Real-IP",
15-
"X-Forwarded-For",
16-
}
12+
var trueClientIP = http.CanonicalHeaderKey("True-Client-IP")
13+
var xForwardedFor = http.CanonicalHeaderKey("X-Forwarded-For")
14+
var xRealIP = http.CanonicalHeaderKey("X-Real-IP")
1715

1816
// RealIP is a middleware that sets a http.Request's RemoteAddr to the results
1917
// of parsing either the True-Client-IP, X-Real-IP or the X-Forwarded-For headers
@@ -32,7 +30,7 @@ var defaultHeaders = []string{
3230
// how you're using RemoteAddr, vulnerable to an attack of some sort).
3331
func RealIP(h http.Handler) http.Handler {
3432
fn := func(w http.ResponseWriter, r *http.Request) {
35-
if rip := getRealIP(r, defaultHeaders); rip != "" {
33+
if rip := realIP(r); rip != "" {
3634
r.RemoteAddr = rip
3735
}
3836
h.ServeHTTP(w, r)
@@ -41,33 +39,22 @@ func RealIP(h http.Handler) http.Handler {
4139
return http.HandlerFunc(fn)
4240
}
4341

44-
// RealIPFromHeaders is a middleware that sets a http.Request's RemoteAddr to the results
45-
// of parsing the custom headers.
46-
//
47-
// usage:
48-
// r.Use(RealIPFromHeaders("CF-Connecting-IP"))
49-
func RealIPFromHeaders(headers ...string) func(http.Handler) http.Handler {
50-
f := func(h http.Handler) http.Handler {
51-
fn := func(w http.ResponseWriter, r *http.Request) {
52-
if rip := getRealIP(r, headers); rip != "" {
53-
r.RemoteAddr = rip
54-
}
55-
h.ServeHTTP(w, r)
56-
}
57-
return http.HandlerFunc(fn)
58-
}
59-
return f
60-
}
42+
func realIP(r *http.Request) string {
43+
var ip string
6144

62-
func getRealIP(r *http.Request, headers []string) string {
63-
for _, header := range headers {
64-
if ip := r.Header.Get(header); ip != "" {
65-
ips := strings.Split(ip, ",")
66-
if ips[0] == "" || net.ParseIP(ips[0]) == nil {
67-
continue
68-
}
69-
return ips[0]
45+
if tcip := r.Header.Get(trueClientIP); tcip != "" {
46+
ip = tcip
47+
} else if xrip := r.Header.Get(xRealIP); xrip != "" {
48+
ip = xrip
49+
} else if xff := r.Header.Get(xForwardedFor); xff != "" {
50+
i := strings.Index(xff, ",")
51+
if i == -1 {
52+
i = len(xff)
7053
}
54+
ip = xff[:i]
55+
}
56+
if ip == "" || net.ParseIP(ip) == nil {
57+
return ""
7158
}
72-
return ""
59+
return ip
7360
}

middleware/realip_test.go

-49
Original file line numberDiff line numberDiff line change
@@ -113,52 +113,3 @@ func TestInvalidIP(t *testing.T) {
113113
t.Fatal("Invalid IP used.")
114114
}
115115
}
116-
117-
func TestCustomIPHeader(t *testing.T) {
118-
var customHeaderKey = "X-CUSTOM-IP"
119-
req, _ := http.NewRequest("GET", "/", nil)
120-
req.Header.Add(customHeaderKey, "100.100.100.100")
121-
w := httptest.NewRecorder()
122-
123-
r := chi.NewRouter()
124-
r.Use(RealIPFromHeaders(customHeaderKey))
125-
126-
realIP := ""
127-
r.Get("/", func(w http.ResponseWriter, r *http.Request) {
128-
realIP = r.RemoteAddr
129-
w.Write([]byte("Hello World"))
130-
})
131-
r.ServeHTTP(w, req)
132-
133-
if w.Code != 200 {
134-
t.Fatal("Response Code should be 200")
135-
}
136-
137-
if realIP != "100.100.100.100" {
138-
t.Fatal("Test get real IP precedence error.")
139-
}
140-
}
141-
142-
func TestCustomIPHeaderWithoutDefault(t *testing.T) {
143-
req, _ := http.NewRequest("GET", "/", nil)
144-
req.Header.Add("X-REAL-IP", "100.100.100.100")
145-
w := httptest.NewRecorder()
146-
147-
r := chi.NewRouter()
148-
r.Use(RealIPFromHeaders("CF-Connecting-IP"))
149-
150-
realIP := ""
151-
r.Get("/", func(w http.ResponseWriter, r *http.Request) {
152-
realIP = r.RemoteAddr
153-
w.Write([]byte("Hello World"))
154-
})
155-
r.ServeHTTP(w, req)
156-
157-
if w.Code != 200 {
158-
t.Fatal("Response Code should be 200")
159-
}
160-
161-
if realIP != "" {
162-
t.Fatal("Invalid IP used.")
163-
}
164-
}

0 commit comments

Comments
 (0)