package geodb import ( "net" "net/http" "strings" ) // Utilities function func GetRequesterIP(r *http.Request) string { ip := r.Header.Get("X-Forwarded-For") if ip == "" { ip = r.Header.Get("X-Real-IP") if ip == "" { ip = strings.Split(r.RemoteAddr, ":")[0] } } return ip } // Match the IP address with a wildcard string func MatchIpWildcard(ipAddress, wildcard string) bool { // Split IP address and wildcard into octets ipOctets := strings.Split(ipAddress, ".") wildcardOctets := strings.Split(wildcard, ".") // Check that both have 4 octets if len(ipOctets) != 4 || len(wildcardOctets) != 4 { return false } // Check each octet to see if it matches the wildcard or is an exact match for i := 0; i < 4; i++ { if wildcardOctets[i] == "*" { continue } if ipOctets[i] != wildcardOctets[i] { return false } } return true } // Match ip address with CIDR func MatchIpCIDR(ip string, cidr string) bool { // parse the CIDR string _, cidrnet, err := net.ParseCIDR(cidr) if err != nil { return false } // parse the IP address ipAddr := net.ParseIP(ip) // check if the IP address is within the CIDR range return cidrnet.Contains(ipAddr) } // Check if a ip is private IP range func IsPrivateIP(ipStr string) bool { ip := net.ParseIP(ipStr) if ip == nil { return false } return ip.IsPrivate() } // Check if an Ip string is ipv6 func IsIPv6(ipStr string) bool { ip := net.ParseIP(ipStr) if ip == nil { return false } return ip.To4() == nil && ip.To16() != nil }