mirror of
https://github.com/XTLS/Xray-core.git
synced 2026-05-08 14:13:22 +00:00
refactor: improve browser dialer instance handling and diagnostics
Agent-Logs-Url: https://github.com/XTLS/Xray-core/sessions/56665ec5-84ea-4bc3-a812-2e699e0e880d Co-authored-by: RPRX <63339210+RPRX@users.noreply.github.com>
This commit is contained in:
committed by
GitHub
parent
c2116bb869
commit
2fdfa727b4
@@ -6,6 +6,7 @@ import (
|
||||
_ "embed"
|
||||
"encoding/base64"
|
||||
"encoding/json"
|
||||
stderrors "errors"
|
||||
"net/http"
|
||||
"sync"
|
||||
"time"
|
||||
@@ -44,17 +45,20 @@ var upgrader = &websocket.Upgrader{
|
||||
func Reload() {
|
||||
addr := getEnvAddress()
|
||||
mu.Lock()
|
||||
defer mu.Unlock()
|
||||
|
||||
closeDialerInstance(&dialerInstance{conns: conns, server: server})
|
||||
conns = nil
|
||||
server = nil
|
||||
|
||||
var dialer *dialerInstance
|
||||
if addr != "" {
|
||||
dialer := newDialerInstance(addr)
|
||||
dialer = newDialerInstance(addr)
|
||||
conns = dialer.conns
|
||||
server = dialer.server
|
||||
}
|
||||
mu.Unlock()
|
||||
|
||||
startDialerInstance(dialer)
|
||||
}
|
||||
|
||||
func HasBrowserDialer() bool {
|
||||
@@ -102,10 +106,20 @@ func newDialerInstance(addr string) *dialerInstance {
|
||||
}
|
||||
}),
|
||||
}
|
||||
go dialer.server.ListenAndServe()
|
||||
return dialer
|
||||
}
|
||||
|
||||
func startDialerInstance(dialer *dialerInstance) {
|
||||
if dialer == nil || dialer.server == nil {
|
||||
return
|
||||
}
|
||||
go func() {
|
||||
if err := dialer.server.ListenAndServe(); err != nil && !stderrors.Is(err, http.ErrServerClosed) {
|
||||
errors.LogError(context.Background(), "Browser dialer http server unexpected error on ", dialer.server.Addr, ": ", err)
|
||||
}
|
||||
}()
|
||||
}
|
||||
|
||||
func closeDialerInstance(d *dialerInstance) {
|
||||
if d == nil {
|
||||
return
|
||||
@@ -113,11 +127,12 @@ func closeDialerInstance(d *dialerInstance) {
|
||||
if d.server != nil {
|
||||
d.server.Close()
|
||||
}
|
||||
for len(d.conns) > 0 {
|
||||
for {
|
||||
select {
|
||||
case c := <-d.conns:
|
||||
c.Close()
|
||||
default:
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -127,15 +142,17 @@ func getDialerByAddress(addr string) *dialerInstance {
|
||||
return nil
|
||||
}
|
||||
mu.Lock()
|
||||
defer mu.Unlock()
|
||||
if sockoptDialers == nil {
|
||||
sockoptDialers = make(map[string]*dialerInstance)
|
||||
}
|
||||
if dialer, found := sockoptDialers[addr]; found {
|
||||
mu.Unlock()
|
||||
return dialer
|
||||
}
|
||||
dialer := newDialerInstance(addr)
|
||||
sockoptDialers[addr] = dialer
|
||||
mu.Unlock()
|
||||
startDialerInstance(dialer)
|
||||
return dialer
|
||||
}
|
||||
|
||||
@@ -255,7 +272,10 @@ func dialTaskWithAddress(addr string, task task) (*websocket.Conn, error) {
|
||||
|
||||
conns := connsByAddress(addr)
|
||||
if conns == nil {
|
||||
return nil, errors.New("browser dialer is not configured")
|
||||
if addr != "" {
|
||||
return nil, errors.New("browser dialer is not configured for sockopt.browserDialer: ", addr)
|
||||
}
|
||||
return nil, errors.New("browser dialer is not configured; set sockopt.browserDialer or env ", platform.BrowserDialerAddress)
|
||||
}
|
||||
|
||||
var conn *websocket.Conn
|
||||
|
||||
Reference in New Issue
Block a user