diff --git a/context.go b/context.go index b784c14b..28103c77 100644 --- a/context.go +++ b/context.go @@ -8,6 +8,7 @@ import ( "errors" "io" "math" + "net" "net/http" "strings" "time" @@ -291,7 +292,13 @@ func (c *Context) ClientIP() string { return clientIP } } - return strings.TrimSpace(c.Request.RemoteAddr) + + // http.Request.RemoteAddr also contains the connection's port number; only return the client's ip + host, _, err := net.SplitHostPort(c.Request.RemoteAddr) + if err != nil { + host = c.Request.RemoteAddr + } + return strings.TrimSpace(host) } // ContentType returns the Content-Type header of the request. diff --git a/context_test.go b/context_test.go index efdba7b2..2e2aaca2 100644 --- a/context_test.go +++ b/context_test.go @@ -531,6 +531,9 @@ func TestContextClientIP(t *testing.T) { c.Request.Header.Del("X-Forwarded-For") assert.Equal(t, c.ClientIP(), "40.40.40.40") + + c.Request.RemoteAddr = " 40.40.40.40:12345 " + assert.Equal(t, c.ClientIP(), "40.40.40.40") } func TestContextContentType(t *testing.T) {