package clientserver import ( "errors" "fmt" "log" "net/http" "regexp" "strconv" "strings" ) const ( MAX_PORT_NUM = 65535 MIN_PORT_NUM = 1024 ) // Returns false if ipv4 `correct`. func wrongIPAddresFormat(ipv4 string) bool { re, err := regexp.Compile(`^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$`) if err != nil { log.Println(err) } return !re.Match([]byte(ipv4)) } // Wrapp and throw an error to log client func throwHTTPError(err_text string, code int, w *http.ResponseWriter) error { http.Error(*w, err_text, code) eText := fmt.Sprintf("Error: %d %vr", code, err_text) return errors.New(eText) } // Wait string in format "10.10.10.10:8080", where `10.10.10.10` IPv4, // and `8080` port. If ip or port has wrong format, returns error. func ParsePartnersAddress(ipAndPort string) (string, int64, error) { var err error var ip string var port int64 iap := strings.Split(ipAndPort, ":") if len(iap) != 2 { err = errors.New(fmt.Sprintf("Wrong partners 'ip:port' format: %v", ipAndPort)) return ip, port, err } ip = iap[0] if wrongIPAddresFormat(ip) { err = errors.New(fmt.Sprintf("Wrong ip address format in partner ip: %v", ip)) } port, e := strconv.ParseInt(iap[1], 10, 64) if e != nil { err = errors.New(fmt.Sprintf("Wrong port format in partner ip: %v", e)) return ip, port, err } if port > MAX_PORT_NUM { err = errors.New(fmt.Sprintf("Wrong port in partner ip: grater than %v", MAX_PORT_NUM)) } if port < MIN_PORT_NUM { err = errors.New(fmt.Sprintf("Wrong port in partner ip: %v lower than %v", port, MIN_PORT_NUM)) } return ip, port, err }