1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- 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
- }
|