package tracemap import ( "crypto/tls" "errors" "fmt" "github.com/fatih/color" "github.com/xgadget-lab/nexttrace/util" "io" "net" "net/http" "net/url" "strings" "time" ) func GetMapUrl(r string) (string, error) { host, port := util.GetHostAndPort() fastIp := "api.leo.moe" // 如果 host 是一个 IP 使用默认域名 if valid := net.ParseIP(host); valid != nil { host = "api.leo.moe" } else { // 默认配置完成,开始寻找最优 IP fastIp = util.GetFastIP(host, port, false) } u := url.URL{Scheme: "https", Host: fastIp + ":" + port, Path: "/tracemap/api"} tracemapUrl := u.String() client := &http.Client{ Timeout: 5 * time.Second, Transport: &http.Transport{ TLSClientConfig: &tls.Config{ ServerName: host, }, }, } proxyUrl := util.GetProxy() if proxyUrl != nil { client.Transport.(*http.Transport).Proxy = http.ProxyURL(proxyUrl) } req, err := http.NewRequest("POST", tracemapUrl, strings.NewReader(r)) if err != nil { return "", errors.New("an issue occurred while connecting to the tracemap API") } req.Header.Add("User-Agent", util.UserAgent) req.Host = host req.Header.Add("Content-Type", "application/json") resp, err := client.Do(req) if err != nil { return "", errors.New("an issue occurred while connecting to the tracemap API") } defer func(Body io.ReadCloser) { err := Body.Close() if err != nil { return } }(resp.Body) body, err := io.ReadAll(resp.Body) if err != nil { return "", errors.New("an issue occurred while connecting to the tracemap API") } return string(body), nil } func PrintMapUrl(r string) { _, err := fmt.Fprintf(color.Output, "%s %s\n", color.New(color.FgWhite, color.Bold).Sprintf("%s", "MapTrace URL:"), color.New(color.FgBlue, color.Bold).Sprintf("%s", string(r)), ) if err != nil { return } }