| @ -0,0 +1,86 @@ | |||||
| package network | |||||
| import ( | |||||
| "io/ioutil" | |||||
| "net/http" | |||||
| "strings" | |||||
| ) | |||||
| /** | |||||
| * 自定义HTTP请求 | |||||
| */ | |||||
| func MethodHttp(method, url, param string, header ...map[string]string) ([]byte, error) { | |||||
| httpClient := &http.Client{} | |||||
| req, err := http.NewRequest(method, url, strings.NewReader(param)) | |||||
| if err != nil { | |||||
| return []byte(""), err | |||||
| } | |||||
| req.Header.Set("Content-Type", "application/x-www-form-urlencoded") | |||||
| if len(header) > 0 { | |||||
| for _, item := range header { | |||||
| for k, v := range item { | |||||
| req.Header.Set(k, v) | |||||
| } | |||||
| } | |||||
| } | |||||
| resp, err := httpClient.Do(req) | |||||
| if err != nil { | |||||
| return []byte(""), err | |||||
| } | |||||
| defer resp.Body.Close() | |||||
| body, err := ioutil.ReadAll(resp.Body) | |||||
| if err != nil { | |||||
| return []byte(""), err | |||||
| } | |||||
| return body, nil | |||||
| } | |||||
| /** | |||||
| * 自定义HTTP请求 | |||||
| */ | |||||
| func SendHttp(method, url string, param map[string]string, header ...map[string]string) ([]byte, error) { | |||||
| httpClient := &http.Client{} | |||||
| paramStr := "" | |||||
| if len(param) > 0 { | |||||
| for key, value := range param { | |||||
| paramStr += key + "=" + value + "&" | |||||
| } | |||||
| paramStr = paramStr[0 : len(paramStr)-1] | |||||
| } | |||||
| req, err := http.NewRequest(method, url, strings.NewReader(paramStr)) | |||||
| if err != nil { | |||||
| return []byte(""), err | |||||
| } | |||||
| req.Header.Set("Content-Type", "application/x-www-form-urlencoded") | |||||
| if len(header) > 0 { | |||||
| for _, item := range header { | |||||
| for k, v := range item { | |||||
| req.Header.Set(k, v) | |||||
| } | |||||
| } | |||||
| } | |||||
| resp, err := httpClient.Do(req) | |||||
| if err != nil { | |||||
| return []byte(""), err | |||||
| } | |||||
| defer resp.Body.Close() | |||||
| body, err := ioutil.ReadAll(resp.Body) | |||||
| if err != nil { | |||||
| return []byte(""), err | |||||
| } | |||||
| return body, nil | |||||
| } | |||||
| @ -0,0 +1,52 @@ | |||||
| package network | |||||
| import ( | |||||
| "fmt" | |||||
| "net/url" | |||||
| "testing" | |||||
| ) | |||||
| func Test_MethodHttp(t *testing.T) { | |||||
| uri := "http://Controller_Ip/SaaS/nextcloud/remote.php/webdav" | |||||
| u, err := url.Parse(uri) | |||||
| fmt.Println(u, err) | |||||
| fmt.Println(u.Scheme, u.Host, u.Path, u.Fragment, u.RawQuery) | |||||
| // url := "http://admin:123456@10.0.66.29/SaaS/nextcloud/remote.php/dav/files/admin/CZNTQK2" | |||||
| // data, err := MethodHttp("DELETE", url, "") | |||||
| // t.Log(string(data), err) | |||||
| // url := "http://admin:123456@10.0.66.29/nextcloud/index.php/apps/files/ajax/getstoragestats.php?dir=/" | |||||
| // data, err := MethodHttp("GET", url, "") | |||||
| // t.Log(string(data)) | |||||
| // t.Log(err) | |||||
| // url = "http://admin:123456@10.0.66.29/nextcloud/remote.php/dav/files/admin/" | |||||
| // data, err = MethodHttp("PROPFIND", url, "") | |||||
| // t.Log(string(data)) | |||||
| // t.Log(err) | |||||
| // url = "http://admin:123456@10.0.66.29/nextcloud/index.php/settings/ajax/setquota.php" | |||||
| // args := "username=admin"a=30GB&norequesttoken=true" | |||||
| // data, err = MethodHttp("POST", url, args) | |||||
| // t.Log(string(data)) | |||||
| // t.Log(err) | |||||
| // url = "http://admin:123456@10.0.66.29/nextcloud/index.php/apps/files/ajax/list.php?dir=/Photos" | |||||
| // data, err = MethodHttp("GET", url, "") | |||||
| // t.Log(string(data)) | |||||
| // t.Log(err) | |||||
| // url = "http://" + "raydesktop.gxycloud.com" + ":" + "8082" + "/extranet" | |||||
| // args = "key=DBKHPW39" | |||||
| // data, err = MethodHttp("POST", url, args) | |||||
| // t.Log(string(data)) | |||||
| // t.Log(err) | |||||
| // url = "http://admin:123456@10.0.66.29/nextcloud/remote.php/dav/files/admin/ncikZ0fxX1gy5qV2018012504/7b531e26d2dee30271" | |||||
| // data, err = MethodHttp("MKCOL", url, "") | |||||
| // t.Log(string(data)) | |||||
| // t.Log(err) | |||||
| } | |||||
| @ -0,0 +1,210 @@ | |||||
| package network | |||||
| import ( | |||||
| "errors" | |||||
| "net" | |||||
| "net/http" | |||||
| "strconv" | |||||
| "strings" | |||||
| ) | |||||
| /** | |||||
| * 取本地IP | |||||
| */ | |||||
| func GetLocalIps() []string { | |||||
| addrs, err := net.InterfaceAddrs() | |||||
| var list []string | |||||
| if err != nil { | |||||
| return list | |||||
| } | |||||
| for _, address := range addrs { | |||||
| // 检查ip地址判断是否回环地址 | |||||
| if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() { | |||||
| if ipnet.IP.To4() != nil && !ipnet.IP.IsLinkLocalUnicast() { | |||||
| if IsPrivateIp(ipnet.IP.String()) { | |||||
| list = append(list, ipnet.IP.String()) | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| return list | |||||
| } | |||||
| /** | |||||
| * 取外网IP | |||||
| */ | |||||
| func GetInternetIps() []string { | |||||
| addrs, err := net.InterfaceAddrs() | |||||
| var list []string | |||||
| if err != nil { | |||||
| return list | |||||
| } | |||||
| for _, address := range addrs { | |||||
| // 检查ip地址判断是否回环地址 | |||||
| if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() { | |||||
| if ipnet.IP.To4() != nil && !ipnet.IP.IsLinkLocalUnicast() { | |||||
| if !IsPrivateIp(ipnet.IP.String()) { | |||||
| list = append(list, ipnet.IP.String()) | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| return list | |||||
| } | |||||
| /** | |||||
| * 是否本地(局域网)IP | |||||
| */ | |||||
| func IsPrivateIp(ip string) bool { | |||||
| process_ip := getIpNumber(ip) | |||||
| /** | |||||
| * 私有IP:A类 10.0.0.0 -10.255.255.255 | |||||
| * B类 172.16.0.0 -172.31.255.255 | |||||
| * C类 192.168.0.0 -192.168.255.255 | |||||
| * D类 127.0.0.0 -127.255.255.255(环回地址) | |||||
| */ | |||||
| a_begin := getIpNumber("10.0.0.0") | |||||
| a_end := getIpNumber("10.255.255.255") | |||||
| if process_ip >= a_begin && process_ip <= a_end { | |||||
| return true | |||||
| } | |||||
| b_begin := getIpNumber("172.16.0.0") | |||||
| b_end := getIpNumber("172.31.255.255") | |||||
| if process_ip >= b_begin && process_ip <= b_end { | |||||
| return true | |||||
| } | |||||
| c_begin := getIpNumber("192.168.0.0") | |||||
| c_end := getIpNumber("192.168.255.255") | |||||
| if process_ip >= c_begin && process_ip <= c_end { | |||||
| return true | |||||
| } | |||||
| d_begin := getIpNumber("127.0.0.0") | |||||
| d_end := getIpNumber("127.255.255.255") | |||||
| if process_ip >= d_begin && process_ip <= d_end { | |||||
| return true | |||||
| } | |||||
| return false | |||||
| } | |||||
| func getIpNumber(ip string) int64 { | |||||
| ip_segment := strings.Split(ip, ".") | |||||
| if len(ip_segment) != 4 { | |||||
| return -1 | |||||
| } | |||||
| segment_1, _ := strconv.ParseInt(ip_segment[0], 10, 64) | |||||
| segment_2, _ := strconv.ParseInt(ip_segment[1], 10, 64) | |||||
| segment_3, _ := strconv.ParseInt(ip_segment[2], 10, 64) | |||||
| segment_4, _ := strconv.ParseInt(ip_segment[3], 10, 64) | |||||
| ip_num := segment_1*256*256*256 + segment_2*256*256 + segment_3*256 + segment_4 | |||||
| return ip_num | |||||
| } | |||||
| /** | |||||
| * 取来源地址 | |||||
| */ | |||||
| func GetRemoteIp(req *http.Request) string { | |||||
| forward_ip := req.Header.Get("X-Forwarded-For") //使用代理 | |||||
| if forward_ip != "" { | |||||
| forward_ips := strings.Split(forward_ip, ",") | |||||
| if len(forward_ips) > 0 && forward_ips[0] != "" { | |||||
| remoteIp, _, err := net.SplitHostPort(forward_ips[0]) | |||||
| if err != nil { | |||||
| remoteIp = forward_ips[0] | |||||
| } | |||||
| return remoteIp | |||||
| } | |||||
| } | |||||
| if remoteIp, _, err := net.SplitHostPort(req.RemoteAddr); err == nil { | |||||
| return remoteIp | |||||
| } | |||||
| return req.RemoteAddr | |||||
| } | |||||
| /** | |||||
| * ip是否正确 | |||||
| */ | |||||
| func GetNumber(ip, mask string) (string, error) { | |||||
| a := net.ParseIP(ip) | |||||
| if a == nil { | |||||
| return "", errors.New("150057") | |||||
| } | |||||
| b := net.ParseIP(mask) | |||||
| if b == nil { | |||||
| return "", errors.New("150058") | |||||
| } | |||||
| ips := strings.Split(ip, ".") | |||||
| a1, _ := strconv.Atoi(ips[0]) | |||||
| a2, _ := strconv.Atoi(ips[1]) | |||||
| a3, _ := strconv.Atoi(ips[2]) | |||||
| a4, _ := strconv.Atoi(ips[3]) | |||||
| masks := strings.Split(mask, ".") | |||||
| m1, _ := strconv.Atoi(masks[0]) | |||||
| m2, _ := strconv.Atoi(masks[1]) | |||||
| m3, _ := strconv.Atoi(masks[2]) | |||||
| m4, _ := strconv.Atoi(masks[3]) | |||||
| n1 := a1 & m1 | |||||
| n2 := a2 & m2 | |||||
| n3 := a3 & m3 | |||||
| n4 := a4 & m4 | |||||
| return strconv.Itoa(n1) + "." + strconv.Itoa(n2) + "." + strconv.Itoa(n3) + "." + strconv.Itoa(n4), nil | |||||
| } | |||||
| /* | |||||
| * CIDR取IP mask | |||||
| * 2019/03/07 | |||||
| */ | |||||
| func GetIpMaskFromCIDR(ip string) (string, string, error) { | |||||
| ips, ipNet, err := net.ParseCIDR(ip) | |||||
| if err != nil { | |||||
| return "", "", err | |||||
| } | |||||
| val := make([]byte, len(ipNet.Mask)) | |||||
| copy(val, ipNet.Mask) | |||||
| var s []string | |||||
| for _, i := range val[:] { | |||||
| s = append(s, strconv.Itoa(int(i))) | |||||
| } | |||||
| return ips.String(), strings.Join(s, "."), nil | |||||
| } | |||||
| /* | |||||
| * net mask转换, 255.255.255.0 -> 24 | |||||
| * 2019/03/07 | |||||
| */ | |||||
| func ChangeMask(mask string) string { | |||||
| s := strings.Split(mask, ".") | |||||
| s1, _ := strconv.Atoi(s[0]) | |||||
| s2, _ := strconv.Atoi(s[1]) | |||||
| s3, _ := strconv.Atoi(s[2]) | |||||
| s4, _ := strconv.Atoi(s[3]) | |||||
| ipmask := net.IPv4Mask(byte(s1), byte(s2), byte(s3), byte(s4)) | |||||
| ones, _ := ipmask.Size() | |||||
| return strconv.Itoa(ones) | |||||
| } | |||||
| @ -0,0 +1,50 @@ | |||||
| package network | |||||
| import ( | |||||
| "fmt" | |||||
| "testing" | |||||
| ) | |||||
| func Test_IsPrivateIp(t *testing.T) { | |||||
| str := "10.1.77.54" | |||||
| is := IsPrivateIp(str) | |||||
| fmt.Println("is private ip", is) | |||||
| } | |||||
| func Test_GetLocalIps(t *testing.T) { | |||||
| ips := GetLocalIps() | |||||
| fmt.Println(ips) | |||||
| } | |||||
| func Test_GetInternetIps(t *testing.T) { | |||||
| ips := GetInternetIps() | |||||
| fmt.Println(ips) | |||||
| } | |||||
| func Test_GetNumber(t *testing.T) { | |||||
| ip := "192.168.122.21" | |||||
| mask := "255.255.255.0" | |||||
| n, err := GetNumber(ip, mask) | |||||
| t.Log(n, err) | |||||
| ip = "192.168.112.253" | |||||
| mask = "255.255.120.0" | |||||
| n, err = GetNumber(ip, mask) | |||||
| t.Log(n, err) | |||||
| ip = "172.16.23.23" | |||||
| mask = "255.255.255.0" | |||||
| n, err = GetNumber(ip, mask) | |||||
| t.Log(n, err) | |||||
| } | |||||
| func Test_GetIpMaskFromCIDR(t *testing.T) { | |||||
| ip := "192.168.141.22/24" | |||||
| ip, mask, err := GetIpMaskFromCIDR(ip) | |||||
| t.Log(ip, mask, err) | |||||
| } | |||||
| func Test_ChangeMask(t *testing.T) { | |||||
| mask := "255.255.255.0" | |||||
| a := ChangeMask(mask) | |||||
| t.Log(a) | |||||
| } | |||||
| @ -0,0 +1,46 @@ | |||||
| package network | |||||
| import ( | |||||
| "os/exec" | |||||
| "runtime" | |||||
| "strings" | |||||
| ) | |||||
| func Ping(ip string) bool { | |||||
| if ip == "" { | |||||
| return false | |||||
| } | |||||
| var cmd *exec.Cmd | |||||
| if strings.ToLower(runtime.GOOS) == "linux" { | |||||
| cmd = exec.Command("ping", ip, "-c", "1") | |||||
| } else { | |||||
| cmd = exec.Command("ping", ip, "-n", "1") | |||||
| } | |||||
| out, err := cmd.Output() | |||||
| cmd.Run() | |||||
| str := strings.ToLower(string(out)) | |||||
| if err == nil && strings.Contains(str, "ttl") { | |||||
| return true | |||||
| } | |||||
| return false | |||||
| } | |||||
| func CanConnect(ip, port string) bool { | |||||
| cmd := exec.Command("telnet", ip, port) | |||||
| out, _ := cmd.Output() | |||||
| cmd.Run() | |||||
| s := string(out) | |||||
| if strings.Contains(s, "Connected") && strings.Contains(s, "Escape") { | |||||
| return true | |||||
| } | |||||
| return false | |||||
| } | |||||
| @ -0,0 +1,21 @@ | |||||
| package network | |||||
| import ( | |||||
| // "fmt" | |||||
| "testing" | |||||
| ) | |||||
| func Test_Ping(t *testing.T) { | |||||
| str := "10.0.100.10" | |||||
| ret := Ping(str) | |||||
| fmt.Println(ret) | |||||
| } | |||||
| func Test_CanConnect(t *testing.T) { | |||||
| ip := "10.0.106.212" | |||||
| port := "" | |||||
| ret := CanConnect(ip, port) | |||||
| t.Log(ret) | |||||
| } | |||||
| @ -0,0 +1,91 @@ | |||||
| package network | |||||
| import ( | |||||
| "crypto/rand" | |||||
| "math/big" | |||||
| "net" | |||||
| "strconv" | |||||
| ) | |||||
| /** | |||||
| 扫描本机空闲端口 | |||||
| 参数说明: | |||||
| startPort 扫描开始端口 不包含这个端口 | |||||
| endPort 扫描结束端口 不包含这个端口 | |||||
| count 扫描端口数量 | |||||
| */ | |||||
| func ScanPort(startPort, endPort int64, count int) []int64 { | |||||
| usePort := make([]int64, 0) | |||||
| for startPort < endPort { | |||||
| startPort = startPort + 1 | |||||
| udpserver, err := net.ResolveUDPAddr("udp", ":"+strconv.FormatInt(int64(startPort), 10)) | |||||
| if err != nil { | |||||
| continue | |||||
| } | |||||
| udpConn, err := net.ListenUDP("udp", udpserver) | |||||
| if err != nil { | |||||
| continue | |||||
| } | |||||
| udpConn.Close() | |||||
| ln, err := net.Listen("tcp", "0.0.0.0:"+strconv.FormatInt(int64(startPort), 10)) | |||||
| if err != nil { | |||||
| continue | |||||
| } | |||||
| usePort = append(usePort, startPort) | |||||
| ln.Close() | |||||
| if len(usePort) >= count { | |||||
| break | |||||
| } | |||||
| } | |||||
| return usePort | |||||
| } | |||||
| /** | |||||
| * 取随机端口 | |||||
| */ | |||||
| func RandPort(min, max int64) int64 { | |||||
| var port int64 | |||||
| for { | |||||
| port = RandInt64(min, max) | |||||
| udpserver, err := net.ResolveUDPAddr("udp", ":"+strconv.FormatInt(int64(port), 10)) | |||||
| if err != nil { | |||||
| continue | |||||
| } | |||||
| udpConn, err := net.ListenUDP("udp", udpserver) | |||||
| if err != nil { | |||||
| continue | |||||
| } | |||||
| udpConn.Close() | |||||
| ln, err := net.Listen("tcp", "0.0.0.0:"+strconv.FormatInt(int64(port), 10)) | |||||
| if err != nil { | |||||
| continue | |||||
| } | |||||
| ln.Close() | |||||
| break | |||||
| } | |||||
| return port | |||||
| } | |||||
| /** | |||||
| * 取随机数 | |||||
| */ | |||||
| func RandInt64(min, max int64) int64 { | |||||
| var randnum int64 | |||||
| for { | |||||
| maxBigInt := big.NewInt(max) | |||||
| i, _ := rand.Int(rand.Reader, maxBigInt) | |||||
| if i.Int64() > min { | |||||
| randnum = i.Int64() | |||||
| break | |||||
| } | |||||
| } | |||||
| return randnum | |||||
| } | |||||
| @ -0,0 +1,16 @@ | |||||
| package network | |||||
| import ( | |||||
| "fmt" | |||||
| "testing" | |||||
| ) | |||||
| func TestScanPort(t *testing.T) { | |||||
| ports := ScanPort(55000, 60000, 2) | |||||
| fmt.Println(ports) | |||||
| } | |||||
| func TestRandPort(t *testing.T) { | |||||
| port := RandPort(50000, 60000) | |||||
| fmt.Println("port:", port) | |||||
| } | |||||
| @ -0,0 +1,166 @@ | |||||
| /* | |||||
| * url functions | |||||
| */ | |||||
| package network | |||||
| import ( | |||||
| "crypto/md5" | |||||
| "encoding/hex" | |||||
| "errors" | |||||
| "io/ioutil" | |||||
| "net" | |||||
| "net/http" | |||||
| "net/url" | |||||
| "strconv" | |||||
| "strings" | |||||
| "time" | |||||
| "git.tetele.net/tgo/crypter" | |||||
| ) | |||||
| /** | |||||
| * post 请求 | |||||
| */ | |||||
| func FnPost(url, param string) ([]byte, error) { | |||||
| httpClient := &http.Client{} | |||||
| req, err := http.NewRequest("POST", url, strings.NewReader(param)) | |||||
| if err != nil { | |||||
| return []byte(""), err | |||||
| } | |||||
| req.Header.Set("Content-Type", "application/x-www-form-urlencoded") //"application/x-www-form-urlencoded" | |||||
| resp, err := httpClient.Do(req) | |||||
| if err != nil { | |||||
| return []byte(""), err | |||||
| } | |||||
| defer resp.Body.Close() | |||||
| body, err := ioutil.ReadAll(resp.Body) | |||||
| if err != nil { | |||||
| return []byte(""), err | |||||
| } | |||||
| return body, nil | |||||
| } | |||||
| /** | |||||
| * 取本地IP | |||||
| */ | |||||
| func GetLocalIp() string { | |||||
| addrs, err := net.InterfaceAddrs() | |||||
| if err != nil { | |||||
| return "" | |||||
| } | |||||
| for _, address := range addrs { | |||||
| // 检查ip地址判断是否回环地址 | |||||
| if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() { | |||||
| if ipnet.IP.To4() != nil && !ipnet.IP.IsLinkLocalUnicast() { | |||||
| return ipnet.IP.String() | |||||
| } | |||||
| } | |||||
| } | |||||
| return "" | |||||
| } | |||||
| /** | |||||
| * 生成一个token | |||||
| */ | |||||
| func CreateTokenWithTime(sToken string) string { | |||||
| now := time.Now() | |||||
| iNow := now.Format("20060102150405") | |||||
| sToken += iNow | |||||
| h := md5.New() | |||||
| h.Write([]byte(sToken)) // 需要加密的字符串 | |||||
| cipher2Str := h.Sum(nil) | |||||
| return hex.EncodeToString(cipher2Str) // 输出加密结果 | |||||
| } | |||||
| /** | |||||
| * 生成一个token | |||||
| */ | |||||
| // func CreateToken(sToken string) string { | |||||
| // now := time.Now() | |||||
| // iNow := now.Format("20060102150405") | |||||
| // sToken += iNow | |||||
| // h := md5.New() | |||||
| // h.Write([]byte(sToken)) // 需要加密的字符串 | |||||
| // cipher2Str := h.Sum(nil) | |||||
| // sMd5 := hex.EncodeToString(cipher2Str) // 输出加密结果 | |||||
| // tokenEn := crypter.DesEn(sToken, "gzyc8642") | |||||
| // return sMd5 + "|" + ToString(now.Unix()) + "|" + tokenEn | |||||
| // } | |||||
| /** | |||||
| * 验证token | |||||
| */ | |||||
| func CheckToken(token string) (bool, string) { | |||||
| arr := strings.Split(token, "|") | |||||
| if len(arr) != 3 { | |||||
| return false, "" | |||||
| } | |||||
| tokenDes := crypter.DesDe(arr[2], "gzyc8642") | |||||
| tokenTime := tokenDes[len(tokenDes)-14:] | |||||
| timeInt, err := strconv.ParseInt(arr[1], 10, 64) | |||||
| if err != nil { | |||||
| return false, "" | |||||
| } | |||||
| currentTime := time.Unix(timeInt, 0).Format("20060102150405") | |||||
| if currentTime != tokenTime { | |||||
| return false, "" | |||||
| } | |||||
| h := md5.New() | |||||
| h.Write([]byte(tokenDes)) // 需要加密的字符串 | |||||
| cipher2Str := h.Sum(nil) | |||||
| sMd5 := hex.EncodeToString(cipher2Str) // 输出加密结果 | |||||
| if sMd5 == arr[0] { | |||||
| return true, tokenDes[0 : len(tokenDes)-14] | |||||
| } | |||||
| return false, "" | |||||
| } | |||||
| /** | |||||
| * 给参数签名 | |||||
| */ | |||||
| func QuerySign(mQuery map[string]string) string { | |||||
| sParam := "" | |||||
| for k, v := range mQuery { | |||||
| sParam += k + "=" + v + "&" | |||||
| } | |||||
| query, Err := url.ParseQuery(sParam) | |||||
| if Err != nil { | |||||
| return "" | |||||
| } else { | |||||
| return crypter.Md5Password(query.Encode(), "guzeng1") | |||||
| } | |||||
| } | |||||
| /** | |||||
| * 从url中取域名,端口 | |||||
| * 2019/05/20 | |||||
| */ | |||||
| func GetIpPortFromUrl(sUrl string) (string, string, error) { | |||||
| if sUrl == "" { | |||||
| return "", "", errors.New("param error") | |||||
| } | |||||
| if !strings.Contains(sUrl, "http://") && !strings.Contains(sUrl, "https://") { | |||||
| sUrl = "http://" + sUrl | |||||
| } | |||||
| u, err := url.Parse(sUrl) | |||||
| if err != nil { | |||||
| return "", "", err | |||||
| } | |||||
| return u.Hostname(), u.Port(), nil | |||||
| } | |||||
| @ -0,0 +1,22 @@ | |||||
| package network | |||||
| import ( | |||||
| "testing" | |||||
| ) | |||||
| func Test_CheckToken(t *testing.T) { | |||||
| code := "127328" | |||||
| token := CreateToken(code) | |||||
| t.Log(token) | |||||
| str := "1dcfbe790d270f45ae35779afbc4072e|1532068096|90EDAA4C1E97C7517E9D10AB9157E4D0D9CC51996E3827F2" | |||||
| check, user := CheckToken(str) | |||||
| t.Log(check) | |||||
| t.Log(user) | |||||
| } | |||||
| func Test_GetIpPortFromUrl(t *testing.T) { | |||||
| url := "http://raydesktop.gxycloud.com:8082/getmaster" | |||||
| GetIpPortFromUrl(url) | |||||
| } | |||||