@@ -14,6 +14,7 @@ import (
1414 "log/slog"
1515 "math"
1616 "mime/multipart"
17+ "net"
1718 "net/http"
1819 "net/http/httptest"
1920 "net/url"
@@ -1220,91 +1221,42 @@ func TestContext_Bind(t *testing.T) {
12201221}
12211222
12221223func TestContext_RealIP (t * testing.T ) {
1223- tests := []struct {
1224- c * Context
1225- s string
1224+ _ , ipv6ForRemoteAddrExternalRange , _ := net .ParseCIDR ("2001:db8::/64" )
1225+
1226+ var testCases = []struct {
1227+ name string
1228+ givenIPExtrator IPExtractor
1229+ whenReq * http.Request
1230+ expect string
12261231 }{
12271232 {
1228- & Context {
1229- request : & http.Request {
1230- Header : http.Header {HeaderXForwardedFor : []string {"127.0.0.1, 127.0.1.1, " }},
1231- },
1232- },
1233- "127.0.0.1" ,
1233+ name : "ip from remote addr" ,
1234+ givenIPExtrator : nil ,
1235+ whenReq : & http.Request {RemoteAddr : "89.89.89.89:1654" },
1236+ expect : "89.89.89.89" ,
12341237 },
12351238 {
1236- & Context {
1237- request : & http.Request {
1238- Header : http.Header {HeaderXForwardedFor : []string {"127.0.0.1,127.0.1.1" }},
1239- },
1240- },
1241- "127.0.0.1" ,
1242- },
1243- {
1244- & Context {
1245- request : & http.Request {
1246- Header : http.Header {HeaderXForwardedFor : []string {"127.0.0.1" }},
1239+ name : "ip from ip extractor" ,
1240+ givenIPExtrator : ExtractIPFromRealIPHeader (TrustIPRange (ipv6ForRemoteAddrExternalRange )),
1241+ whenReq : & http.Request {
1242+ Header : http.Header {
1243+ HeaderXRealIP : []string {"[2001:db8::113:199]" },
1244+ HeaderXForwardedFor : []string {"[2001:db8::113:198], [2001:db8::113:197]" }, // <-- should not affect anything
12471245 },
1246+ RemoteAddr : "[2001:db8::113:1]:8080" ,
12481247 },
1249- "127.0.0.1" ,
1250- },
1251- {
1252- & Context {
1253- request : & http.Request {
1254- Header : http.Header {HeaderXForwardedFor : []string {"[2001:db8:85a3:8d3:1319:8a2e:370:7348], 2001:db8::1, " }},
1255- },
1256- },
1257- "2001:db8:85a3:8d3:1319:8a2e:370:7348" ,
1258- },
1259- {
1260- & Context {
1261- request : & http.Request {
1262- Header : http.Header {HeaderXForwardedFor : []string {"[2001:db8:85a3:8d3:1319:8a2e:370:7348],[2001:db8::1]" }},
1263- },
1264- },
1265- "2001:db8:85a3:8d3:1319:8a2e:370:7348" ,
1266- },
1267- {
1268- & Context {
1269- request : & http.Request {
1270- Header : http.Header {HeaderXForwardedFor : []string {"2001:db8:85a3:8d3:1319:8a2e:370:7348" }},
1271- },
1272- },
1273- "2001:db8:85a3:8d3:1319:8a2e:370:7348" ,
1274- },
1275- {
1276- & Context {
1277- request : & http.Request {
1278- Header : http.Header {
1279- "X-Real-Ip" : []string {"192.168.0.1" },
1280- },
1281- },
1282- },
1283- "192.168.0.1" ,
1284- },
1285- {
1286- & Context {
1287- request : & http.Request {
1288- Header : http.Header {
1289- "X-Real-Ip" : []string {"[2001:db8::1]" },
1290- },
1291- },
1292- },
1293- "2001:db8::1" ,
1294- },
1295-
1296- {
1297- & Context {
1298- request : & http.Request {
1299- RemoteAddr : "89.89.89.89:1654" ,
1300- },
1301- },
1302- "89.89.89.89" ,
1248+ expect : "2001:db8::113:199" ,
13031249 },
13041250 }
1305-
1306- for _ , tt := range tests {
1307- assert .Equal (t , tt .s , tt .c .RealIP ())
1251+ for _ , tc := range testCases {
1252+ t .Run (tc .name , func (t * testing.T ) {
1253+ e := New ()
1254+ c := e .NewContext (tc .whenReq , nil )
1255+ if tc .givenIPExtrator != nil {
1256+ e .IPExtractor = tc .givenIPExtrator
1257+ }
1258+ assert .Equal (t , tc .expect , c .RealIP ())
1259+ })
13081260 }
13091261}
13101262
0 commit comments