mirror of https://github.com/Xhofe/alist
50 lines
890 B
Go
50 lines
890 B
Go
package utils
|
|
|
|
import (
|
|
"net"
|
|
"net/http"
|
|
"strings"
|
|
)
|
|
|
|
func ClientIP(r *http.Request) string {
|
|
xForwardedFor := r.Header.Get("X-Forwarded-For")
|
|
ip := strings.TrimSpace(strings.Split(xForwardedFor, ",")[0])
|
|
if ip != "" {
|
|
return ip
|
|
}
|
|
|
|
ip = strings.TrimSpace(r.Header.Get("X-Real-Ip"))
|
|
if ip != "" {
|
|
return ip
|
|
}
|
|
|
|
if ip, _, err := net.SplitHostPort(strings.TrimSpace(r.RemoteAddr)); err == nil {
|
|
return ip
|
|
}
|
|
|
|
return ""
|
|
}
|
|
|
|
func IsLocalIPAddr(ip string) bool {
|
|
return IsLocalIP(net.ParseIP(ip))
|
|
}
|
|
|
|
func IsLocalIP(ip net.IP) bool {
|
|
if ip == nil {
|
|
return false
|
|
}
|
|
if ip.IsLoopback() {
|
|
return true
|
|
}
|
|
|
|
ip4 := ip.To4()
|
|
if ip4 == nil {
|
|
return false
|
|
}
|
|
|
|
return ip4[0] == 10 || // 10.0.0.0/8
|
|
(ip4[0] == 172 && ip4[1] >= 16 && ip4[1] <= 31) || // 172.16.0.0/12
|
|
(ip4[0] == 169 && ip4[1] == 254) || // 169.254.0.0/16
|
|
(ip4[0] == 192 && ip4[1] == 168) // 192.168.0.0/16
|
|
}
|