11package wshandle
22
33import (
4+ "crypto/tls"
45 "log"
6+ "net"
7+ "net/http"
58 "net/url"
69 "os"
710 "os/signal"
11+ "strings"
812 "sync"
913 "time"
1014
@@ -25,6 +29,7 @@ type WsConn struct {
2529
2630var wsconn * WsConn
2731var hostP = GetenvDefault ("NEXTTRACE_HOSTPORT" , "api.leo.moe" )
32+ var host , port , fast_ip string
2833
2934func (c * WsConn ) keepAlive () {
3035 go func () {
@@ -105,10 +110,16 @@ func (c *WsConn) messageSendHandler() {
105110}
106111
107112func (c * WsConn ) recreateWsConn () {
108- u := url.URL {Scheme : "wss" , Host : hostP , Path : "/v2/ipGeoWs" }
113+ u := url.URL {Scheme : "wss" , Host : fast_ip + ":" + port , Path : "/v2/ipGeoWs" }
109114 // log.Printf("connecting to %s", u.String())
110-
111- ws , _ , err := websocket .DefaultDialer .Dial (u .String (), nil )
115+ requestHeader := http.Header {
116+ "Host" : []string {host },
117+ }
118+ dialer := websocket .DefaultDialer
119+ dialer .TLSClientConfig = & tls.Config {
120+ ServerName : host ,
121+ }
122+ ws , _ , err := websocket .DefaultDialer .Dial (u .String (), requestHeader )
112123 c .Conn = ws
113124 if err != nil {
114125 log .Println ("dial:" , err )
@@ -129,11 +140,47 @@ func createWsConn() *WsConn {
129140 // 设置终端中断通道
130141 interrupt := make (chan os.Signal , 1 )
131142 signal .Notify (interrupt , os .Interrupt )
143+ // 解析域名
144+ hostArr := strings .Split (hostP , ":" )
145+ // 判断是否有指定端口
146+ if len (hostArr ) > 1 {
147+ // 判断是否为 IPv6
148+ if strings .HasPrefix (hostP , "[" ) {
149+ tmp := strings .Split (hostP , "]" )
150+ host = tmp [0 ]
151+ host = host [1 :]
152+ if port = tmp [1 ]; port != "" {
153+ port = port [1 :]
154+ }
155+ } else {
156+ host , port = hostArr [0 ], hostArr [1 ]
157+ }
158+ } else {
159+ host = hostP
160+ }
161+ if port == "" {
162+ // 默认端口
163+ port = "443"
164+ }
165+ // 默认配置完成,开始寻找最优 IP
166+ fast_ip = GetFastIP (host , port )
132167
133- u := url.URL {Scheme : "wss" , Host : hostP , Path : "/v2/ipGeoWs" }
168+ // 如果 host 是一个 IP 使用默认域名
169+ if valid := net .ParseIP (host ); valid != nil {
170+ host = "api.leo.moe"
171+ }
172+ // 判断是否是一个 IP
173+ requestHeader := http.Header {
174+ "Host" : []string {host },
175+ }
176+ dialer := websocket .DefaultDialer
177+ dialer .TLSClientConfig = & tls.Config {
178+ ServerName : host ,
179+ }
180+ u := url.URL {Scheme : "wss" , Host : fast_ip + ":" + port , Path : "/v2/ipGeoWs" }
134181 // log.Printf("connecting to %s", u.String())
135182
136- c , _ , err := websocket .DefaultDialer .Dial (u .String (), nil )
183+ c , _ , err := websocket .DefaultDialer .Dial (u .String (), requestHeader )
137184
138185 wsconn = & WsConn {
139186 Conn : c ,
@@ -169,9 +216,9 @@ func GetWsConn() *WsConn {
169216 return wsconn
170217}
171218func GetenvDefault (key , defVal string ) string {
172- val , ok := os .LookupEnv (key )
173- if ok {
174- return val
175- }
176- return defVal
177- }
219+ val , ok := os .LookupEnv (key )
220+ if ok {
221+ return val
222+ }
223+ return defVal
224+ }
0 commit comments