From 6539b509cb5be33e365f5a94563ea3ded93bac7b Mon Sep 17 00:00:00 2001 From: wwqgtxx Date: Thu, 4 Dec 2025 17:29:01 +0800 Subject: [PATCH] chore: restful api contains `providerChains` for connections --- adapter/outbound/base.go | 18 ++++++++++++++++-- adapter/provider/provider.go | 2 +- constant/adapters.go | 1 + tunnel/statistic/tracker.go | 3 +++ 4 files changed, 21 insertions(+), 3 deletions(-) diff --git a/adapter/outbound/base.go b/adapter/outbound/base.go index 2113173b..4a4c412d 100644 --- a/adapter/outbound/base.go +++ b/adapter/outbound/base.go @@ -219,6 +219,7 @@ func NewBase(opt BaseOption) *Base { type conn struct { N.ExtendedConn chain C.Chain + pdChain C.Chain adapterAddr string } @@ -240,9 +241,15 @@ func (c *conn) Chains() C.Chain { return c.chain } +// ProviderChains implements C.Connection +func (c *conn) ProviderChains() C.Chain { + return c.pdChain +} + // AppendToChains implements C.Connection func (c *conn) AppendToChains(a C.ProxyAdapter) { c.chain = append(c.chain, a.Name()) + c.pdChain = append(c.pdChain, a.ProxyInfo().ProviderName) } func (c *conn) Upstream() any { @@ -265,7 +272,7 @@ func NewConn(c net.Conn, a C.ProxyAdapter) C.Conn { if _, ok := c.(syscall.Conn); !ok { // exclusion system conn like *net.TCPConn c = N.NewDeadlineConn(c) // most conn from outbound can't handle readDeadline correctly } - cc := &conn{N.NewExtendedConn(c), nil, a.Addr()} + cc := &conn{N.NewExtendedConn(c), nil, nil, a.Addr()} cc.AppendToChains(a) return cc } @@ -273,6 +280,7 @@ func NewConn(c net.Conn, a C.ProxyAdapter) C.Conn { type packetConn struct { N.EnhancePacketConn chain C.Chain + pdChain C.Chain adapterName string connID string adapterAddr string @@ -293,9 +301,15 @@ func (c *packetConn) Chains() C.Chain { return c.chain } +// ProviderChains implements C.Connection +func (c *packetConn) ProviderChains() C.Chain { + return c.pdChain +} + // AppendToChains implements C.Connection func (c *packetConn) AppendToChains(a C.ProxyAdapter) { c.chain = append(c.chain, a.Name()) + c.pdChain = append(c.pdChain, a.ProxyInfo().ProviderName) } func (c *packetConn) LocalAddr() net.Addr { @@ -324,7 +338,7 @@ func newPacketConn(pc net.PacketConn, a ProxyAdapter) C.PacketConn { if _, ok := pc.(syscall.Conn); !ok { // exclusion system conn like *net.UDPConn epc = N.NewDeadlineEnhancePacketConn(epc) // most conn from outbound can't handle readDeadline correctly } - cpc := &packetConn{epc, nil, a.Name(), utils.NewUUIDV4().String(), a.Addr(), a.ResolveUDP} + cpc := &packetConn{epc, nil, nil, a.Name(), utils.NewUUIDV4().String(), a.Addr(), a.ResolveUDP} cpc.AppendToChains(a) return cpc } diff --git a/adapter/provider/provider.go b/adapter/provider/provider.go index 54a78699..71713d8f 100644 --- a/adapter/provider/provider.go +++ b/adapter/provider/provider.go @@ -156,7 +156,7 @@ func (pp *proxySetProvider) Initial() error { func (pp *proxySetProvider) closeAllConnections() { statistic.DefaultManager.Range(func(c statistic.Tracker) bool { - for _, chain := range c.Chains() { + for _, chain := range c.ProviderChains() { if chain == pp.Name() { _ = c.Close() break diff --git a/constant/adapters.go b/constant/adapters.go index 44628848..07ae5de1 100644 --- a/constant/adapters.go +++ b/constant/adapters.go @@ -59,6 +59,7 @@ var ErrNotSupport = errors.New("no support") type Connection interface { Chains() Chain + ProviderChains() Chain AppendToChains(adapter ProxyAdapter) RemoteDestination() string } diff --git a/tunnel/statistic/tracker.go b/tunnel/statistic/tracker.go index ffa2e71e..2fbb1cf9 100644 --- a/tunnel/statistic/tracker.go +++ b/tunnel/statistic/tracker.go @@ -28,6 +28,7 @@ type TrackerInfo struct { DownloadTotal atomic.Int64 `json:"download"` Start time.Time `json:"start"` Chain C.Chain `json:"chains"` + ProviderChain C.Chain `json:"providerChains"` Rule string `json:"rule"` RulePayload string `json:"rulePayload"` } @@ -126,6 +127,7 @@ func NewTCPTracker(conn C.Conn, manager *Manager, metadata *C.Metadata, rule C.R Start: time.Now(), Metadata: metadata, Chain: conn.Chains(), + ProviderChain: conn.ProviderChains(), Rule: "", UploadTotal: atomic.NewInt64(uploadTotal), DownloadTotal: atomic.NewInt64(downloadTotal), @@ -217,6 +219,7 @@ func NewUDPTracker(conn C.PacketConn, manager *Manager, metadata *C.Metadata, ru Start: time.Now(), Metadata: metadata, Chain: conn.Chains(), + ProviderChain: conn.ProviderChains(), Rule: "", UploadTotal: atomic.NewInt64(uploadTotal), DownloadTotal: atomic.NewInt64(downloadTotal),