Browser Dialer: Allow being switched on runtime when Xray is used as a lib (#5978)

https://github.com/XTLS/Xray-core/pull/5978#issuecomment-4279520473

https://github.com/XTLS/Xray-core/pull/5978#issuecomment-4320401635
This commit is contained in:
fish4terrisa-MSDSM
2026-04-26 03:48:49 +08:00
committed by GitHub
parent d0f533f94a
commit 85a8bf5f39

View File

@@ -7,6 +7,7 @@ import (
"encoding/base64" "encoding/base64"
"encoding/json" "encoding/json"
"net/http" "net/http"
"sync"
"time" "time"
"github.com/gorilla/websocket" "github.com/gorilla/websocket"
@@ -26,6 +27,8 @@ type task struct {
} }
var conns chan *websocket.Conn var conns chan *websocket.Conn
var server *http.Server
var mu sync.Mutex
var upgrader = &websocket.Upgrader{ var upgrader = &websocket.Upgrader{
ReadBufferSize: 0, ReadBufferSize: 0,
@@ -36,27 +39,48 @@ var upgrader = &websocket.Upgrader{
}, },
} }
func init() { // Used by external projects when using xray as a go module
func Reload() {
addr := platform.NewEnvFlag(platform.BrowserDialerAddress).GetValue(func() string { return "" }) addr := platform.NewEnvFlag(platform.BrowserDialerAddress).GetValue(func() string { return "" })
mu.Lock()
defer mu.Unlock()
if server != nil {
server.Close()
}
if HasBrowserDialer() {
for len(conns) > 0 {
select {
case c := <-conns:
c.Close()
default:
}
}
conns = nil
}
if addr != "" { if addr != "" {
token := uuid.New() token := uuid.New()
csrfToken := token.String() csrfToken := token.String()
webpage = bytes.ReplaceAll(webpage, []byte("csrfToken"), []byte(csrfToken)) webpage := bytes.ReplaceAll(webpage, []byte("csrfToken"), []byte(csrfToken))
conns = make(chan *websocket.Conn, 256) conns = make(chan *websocket.Conn, 256)
go http.ListenAndServe(addr, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { server = &http.Server{
if r.URL.Path == "/websocket" { Addr: addr,
if r.URL.Query().Get("token") == csrfToken { Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if conn, err := upgrader.Upgrade(w, r, nil); err == nil { if r.URL.Path == "/websocket" {
conns <- conn if r.URL.Query().Get("token") == csrfToken {
} else { if conn, err := upgrader.Upgrade(w, r, nil); err == nil {
errors.LogError(context.Background(), "Browser dialer http upgrade unexpected error") conns <- conn
} else {
errors.LogError(context.Background(), "Browser dialer http upgrade unexpected error")
}
} }
} else {
w.Header().Set("Access-Control-Allow-Origin", "*");
w.Write(webpage)
} }
} else { }),
w.Header().Set("Access-Control-Allow-Origin", "*"); }
w.Write(webpage) go server.ListenAndServe()
}
}))
} }
} }
@@ -194,3 +218,8 @@ func CheckOK(conn *websocket.Conn) error {
return nil return nil
} }
func init() {
Reload()
}