diff options
author | Frédéric Guillot <fred@miniflux.net> | 2018-06-01 07:22:18 -0700 |
---|---|---|
committer | Frédéric Guillot <fred@miniflux.net> | 2018-06-01 07:22:31 -0700 |
commit | 3b39f0883c60b6978c6c6df2c0029bd4c96613fe (patch) | |
tree | f601e0fc314da8cee5001f208b46482262f5be14 /vendor/github.com/tomasen/realip/realip.go | |
parent | cf7a7e25fbf94c16ca08ff3e889bdd4373751e2c (diff) |
Rewrite RealIP() to avoid returning an empty string
Diffstat (limited to 'vendor/github.com/tomasen/realip/realip.go')
-rw-r--r-- | vendor/github.com/tomasen/realip/realip.go | 89 |
1 files changed, 0 insertions, 89 deletions
diff --git a/vendor/github.com/tomasen/realip/realip.go b/vendor/github.com/tomasen/realip/realip.go deleted file mode 100644 index e2803a2..0000000 --- a/vendor/github.com/tomasen/realip/realip.go +++ /dev/null @@ -1,89 +0,0 @@ -package realip - -import ( - "errors" - "net" - "net/http" - "strings" -) - -var cidrs []*net.IPNet - -func init() { - maxCidrBlocks := []string{ - "127.0.0.1/8", // localhost - "10.0.0.0/8", // 24-bit block - "172.16.0.0/12", // 20-bit block - "192.168.0.0/16", // 16-bit block - "169.254.0.0/16", // link local address - "::1/128", // localhost IPv6 - "fc00::/7", // unique local address IPv6 - "fe80::/10", // link local address IPv6 - } - - cidrs = make([]*net.IPNet, len(maxCidrBlocks)) - for i, maxCidrBlock := range maxCidrBlocks { - _, cidr, _ := net.ParseCIDR(maxCidrBlock) - cidrs[i] = cidr - } -} - -// isLocalAddress works by checking if the address is under private CIDR blocks. -// List of private CIDR blocks can be seen on : -// -// https://en.wikipedia.org/wiki/Private_network -// -// https://en.wikipedia.org/wiki/Link-local_address -func isPrivateAddress(address string) (bool, error) { - ipAddress := net.ParseIP(address) - if ipAddress == nil { - return false, errors.New("address is not valid") - } - - for i := range cidrs { - if cidrs[i].Contains(ipAddress) { - return true, nil - } - } - - return false, nil -} - -// FromRequest return client's real public IP address from http request headers. -func FromRequest(r *http.Request) string { - // Fetch header value - xRealIP := r.Header.Get("X-Real-Ip") - xForwardedFor := r.Header.Get("X-Forwarded-For") - - // If both empty, return IP from remote address - if xRealIP == "" && xForwardedFor == "" { - var remoteIP string - - // If there are colon in remote address, remove the port number - // otherwise, return remote address as is - if strings.ContainsRune(r.RemoteAddr, ':') { - remoteIP, _, _ = net.SplitHostPort(r.RemoteAddr) - } else { - remoteIP = r.RemoteAddr - } - - return remoteIP - } - - // Check list of IP in X-Forwarded-For and return the first global address - for _, address := range strings.Split(xForwardedFor, ",") { - address = strings.TrimSpace(address) - isPrivate, err := isPrivateAddress(address) - if !isPrivate && err == nil { - return address - } - } - - // If nothing succeed, return X-Real-IP - return xRealIP -} - -// RealIP is depreciated, use FromRequest instead -func RealIP(r *http.Request) string { - return FromRequest(r) -} |