Adds ForwardedByClientIP option

This commit is contained in:
Manu Mtz-Almeida 2015-06-07 13:51:13 +02:00
parent 042046e1f8
commit 58b5e15870
2 changed files with 18 additions and 14 deletions

View File

@ -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 // 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. // 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 { func (c *Context) ClientIP() string {
clientIP := strings.TrimSpace(c.requestHeader("X-Real-Ip")) if c.engine.ForwardedByClientIP {
if len(clientIP) > 0 { clientIP := strings.TrimSpace(c.requestHeader("X-Real-Ip"))
return clientIP if len(clientIP) > 0 {
} return clientIP
clientIP = c.requestHeader("X-Forwarded-For") }
if index := strings.IndexByte(clientIP, ','); index >= 0 { clientIP = c.requestHeader("X-Forwarded-For")
clientIP = clientIP[0:index] if index := strings.IndexByte(clientIP, ','); index >= 0 {
} clientIP = clientIP[0:index]
clientIP = strings.TrimSpace(clientIP) }
if len(clientIP) > 0 { clientIP = strings.TrimSpace(clientIP)
return clientIP if len(clientIP) > 0 {
return clientIP
}
} }
return strings.TrimSpace(c.Request.RemoteAddr) return strings.TrimSpace(c.Request.RemoteAddr)
} }

8
gin.go
View File

@ -14,7 +14,7 @@ import (
"github.com/gin-gonic/gin/render" "github.com/gin-gonic/gin/render"
) )
const Version = "v1.0rc1" const Version = "v1.0rc2"
var default404Body = []byte("404 page not found") var default404Body = []byte("404 page not found")
var default405Body = []byte("405 method not allowed") 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 // If no other Method is allowed, the request is delegated to the NotFound
// handler. // handler.
HandleMethodNotAllowed bool HandleMethodNotAllowed bool
ForwardedByClientIP bool
} }
) )
@ -74,7 +75,8 @@ func New() *Engine {
RedirectTrailingSlash: true, RedirectTrailingSlash: true,
RedirectFixedPath: false, RedirectFixedPath: false,
HandleMethodNotAllowed: false, HandleMethodNotAllowed: false,
trees: make(methodTrees, 0, 5), ForwardedByClientIP: true,
trees: make(methodTrees, 0, 9),
} }
engine.RouterGroup.engine = engine engine.RouterGroup.engine = engine
engine.pool.New = func() interface{} { engine.pool.New = func() interface{} {
@ -90,7 +92,7 @@ func Default() *Engine {
return engine return engine
} }
func (engine *Engine) allocateContext() (context *Context) { func (engine *Engine) allocateContext() *Context {
return &Context{engine: engine} return &Context{engine: engine}
} }