From b5fa3ee99aa4c0ddc1e742c0ba3e22ba81742466 Mon Sep 17 00:00:00 2001 From: wwqgtxx Date: Thu, 4 Dec 2025 15:10:13 +0800 Subject: [PATCH] chore: restful api contains `provider-name` for proxies --- adapter/adapter.go | 3 ++- adapter/outbound/anytls.go | 1 + adapter/outbound/base.go | 10 ++++++++-- adapter/outbound/direct.go | 1 + adapter/outbound/dns.go | 1 + adapter/outbound/http.go | 1 + adapter/outbound/hysteria.go | 1 + adapter/outbound/hysteria2.go | 1 + adapter/outbound/mieru.go | 3 ++- adapter/outbound/shadowsocks.go | 1 + adapter/outbound/shadowsocksr.go | 1 + adapter/outbound/snell.go | 1 + adapter/outbound/socks5.go | 1 + adapter/outbound/ssh.go | 1 + adapter/outbound/sudoku.go | 1 + adapter/outbound/trojan.go | 1 + adapter/outbound/tuic.go | 1 + adapter/outbound/vless.go | 1 + adapter/outbound/vmess.go | 1 + adapter/outbound/wireguard.go | 1 + adapter/parser.go | 8 ++++++++ adapter/provider/parser.go | 2 +- adapter/provider/provider.go | 4 ++-- constant/adapters.go | 15 ++++++++------- 24 files changed, 48 insertions(+), 14 deletions(-) diff --git a/adapter/adapter.go b/adapter/adapter.go index ef8d4ee3..6f395460 100644 --- a/adapter/adapter.go +++ b/adapter/adapter.go @@ -153,8 +153,9 @@ func (p *Proxy) MarshalJSON() ([]byte, error) { mapping["mptcp"] = proxyInfo.MPTCP mapping["smux"] = proxyInfo.SMUX mapping["interface"] = proxyInfo.Interface - mapping["dialer-proxy"] = proxyInfo.DialerProxy mapping["routing-mark"] = proxyInfo.RoutingMark + mapping["provider-name"] = proxyInfo.ProviderName + mapping["dialer-proxy"] = proxyInfo.DialerProxy return json.Marshal(mapping) } diff --git a/adapter/outbound/anytls.go b/adapter/outbound/anytls.go index d4c856fc..c17f27d5 100644 --- a/adapter/outbound/anytls.go +++ b/adapter/outbound/anytls.go @@ -90,6 +90,7 @@ func NewAnyTLS(option AnyTLSOption) (*AnyTLS, error) { name: option.Name, addr: addr, tp: C.AnyTLS, + pdName: option.ProviderName, udp: option.UDP, tfo: option.TFO, mpTcp: option.MPTCP, diff --git a/adapter/outbound/base.go b/adapter/outbound/base.go index f0b9d846..2113173b 100644 --- a/adapter/outbound/base.go +++ b/adapter/outbound/base.go @@ -27,16 +27,17 @@ type ProxyAdapter interface { type Base struct { name string addr string - iface string tp C.AdapterType + pdName string udp bool xudp bool tfo bool mpTcp bool + iface string rmark int - id string prefer C.DNSPrefer dialer C.Dialer + id string } // Name implements C.ProxyAdapter @@ -85,6 +86,7 @@ func (b *Base) ProxyInfo() (info C.ProxyInfo) { info.SMUX = false info.Interface = b.iface info.RoutingMark = b.rmark + info.ProviderName = b.pdName return } @@ -167,7 +169,11 @@ type BasicOption struct { IPVersion C.DNSPrefer `proxy:"ip-version,omitempty"` DialerProxy string `proxy:"dialer-proxy,omitempty"` // don't apply this option into groups, but can set a group name in a proxy + // + // The following parameters are used internally, assign value by the structure decoder are disallowed + // DialerForAPI C.Dialer `proxy:"-"` // the dialer used for API usage has higher priority than all the above configurations. + ProviderName string `proxy:"-"` } func (b *BasicOption) NewDialer(opts []dialer.Option) C.Dialer { diff --git a/adapter/outbound/direct.go b/adapter/outbound/direct.go index 5f2a80dc..42cd8def 100644 --- a/adapter/outbound/direct.go +++ b/adapter/outbound/direct.go @@ -69,6 +69,7 @@ func NewDirectWithOption(option DirectOption) *Direct { Base: &Base{ name: option.Name, tp: C.Direct, + pdName: option.ProviderName, udp: true, tfo: option.TFO, mpTcp: option.MPTCP, diff --git a/adapter/outbound/dns.go b/adapter/outbound/dns.go index 2ce8a3cb..5e253d2a 100644 --- a/adapter/outbound/dns.go +++ b/adapter/outbound/dns.go @@ -158,6 +158,7 @@ func NewDnsWithOption(option DnsOption) *Dns { Base: &Base{ name: option.Name, tp: C.Dns, + pdName: option.ProviderName, udp: true, tfo: option.TFO, mpTcp: option.MPTCP, diff --git a/adapter/outbound/http.go b/adapter/outbound/http.go index 09169ad2..9707bf13 100644 --- a/adapter/outbound/http.go +++ b/adapter/outbound/http.go @@ -170,6 +170,7 @@ func NewHttp(option HttpOption) (*Http, error) { name: option.Name, addr: net.JoinHostPort(option.Server, strconv.Itoa(option.Port)), tp: C.Http, + pdName: option.ProviderName, tfo: option.TFO, mpTcp: option.MPTCP, iface: option.Interface, diff --git a/adapter/outbound/hysteria.go b/adapter/outbound/hysteria.go index 2d2a5e74..67c9af0b 100644 --- a/adapter/outbound/hysteria.go +++ b/adapter/outbound/hysteria.go @@ -243,6 +243,7 @@ func NewHysteria(option HysteriaOption) (*Hysteria, error) { name: option.Name, addr: addr, tp: C.Hysteria, + pdName: option.ProviderName, udp: true, tfo: option.FastOpen, iface: option.Interface, diff --git a/adapter/outbound/hysteria2.go b/adapter/outbound/hysteria2.go index 06d2a691..29822769 100644 --- a/adapter/outbound/hysteria2.go +++ b/adapter/outbound/hysteria2.go @@ -110,6 +110,7 @@ func NewHysteria2(option Hysteria2Option) (*Hysteria2, error) { name: option.Name, addr: addr, tp: C.Hysteria2, + pdName: option.ProviderName, udp: true, iface: option.Interface, rmark: option.RoutingMark, diff --git a/adapter/outbound/mieru.go b/adapter/outbound/mieru.go index 5a5b7ae6..af790b6e 100644 --- a/adapter/outbound/mieru.go +++ b/adapter/outbound/mieru.go @@ -167,10 +167,11 @@ func NewMieru(option MieruOption) (*Mieru, error) { Base: &Base{ name: option.Name, addr: addr, - iface: option.Interface, tp: C.Mieru, + pdName: option.ProviderName, udp: option.UDP, xudp: false, + iface: option.Interface, rmark: option.RoutingMark, prefer: option.IPVersion, }, diff --git a/adapter/outbound/shadowsocks.go b/adapter/outbound/shadowsocks.go index 176f486c..8e4d9354 100644 --- a/adapter/outbound/shadowsocks.go +++ b/adapter/outbound/shadowsocks.go @@ -458,6 +458,7 @@ func NewShadowSocks(option ShadowSocksOption) (*ShadowSocks, error) { name: option.Name, addr: addr, tp: C.Shadowsocks, + pdName: option.ProviderName, udp: option.UDP, tfo: option.TFO, mpTcp: option.MPTCP, diff --git a/adapter/outbound/shadowsocksr.go b/adapter/outbound/shadowsocksr.go index 38be1780..09c3924e 100644 --- a/adapter/outbound/shadowsocksr.go +++ b/adapter/outbound/shadowsocksr.go @@ -162,6 +162,7 @@ func NewShadowSocksR(option ShadowSocksROption) (*ShadowSocksR, error) { name: option.Name, addr: addr, tp: C.ShadowsocksR, + pdName: option.ProviderName, udp: option.UDP, tfo: option.TFO, mpTcp: option.MPTCP, diff --git a/adapter/outbound/snell.go b/adapter/outbound/snell.go index 8890729d..64295a70 100644 --- a/adapter/outbound/snell.go +++ b/adapter/outbound/snell.go @@ -165,6 +165,7 @@ func NewSnell(option SnellOption) (*Snell, error) { name: option.Name, addr: addr, tp: C.Snell, + pdName: option.ProviderName, udp: option.UDP, tfo: option.TFO, mpTcp: option.MPTCP, diff --git a/adapter/outbound/socks5.go b/adapter/outbound/socks5.go index 1a47417d..c0048084 100644 --- a/adapter/outbound/socks5.go +++ b/adapter/outbound/socks5.go @@ -190,6 +190,7 @@ func NewSocks5(option Socks5Option) (*Socks5, error) { name: option.Name, addr: net.JoinHostPort(option.Server, strconv.Itoa(option.Port)), tp: C.Socks5, + pdName: option.ProviderName, udp: option.UDP, tfo: option.TFO, mpTcp: option.MPTCP, diff --git a/adapter/outbound/ssh.go b/adapter/outbound/ssh.go index be185a83..5dca2b17 100644 --- a/adapter/outbound/ssh.go +++ b/adapter/outbound/ssh.go @@ -186,6 +186,7 @@ func NewSsh(option SshOption) (*Ssh, error) { name: option.Name, addr: addr, tp: C.Ssh, + pdName: option.ProviderName, udp: false, iface: option.Interface, rmark: option.RoutingMark, diff --git a/adapter/outbound/sudoku.go b/adapter/outbound/sudoku.go index ed045b53..44affacc 100644 --- a/adapter/outbound/sudoku.go +++ b/adapter/outbound/sudoku.go @@ -238,6 +238,7 @@ func NewSudoku(option SudokuOption) (*Sudoku, error) { name: option.Name, addr: baseConf.ServerAddress, tp: C.Sudoku, + pdName: option.ProviderName, udp: true, tfo: option.TFO, mpTcp: option.MPTCP, diff --git a/adapter/outbound/trojan.go b/adapter/outbound/trojan.go index 51ed4dd1..cf86f7b4 100644 --- a/adapter/outbound/trojan.go +++ b/adapter/outbound/trojan.go @@ -288,6 +288,7 @@ func NewTrojan(option TrojanOption) (*Trojan, error) { name: option.Name, addr: addr, tp: C.Trojan, + pdName: option.ProviderName, udp: option.UDP, tfo: option.TFO, mpTcp: option.MPTCP, diff --git a/adapter/outbound/tuic.go b/adapter/outbound/tuic.go index 886c8684..e29ad3cc 100644 --- a/adapter/outbound/tuic.go +++ b/adapter/outbound/tuic.go @@ -252,6 +252,7 @@ func NewTuic(option TuicOption) (*Tuic, error) { name: option.Name, addr: addr, tp: C.Tuic, + pdName: option.ProviderName, udp: true, tfo: option.FastOpen, iface: option.Interface, diff --git a/adapter/outbound/vless.go b/adapter/outbound/vless.go index 5dbb1424..c5c759ac 100644 --- a/adapter/outbound/vless.go +++ b/adapter/outbound/vless.go @@ -417,6 +417,7 @@ func NewVless(option VlessOption) (*Vless, error) { name: option.Name, addr: net.JoinHostPort(option.Server, strconv.Itoa(option.Port)), tp: C.Vless, + pdName: option.ProviderName, udp: option.UDP, xudp: option.XUDP, tfo: option.TFO, diff --git a/adapter/outbound/vmess.go b/adapter/outbound/vmess.go index 90cb2902..ea874250 100644 --- a/adapter/outbound/vmess.go +++ b/adapter/outbound/vmess.go @@ -427,6 +427,7 @@ func NewVmess(option VmessOption) (*Vmess, error) { name: option.Name, addr: net.JoinHostPort(option.Server, strconv.Itoa(option.Port)), tp: C.Vmess, + pdName: option.ProviderName, udp: option.UDP, xudp: option.XUDP, tfo: option.TFO, diff --git a/adapter/outbound/wireguard.go b/adapter/outbound/wireguard.go index 68d69d33..86f8a61b 100644 --- a/adapter/outbound/wireguard.go +++ b/adapter/outbound/wireguard.go @@ -170,6 +170,7 @@ func NewWireGuard(option WireGuardOption) (*WireGuard, error) { name: option.Name, addr: net.JoinHostPort(option.Server, strconv.Itoa(option.Port)), tp: C.WireGuard, + pdName: option.ProviderName, udp: option.UDP, iface: option.Interface, rmark: option.RoutingMark, diff --git a/adapter/parser.go b/adapter/parser.go index 0ad45ca9..08f90afe 100644 --- a/adapter/parser.go +++ b/adapter/parser.go @@ -18,6 +18,7 @@ func ParseProxy(mapping map[string]any, options ...ProxyOption) (C.Proxy, error) opt := applyProxyOptions(options...) basicOption := outbound.BasicOption{ DialerForAPI: opt.DialerForAPI, + ProviderName: opt.ProviderName, } var ( @@ -186,6 +187,7 @@ func ParseProxy(mapping map[string]any, options ...ProxyOption) (C.Proxy, error) type proxyOption struct { DialerForAPI C.Dialer + ProviderName string } func applyProxyOptions(options ...ProxyOption) proxyOption { @@ -203,3 +205,9 @@ func WithDialerForAPI(dialer C.Dialer) ProxyOption { opt.DialerForAPI = dialer } } + +func WithProviderName(name string) ProxyOption { + return func(opt *proxyOption) { + opt.ProviderName = name + } +} diff --git a/adapter/provider/parser.go b/adapter/provider/parser.go index d6297b56..6e0da678 100644 --- a/adapter/provider/parser.go +++ b/adapter/provider/parser.go @@ -99,7 +99,7 @@ func ParseProxyProvider(name string, mapping map[string]any) (P.ProxyProvider, e } hc := NewHealthCheck([]C.Proxy{}, schema.HealthCheck.URL, uint(schema.HealthCheck.TestTimeout), hcInterval, schema.HealthCheck.Lazy, expectedStatus) - parser, err := NewProxiesParser(schema.Filter, schema.ExcludeFilter, schema.ExcludeType, schema.DialerProxy, schema.Override) + parser, err := NewProxiesParser(name, schema.Filter, schema.ExcludeFilter, schema.ExcludeType, schema.DialerProxy, schema.Override) if err != nil { return nil, err } diff --git a/adapter/provider/provider.go b/adapter/provider/provider.go index e5d3b8ac..54a78699 100644 --- a/adapter/provider/provider.go +++ b/adapter/provider/provider.go @@ -330,7 +330,7 @@ func (cp *CompatibleProvider) Close() error { return cp.compatibleProvider.Close() } -func NewProxiesParser(filter string, excludeFilter string, excludeType string, dialerProxy string, override OverrideSchema) (resource.Parser[[]C.Proxy], error) { +func NewProxiesParser(pdName string, filter string, excludeFilter string, excludeType string, dialerProxy string, override OverrideSchema) (resource.Parser[[]C.Proxy], error) { var excludeTypeArray []string if excludeType != "" { excludeTypeArray = strings.Split(excludeType, "|") @@ -448,7 +448,7 @@ func NewProxiesParser(filter string, excludeFilter string, excludeType string, d } } - proxy, err := adapter.ParseProxy(mapping) + proxy, err := adapter.ParseProxy(mapping, adapter.WithProviderName(pdName)) if err != nil { return nil, fmt.Errorf("proxy %d error: %w", idx, err) } diff --git a/constant/adapters.go b/constant/adapters.go index 0b9098fd..44628848 100644 --- a/constant/adapters.go +++ b/constant/adapters.go @@ -102,13 +102,14 @@ type Dialer interface { } type ProxyInfo struct { - XUDP bool - TFO bool - MPTCP bool - SMUX bool - Interface string - RoutingMark int - DialerProxy string + XUDP bool + TFO bool + MPTCP bool + SMUX bool + Interface string + RoutingMark int + ProviderName string + DialerProxy string } type ProxyAdapter interface {