diff --git a/context.go b/context.go index d180dd87..f5f0de4a 100644 --- a/context.go +++ b/context.go @@ -251,17 +251,19 @@ func (c *Context) BindWith(obj interface{}, b binding.Binding) error { // Best effort algoritm to return the real client IP, it parses // X-Real-IP and X-Forwarded-For in order to work properly with reverse-proxies such us: nginx or haproxy. func (c *Context) ClientIP() string { - clientIP := strings.TrimSpace(c.requestHeader("X-Real-Ip")) - if len(clientIP) > 0 { - return clientIP - } - clientIP = c.requestHeader("X-Forwarded-For") - if index := strings.IndexByte(clientIP, ','); index >= 0 { - clientIP = clientIP[0:index] - } - clientIP = strings.TrimSpace(clientIP) - if len(clientIP) > 0 { - return clientIP + if c.engine.ForwardedByClientIP { + clientIP := strings.TrimSpace(c.requestHeader("X-Real-Ip")) + if len(clientIP) > 0 { + return clientIP + } + clientIP = c.requestHeader("X-Forwarded-For") + if index := strings.IndexByte(clientIP, ','); index >= 0 { + clientIP = clientIP[0:index] + } + clientIP = strings.TrimSpace(clientIP) + if len(clientIP) > 0 { + return clientIP + } } return strings.TrimSpace(c.Request.RemoteAddr) } diff --git a/gin.go b/gin.go index d2887ed2..a5f87647 100644 --- a/gin.go +++ b/gin.go @@ -14,7 +14,7 @@ import ( "github.com/gin-gonic/gin/render" ) -const Version = "v1.0rc1" +const Version = "v1.0rc2" var default404Body = []byte("404 page not found") var default405Body = []byte("405 method not allowed") @@ -59,6 +59,7 @@ type ( // If no other Method is allowed, the request is delegated to the NotFound // handler. HandleMethodNotAllowed bool + ForwardedByClientIP bool } ) @@ -74,7 +75,8 @@ func New() *Engine { RedirectTrailingSlash: true, RedirectFixedPath: false, HandleMethodNotAllowed: false, - trees: make(methodTrees, 0, 5), + ForwardedByClientIP: true, + trees: make(methodTrees, 0, 9), } engine.RouterGroup.engine = engine engine.pool.New = func() interface{} { @@ -90,7 +92,7 @@ func Default() *Engine { return engine } -func (engine *Engine) allocateContext() (context *Context) { +func (engine *Engine) allocateContext() *Context { return &Context{engine: engine} }