Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alist-org
GitHub Repository: alist-org/alist
Path: blob/main/pkg/utils/ip.go
1560 views
1
package utils
2
3
import (
4
"net"
5
"net/http"
6
"strings"
7
)
8
9
func ClientIP(r *http.Request) string {
10
xForwardedFor := r.Header.Get("X-Forwarded-For")
11
ip := strings.TrimSpace(strings.Split(xForwardedFor, ",")[0])
12
if ip != "" {
13
return ip
14
}
15
16
ip = strings.TrimSpace(r.Header.Get("X-Real-Ip"))
17
if ip != "" {
18
return ip
19
}
20
21
if ip, _, err := net.SplitHostPort(strings.TrimSpace(r.RemoteAddr)); err == nil {
22
return ip
23
}
24
25
return ""
26
}
27
28
func IsLocalIPAddr(ip string) bool {
29
return IsLocalIP(net.ParseIP(ip))
30
}
31
32
func IsLocalIP(ip net.IP) bool {
33
if ip == nil {
34
return false
35
}
36
if ip.IsLoopback() {
37
return true
38
}
39
40
ip4 := ip.To4()
41
if ip4 == nil {
42
return false
43
}
44
45
return ip4[0] == 10 || // 10.0.0.0/8
46
(ip4[0] == 172 && ip4[1] >= 16 && ip4[1] <= 31) || // 172.16.0.0/12
47
(ip4[0] == 169 && ip4[1] == 254) || // 169.254.0.0/16
48
(ip4[0] == 192 && ip4[1] == 168) // 192.168.0.0/16
49
}
50
51