mirror of
https://github.com/nxtrace/NTrace-core.git
synced 2025-08-12 06:26:39 +00:00
75 lines
1.8 KiB
Go
75 lines
1.8 KiB
Go
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
|
|
}
|
|
}
|