25 lines
532 B
Go
25 lines
532 B
Go
|
package httputil
|
||
|
|
||
|
import (
|
||
|
"net"
|
||
|
"net/http"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
// GetClientAddr returns the first value in X-Forwarded-For if it exists
|
||
|
// otherwise fall back to use RemoteAddr
|
||
|
func GetClientAddr(r *http.Request) string {
|
||
|
addr := r.RemoteAddr
|
||
|
if s := r.Header.Get("X-Forwarded-For"); s != "" {
|
||
|
ips := strings.Split(s, ",")
|
||
|
// assume the first one is the client address
|
||
|
if len(ips) != 0 {
|
||
|
// validate the ip
|
||
|
if realIP := net.ParseIP(ips[0]); realIP != nil {
|
||
|
addr = strings.TrimSpace(ips[0])
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return addr
|
||
|
}
|