From 8043924af5cd10b10e7fb5adbae1f064a4f8cd9e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 27 Apr 2026 13:32:47 +0000 Subject: [PATCH] Move browser dialer start stop to instance lifecycle Agent-Logs-Url: https://github.com/XTLS/Xray-core/sessions/b8c640ab-f93c-4609-8e34-a8e14e2be9e7 Co-authored-by: RPRX <63339210+RPRX@users.noreply.github.com> --- core/xray.go | 9 ++++++++ infra/conf/xray.go | 3 --- transport/internet/browser_dialer/manager.go | 22 ++++++++++++++++++++ 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/core/xray.go b/core/xray.go index 58135c96..1fb3bbab 100644 --- a/core/xray.go +++ b/core/xray.go @@ -18,6 +18,7 @@ import ( "github.com/xtls/xray-core/features/routing" "github.com/xtls/xray-core/features/stats" "github.com/xtls/xray-core/transport/internet" + "github.com/xtls/xray-core/transport/internet/browser_dialer" ) // Server is an instance of Xray. At any time, there must be at most one Server instance running. @@ -262,6 +263,9 @@ func (s *Instance) Close() error { s.running = false var errs []interface{} + if err := browser_dialer.StopCollectedDialerProxyURLs(); err != nil { + errs = append(errs, err) + } for _, f := range s.features { if err := f.Close(); err != nil { errs = append(errs, err) @@ -385,9 +389,14 @@ func (s *Instance) Start() error { s.statusLock.Lock() defer s.statusLock.Unlock() + if err := browser_dialer.StartCollectedDialerProxyURLs(); err != nil { + return err + } s.running = true for _, f := range s.features { if err := f.Start(); err != nil { + s.running = false + _ = browser_dialer.StopCollectedDialerProxyURLs() return err } } diff --git a/infra/conf/xray.go b/infra/conf/xray.go index 86ba0517..cb9367de 100644 --- a/infra/conf/xray.go +++ b/infra/conf/xray.go @@ -632,9 +632,6 @@ func (c *Config) Build() (*core.Config, error) { if err := browser_dialer.ConfigureCollectedDialerProxyURLs(); err != nil { return nil, errors.New("failed to configure browser dialer").Base(err) } - if err := browser_dialer.StartCollectedDialerProxyURLs(); err != nil { - return nil, errors.New("failed to start browser dialer listeners").Base(err) - } return config, nil } diff --git a/transport/internet/browser_dialer/manager.go b/transport/internet/browser_dialer/manager.go index 1000d77a..9ecd89ae 100644 --- a/transport/internet/browser_dialer/manager.go +++ b/transport/internet/browser_dialer/manager.go @@ -123,6 +123,20 @@ func StartCollectedDialerProxyURLs() error { return nil } +func StopCollectedDialerProxyURLs() error { + var stopErr error + for listenAddr, server := range serversByListenAddr { + if err := server.stop(); err != nil && stopErr == nil { + stopErr = errors.New("failed to stop browser dialer listener on ", listenAddr).Base(err) + } + } + dialersByAddress = map[string]*dialerInstance{} + serversByListenAddr = map[string]*dialerServer{} + pendingURLs = nil + initialized = false + return stopErr +} + type dialerInstance struct { conns chan *websocket.Conn page []byte @@ -227,6 +241,14 @@ func (d *dialerServer) start() error { return nil } +func (d *dialerServer) stop() error { + if !d.started { + return nil + } + d.started = false + return d.server.Close() +} + func closeConnection(w http.ResponseWriter) { hijacker, ok := w.(http.Hijacker) if !ok {