package common import ( "bytes" "encoding/base64" "encoding/binary" "github.com/cnlh/nps/lib/crypt" "io/ioutil" "net" "net/http" "os" "regexp" "strconv" "strings" ) //Judging Compression Mode func GetCompressType(compress string) (int, int) { switch compress { case "": return COMPRESS_NONE_DECODE, COMPRESS_NONE_ENCODE case "snappy": return COMPRESS_SNAPY_DECODE, COMPRESS_SNAPY_ENCODE default: return COMPRESS_NONE_DECODE, COMPRESS_NONE_ENCODE } return COMPRESS_NONE_DECODE, COMPRESS_NONE_ENCODE } //Get the corresponding IP address through domain name func GetHostByName(hostname string) string { if !DomainCheck(hostname) { return hostname } ips, _ := net.LookupIP(hostname) if ips != nil { for _, v := range ips { if v.To4() != nil { return v.String() } } } return "" } //Check the legality of domain func DomainCheck(domain string) bool { var match bool IsLine := "^((http://)|(https://))?([a-zA-Z0-9]([a-zA-Z0-9\\-]{0,61}[a-zA-Z0-9])?\\.)+[a-zA-Z]{2,6}(/)" NotLine := "^((http://)|(https://))?([a-zA-Z0-9]([a-zA-Z0-9\\-]{0,61}[a-zA-Z0-9])?\\.)+[a-zA-Z]{2,6}" match, _ = regexp.MatchString(IsLine, domain) if !match { match, _ = regexp.MatchString(NotLine, domain) } return match } //Check if the Request request is validated func CheckAuth(r *http.Request, user, passwd string) bool { s := strings.SplitN(r.Header.Get("Authorization"), " ", 2) if len(s) != 2 { return false } b, err := base64.StdEncoding.DecodeString(s[1]) if err != nil { return false } pair := strings.SplitN(string(b), ":", 2) if len(pair) != 2 { return false } return pair[0] == user && pair[1] == passwd } //get bool by str func GetBoolByStr(s string) bool { switch s { case "1", "true": return true } return false } //get str by bool func GetStrByBool(b bool) string { if b { return "1" } return "0" } //int func GetIntNoErrByStr(str string) int { i, _ := strconv.Atoi(str) return i } //Get verify value func Getverifyval(vkey string) string { return crypt.Md5(vkey) } //Change headers and host of request func ChangeHostAndHeader(r *http.Request, host string, header string, addr string) { if host != "" { r.Host = host } if header != "" { h := strings.Split(header, "\n") for _, v := range h { hd := strings.Split(v, ":") if len(hd) == 2 { r.Header.Set(hd[0], hd[1]) } } } addr = strings.Split(addr, ":")[0] r.Header.Set("X-Forwarded-For", addr) r.Header.Set("X-Real-IP", addr) } //Read file content by file path func ReadAllFromFile(filePath string) ([]byte, error) { f, err := os.Open(filePath) if err != nil { return nil, err } return ioutil.ReadAll(f) } // FileExists reports whether the named file or directory exists. func FileExists(name string) bool { if _, err := os.Stat(name); err != nil { if os.IsNotExist(err) { return false } } return true } //Judge whether the TCP port can open normally func TestTcpPort(port int) bool { l, err := net.ListenTCP("tcp", &net.TCPAddr{net.ParseIP("0.0.0.0"), port, ""}) defer func() { if l != nil { l.Close() } }() if err != nil { return false } return true } //Judge whether the UDP port can open normally func TestUdpPort(port int) bool { l, err := net.ListenUDP("udp", &net.UDPAddr{net.ParseIP("0.0.0.0"), port, ""}) defer func() { if l != nil { l.Close() } }() if err != nil { return false } return true } //Write length and individual byte data //Length prevents sticking //# Characters are used to separate data func BinaryWrite(raw *bytes.Buffer, v ...string) { buffer := new(bytes.Buffer) var l int32 for _, v := range v { l += int32(len([]byte(v))) + int32(len([]byte(CONN_DATA_SEQ))) binary.Write(buffer, binary.LittleEndian, []byte(v)) binary.Write(buffer, binary.LittleEndian, []byte(CONN_DATA_SEQ)) } binary.Write(raw, binary.LittleEndian, l) binary.Write(raw, binary.LittleEndian, buffer.Bytes()) } func InStrArr(arr []string, val string) bool { for _, v := range arr { if v == val { return true } } return false } func InIntArr(arr []int, val int) bool { for _, v := range arr { if v == val { return true } } return false } func GetPorts(p string) []int { var ps []int arr := strings.Split(p, ",") for _, v := range arr { fw := strings.Split(v, "-") if len(fw) == 2 { if IsPort(fw[0]) && IsPort(fw[1]) { start, _ := strconv.Atoi(fw[0]) end, _ := strconv.Atoi(fw[1]) for i := start; i <= end; i++ { ps = append(ps, i) } } else { continue } } else if IsPort(v) { p, _ := strconv.Atoi(v) ps = append(ps, p) } } return ps } func IsPort(p string) bool { pi, err := strconv.Atoi(p) if err != nil { return false } if pi > 65536 || pi < 1 { return false } return true } func FormatAddress(s string) string { if strings.Contains(s, ":") { return s } return "127.0.0.1:" + s } func GetIpByAddr(addr string) string { arr := strings.Split(addr, ":") return arr[0] }