1
0
mirror of https://github.com/duke-git/lancet.git synced 2026-02-12 08:42:29 +08:00

feat: net.go, add IsInternalIP, GetRequestPublicIp, EncodeUrl

This commit is contained in:
dudaodong
2022-07-27 15:18:20 +08:00
parent 0cb251f7b8
commit 116ff284c3
3 changed files with 62 additions and 5 deletions

View File

@@ -5,6 +5,8 @@ import (
"io/ioutil"
"net"
"net/http"
"net/url"
"strings"
)
// GetInternalIp return internal ipv4
@@ -47,6 +49,26 @@ func GetPublicIpInfo() (*PublicIpInfo, error) {
return &ip, nil
}
// GetRequestPublicIp return the requested public ip
func GetRequestPublicIp(req *http.Request) string {
var ip string
for _, ip = range strings.Split(req.Header.Get("X-Forwarded-For"), ",") {
if ip = strings.TrimSpace(ip); ip != "" && !IsInternalIP(net.ParseIP(ip)) {
return ip
}
}
if ip = strings.TrimSpace(req.Header.Get("X-Real-Ip")); ip != "" && !IsInternalIP(net.ParseIP(ip)) {
return ip
}
if ip, _, _ = net.SplitHostPort(req.RemoteAddr); !IsInternalIP(net.ParseIP(ip)) {
return ip
}
return ip
}
// GetIps return all ipv4 of system
func GetIps() []string {
var ips []string
@@ -122,3 +144,29 @@ func IsPublicIP(IP net.IP) bool {
}
return false
}
// IsInternalIP verify an ip is intranet or not
func IsInternalIP(IP net.IP) bool {
if IP.IsLoopback() {
return true
}
if ip4 := IP.To4(); ip4 != nil {
return ip4[0] == 10 ||
(ip4[0] == 172 && ip4[1] >= 16 && ip4[1] <= 31) ||
(ip4[0] == 169 && ip4[1] == 254) ||
(ip4[0] == 192 && ip4[1] == 168)
}
return false
}
// EncodeUrl encode url
func EncodeUrl(urlStr string) (string, error) {
URL, err := url.Parse(urlStr)
if err != nil {
return "", err
}
URL.RawQuery = URL.Query().Encode()
return URL.String(), nil
}