From fc48db8b9e3763811bd83566ddb6da876aaee840 Mon Sep 17 00:00:00 2001 From: Fazal Date: Mon, 24 Jun 2024 14:33:02 +0500 Subject: [PATCH] feat(httpx): use cf-connecting-ip header for client IP (#786) --- httpx/client_info.go | 2 ++ httpx/client_info_test.go | 13 +++++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/httpx/client_info.go b/httpx/client_info.go index 14f915d5..7bd62ff4 100644 --- a/httpx/client_info.go +++ b/httpx/client_info.go @@ -33,6 +33,8 @@ func GetClientIPAddressesWithoutInternalIPs(ipAddresses []string) (string, error func ClientIP(r *http.Request) string { if trueClientIP := r.Header.Get("True-Client-IP"); trueClientIP != "" { return trueClientIP + } else if cfConnectingIP := r.Header.Get("Cf-Connecting-IP"); cfConnectingIP != "" { + return cfConnectingIP } else if realClientIP := r.Header.Get("X-Real-IP"); realClientIP != "" { return realClientIP } else if forwardedIP := r.Header.Get("X-Forwarded-For"); forwardedIP != "" { diff --git a/httpx/client_info_test.go b/httpx/client_info_test.go index b7a1dba9..62f72206 100644 --- a/httpx/client_info_test.go +++ b/httpx/client_info_test.go @@ -33,26 +33,35 @@ func TestClientIP(t *testing.T) { Header: http.Header{}, } req.Header.Add("true-client-ip", "1.0.0.1") - req.Header.Add("x-real-ip", "1.0.0.2") + req.Header.Add("cf-connecting-ip", "1.0.0.2") + req.Header.Add("x-real-ip", "1.0.0.3") req.Header.Add("x-forwarded-for", "192.168.1.1,1.0.0.3,10.0.0.1") t.Run("true-client-ip", func(t *testing.T) { req := req.Clone(context.Background()) assert.Equal(t, "1.0.0.1", ClientIP(req)) }) - t.Run("x-real-ip", func(t *testing.T) { + t.Run("cf-connecting-ip", func(t *testing.T) { req := req.Clone(context.Background()) req.Header.Del("true-client-ip") assert.Equal(t, "1.0.0.2", ClientIP(req)) }) + t.Run("x-real-ip", func(t *testing.T) { + req := req.Clone(context.Background()) + req.Header.Del("true-client-ip") + req.Header.Del("cf-connecting-ip") + assert.Equal(t, "1.0.0.3", ClientIP(req)) + }) t.Run("x-forwarded-for", func(t *testing.T) { req := req.Clone(context.Background()) req.Header.Del("true-client-ip") + req.Header.Del("cf-connecting-ip") req.Header.Del("x-real-ip") assert.Equal(t, "1.0.0.3", ClientIP(req)) }) t.Run("remote-addr", func(t *testing.T) { req := req.Clone(context.Background()) req.Header.Del("true-client-ip") + req.Header.Del("cf-connecting-ip") req.Header.Del("x-real-ip") req.Header.Del("x-forwarded-for") assert.Equal(t, "1.0.0.4", ClientIP(req))