mirror of
https://github.com/XTLS/Xray-core.git
synced 2026-05-08 14:13:22 +00:00
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:
committed by
GitHub
parent
d0f533f94a
commit
85a8bf5f39
@@ -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,14 +39,33 @@ 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{
|
||||||
|
Addr: addr,
|
||||||
|
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
if r.URL.Path == "/websocket" {
|
if r.URL.Path == "/websocket" {
|
||||||
if r.URL.Query().Get("token") == csrfToken {
|
if r.URL.Query().Get("token") == csrfToken {
|
||||||
if conn, err := upgrader.Upgrade(w, r, nil); err == nil {
|
if conn, err := upgrader.Upgrade(w, r, nil); err == nil {
|
||||||
@@ -56,7 +78,9 @@ func init() {
|
|||||||
w.Header().Set("Access-Control-Allow-Origin", "*");
|
w.Header().Set("Access-Control-Allow-Origin", "*");
|
||||||
w.Write(webpage)
|
w.Write(webpage)
|
||||||
}
|
}
|
||||||
}))
|
}),
|
||||||
|
}
|
||||||
|
go server.ListenAndServe()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -194,3 +218,8 @@ func CheckOK(conn *websocket.Conn) error {
|
|||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
Reload()
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user