feat: add root browserDialers tags for dialerProxy integration

Agent-Logs-Url: https://github.com/XTLS/Xray-core/sessions/808be5b1-7ed2-4309-87f1-18a808d6aba4

Co-authored-by: RPRX <63339210+RPRX@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot]
2026-04-26 17:54:10 +00:00
committed by GitHub
parent 97ad6cef43
commit ca3cd5fb88
5 changed files with 91 additions and 1 deletions
@@ -33,6 +33,7 @@ type task struct {
var sockoptDialers map[string]*dialerInstance
var dialerServers map[string]*dialerServer
var dialerTags map[string]string
var mu sync.RWMutex
const browserDialerSubprotocol = "browser-dialer"
@@ -51,6 +52,37 @@ func HasBrowserDialerWithAddress(addr string) bool {
return ok
}
func GetAddressByTag(tag string) (string, bool) {
if tag == "" {
return "", false
}
mu.RLock()
defer mu.RUnlock()
addr, ok := dialerTags[tag]
return addr, ok
}
func ConfigureDialerTags(tags map[string]string) error {
next := make(map[string]string, len(tags))
for tag, addr := range tags {
if tag == "" {
return errors.New("browserDialers tag cannot be empty")
}
if addr == "" {
return errors.New("browserDialers url cannot be empty for tag: ", tag)
}
if err := EnsureDialerWithAddress(addr); err != nil {
return errors.New("invalid browserDialers entry for tag ", tag).Base(err)
}
next[tag] = addr
}
mu.Lock()
dialerTags = next
mu.Unlock()
return nil
}
type webSocketExtra struct {
Protocol string `json:"protocol,omitempty"`
}
+4
View File
@@ -14,6 +14,7 @@ import (
"github.com/xtls/xray-core/features/dns"
"github.com/xtls/xray-core/features/outbound"
"github.com/xtls/xray-core/transport"
"github.com/xtls/xray-core/transport/internet/browser_dialer"
"github.com/xtls/xray-core/transport/internet/stat"
"github.com/xtls/xray-core/transport/pipe"
)
@@ -269,6 +270,9 @@ func DialSystem(ctx context.Context, dest net.Destination, sockopt *SocketConfig
}
if len(sockopt.DialerProxy) > 0 {
if _, ok := browser_dialer.GetAddressByTag(sockopt.DialerProxy); ok {
return nil, errors.New("dialerProxy tag ", sockopt.DialerProxy, " maps to browserDialers and only supports websocket or splithttp").AtError()
}
if obm == nil {
return nil, errors.New("there is no outbound manager for dialerProxy").AtError()
}
+26 -1
View File
@@ -40,6 +40,20 @@ type dialerConf struct {
*internet.MemoryStreamConfig
}
type errorDialerClient struct {
err error
}
func (c *errorDialerClient) IsClosed() bool { return false }
func (c *errorDialerClient) OpenStream(context.Context, string, string, io.Reader, bool) (io.ReadCloser, net.Addr, net.Addr, error) {
return nil, nil, nil, c.err
}
func (c *errorDialerClient) PostPacket(context.Context, string, string, string, buf.MultiBuffer) error {
return c.err
}
var (
globalDialerMap map[dialerConf]*XmuxManager
globalDialerAccess sync.Mutex
@@ -50,11 +64,22 @@ func getHTTPClient(ctx context.Context, dest net.Destination, streamSettings *in
browserDialer := ""
if streamSettings.SocketSettings != nil {
browserDialer = streamSettings.SocketSettings.BrowserDialer
if browserDialer == "" {
if taggedDialer, ok := browser_dialer.GetAddressByTag(streamSettings.SocketSettings.DialerProxy); ok {
browserDialer = taggedDialer
}
}
}
if browser_dialer.HasBrowserDialerWithAddress(browserDialer) && realityConfig == nil {
transportConfig := streamSettings.ProtocolSettings.(*Config)
if transportConfig.Mode != "auto" && transportConfig.Mode != "packet-up" {
return &errorDialerClient{
err: errors.New("dialerProxy/browserDialer with XHTTP only supports modes \"auto\" or \"packet-up\", got: \"", transportConfig.Mode, "\""),
}, nil
}
return &BrowserDialerClient{
transportConfig: streamSettings.ProtocolSettings.(*Config),
transportConfig: transportConfig,
browserDialer: browserDialer,
}, nil
}
+5
View File
@@ -120,6 +120,11 @@ func dialWebSocket(ctx context.Context, dest net.Destination, streamSettings *in
browserDialer := ""
if streamSettings.SocketSettings != nil {
browserDialer = streamSettings.SocketSettings.BrowserDialer
if browserDialer == "" {
if taggedDialer, ok := browser_dialer.GetAddressByTag(streamSettings.SocketSettings.DialerProxy); ok {
browserDialer = taggedDialer
}
}
}
if browser_dialer.HasBrowserDialerWithAddress(browserDialer) {
conn, err := browser_dialer.DialWSWithAddress(browserDialer, uri, ed)