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
// 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)
}

8
gin.go
View File

@ -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}
}