package httpx import ( "net/http" "net/http/httptest" "testing" "github.com/stretchr/testify/assert" ) func TestRealIP(t *testing.T) { cases := []struct { name string headers map[string]string want string }{ {"no headers", nil, "192.0.2.1:1234"}, {"x-real-ip", map[string]string{"X-Real-IP": "203.0.113.7"}, "203.0.113.7"}, {"invalid x-real-ip", map[string]string{"X-Real-IP": "evil"}, "192.0.2.1:1234"}, {"spoofed true-client-ip", map[string]string{"True-Client-IP": "1.1.1.1"}, "192.0.2.1:1234"}, {"spoofed x-forwarded-for", map[string]string{"X-Forwarded-For": "1.1.1.1"}, "192.0.2.1:1234"}, { "x-real-ip wins over spoofed headers", map[string]string{"X-Real-IP": "203.0.113.7", "True-Client-IP": "1.1.1.1"}, "203.0.113.7", }, } for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { var got string h := RealIP(http.HandlerFunc(func(_ http.ResponseWriter, r *http.Request) { got = r.RemoteAddr })) req := httptest.NewRequest(http.MethodGet, "/", nil) req.RemoteAddr = "192.0.2.1:1234" for k, v := range tc.headers { req.Header.Set(k, v) } h.ServeHTTP(httptest.NewRecorder(), req) assert.Equal(t, tc.want, got) }) } }