package kmux import ( "net" "net/http" "strings" ) // MatchIPGlob match ip to glob pattern, ex. * 192.168.* 192.* 192.168.51.*2* func MatchIPGlob(ip, pattern string) bool { parts := strings.Split(pattern, ".") seg := strings.Split(ip, ".") for i, part := range parts { // normalize pattern to 3 digits switch len(part) { case 1: if part == "*" { part = "***" } else { part = "00" + part } case 2: if strings.HasPrefix(part, "*") { part = "*" + part } else if strings.HasSuffix(part, "*") { part = part + "*" } else { part = "0" + part } } // normalize ip to 3 digits switch len(seg[i]) { case 1: seg[i] = "00" + seg[i] case 2: seg[i] = "0" + seg[i] } for j := range part { if string(part[j]) == "*" { continue } if part[j] != seg[i][j] { return false } } } return true } // GetIP gets the real ip (could still be tricked by proxy) func GetIP(r *http.Request) string { ip := r.Header.Get("X-Real-Ip") if ip == "" { ips := r.Header.Get("X-Forwarded-For") ipArr := strings.Split(ips, ",") ip = strings.Trim(ipArr[len(ipArr)-1], " ") } if ip == "" { var err error ip, _, err = net.SplitHostPort(r.RemoteAddr) if err != nil { ip = r.RemoteAddr } } return ip }