chore: restful api contains provider-name for proxies

This commit is contained in:
wwqgtxx 2025-12-04 15:10:13 +08:00
parent 91f5593f4e
commit b5fa3ee99a
24 changed files with 48 additions and 14 deletions

View File

@ -153,8 +153,9 @@ func (p *Proxy) MarshalJSON() ([]byte, error) {
mapping["mptcp"] = proxyInfo.MPTCP mapping["mptcp"] = proxyInfo.MPTCP
mapping["smux"] = proxyInfo.SMUX mapping["smux"] = proxyInfo.SMUX
mapping["interface"] = proxyInfo.Interface mapping["interface"] = proxyInfo.Interface
mapping["dialer-proxy"] = proxyInfo.DialerProxy
mapping["routing-mark"] = proxyInfo.RoutingMark mapping["routing-mark"] = proxyInfo.RoutingMark
mapping["provider-name"] = proxyInfo.ProviderName
mapping["dialer-proxy"] = proxyInfo.DialerProxy
return json.Marshal(mapping) return json.Marshal(mapping)
} }

View File

@ -90,6 +90,7 @@ func NewAnyTLS(option AnyTLSOption) (*AnyTLS, error) {
name: option.Name, name: option.Name,
addr: addr, addr: addr,
tp: C.AnyTLS, tp: C.AnyTLS,
pdName: option.ProviderName,
udp: option.UDP, udp: option.UDP,
tfo: option.TFO, tfo: option.TFO,
mpTcp: option.MPTCP, mpTcp: option.MPTCP,

View File

@ -27,16 +27,17 @@ type ProxyAdapter interface {
type Base struct { type Base struct {
name string name string
addr string addr string
iface string
tp C.AdapterType tp C.AdapterType
pdName string
udp bool udp bool
xudp bool xudp bool
tfo bool tfo bool
mpTcp bool mpTcp bool
iface string
rmark int rmark int
id string
prefer C.DNSPrefer prefer C.DNSPrefer
dialer C.Dialer dialer C.Dialer
id string
} }
// Name implements C.ProxyAdapter // Name implements C.ProxyAdapter
@ -85,6 +86,7 @@ func (b *Base) ProxyInfo() (info C.ProxyInfo) {
info.SMUX = false info.SMUX = false
info.Interface = b.iface info.Interface = b.iface
info.RoutingMark = b.rmark info.RoutingMark = b.rmark
info.ProviderName = b.pdName
return return
} }
@ -167,7 +169,11 @@ type BasicOption struct {
IPVersion C.DNSPrefer `proxy:"ip-version,omitempty"` 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 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. 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 { func (b *BasicOption) NewDialer(opts []dialer.Option) C.Dialer {

View File

@ -69,6 +69,7 @@ func NewDirectWithOption(option DirectOption) *Direct {
Base: &Base{ Base: &Base{
name: option.Name, name: option.Name,
tp: C.Direct, tp: C.Direct,
pdName: option.ProviderName,
udp: true, udp: true,
tfo: option.TFO, tfo: option.TFO,
mpTcp: option.MPTCP, mpTcp: option.MPTCP,

View File

@ -158,6 +158,7 @@ func NewDnsWithOption(option DnsOption) *Dns {
Base: &Base{ Base: &Base{
name: option.Name, name: option.Name,
tp: C.Dns, tp: C.Dns,
pdName: option.ProviderName,
udp: true, udp: true,
tfo: option.TFO, tfo: option.TFO,
mpTcp: option.MPTCP, mpTcp: option.MPTCP,

View File

@ -170,6 +170,7 @@ func NewHttp(option HttpOption) (*Http, error) {
name: option.Name, name: option.Name,
addr: net.JoinHostPort(option.Server, strconv.Itoa(option.Port)), addr: net.JoinHostPort(option.Server, strconv.Itoa(option.Port)),
tp: C.Http, tp: C.Http,
pdName: option.ProviderName,
tfo: option.TFO, tfo: option.TFO,
mpTcp: option.MPTCP, mpTcp: option.MPTCP,
iface: option.Interface, iface: option.Interface,

View File

@ -243,6 +243,7 @@ func NewHysteria(option HysteriaOption) (*Hysteria, error) {
name: option.Name, name: option.Name,
addr: addr, addr: addr,
tp: C.Hysteria, tp: C.Hysteria,
pdName: option.ProviderName,
udp: true, udp: true,
tfo: option.FastOpen, tfo: option.FastOpen,
iface: option.Interface, iface: option.Interface,

View File

@ -110,6 +110,7 @@ func NewHysteria2(option Hysteria2Option) (*Hysteria2, error) {
name: option.Name, name: option.Name,
addr: addr, addr: addr,
tp: C.Hysteria2, tp: C.Hysteria2,
pdName: option.ProviderName,
udp: true, udp: true,
iface: option.Interface, iface: option.Interface,
rmark: option.RoutingMark, rmark: option.RoutingMark,

View File

@ -167,10 +167,11 @@ func NewMieru(option MieruOption) (*Mieru, error) {
Base: &Base{ Base: &Base{
name: option.Name, name: option.Name,
addr: addr, addr: addr,
iface: option.Interface,
tp: C.Mieru, tp: C.Mieru,
pdName: option.ProviderName,
udp: option.UDP, udp: option.UDP,
xudp: false, xudp: false,
iface: option.Interface,
rmark: option.RoutingMark, rmark: option.RoutingMark,
prefer: option.IPVersion, prefer: option.IPVersion,
}, },

View File

@ -458,6 +458,7 @@ func NewShadowSocks(option ShadowSocksOption) (*ShadowSocks, error) {
name: option.Name, name: option.Name,
addr: addr, addr: addr,
tp: C.Shadowsocks, tp: C.Shadowsocks,
pdName: option.ProviderName,
udp: option.UDP, udp: option.UDP,
tfo: option.TFO, tfo: option.TFO,
mpTcp: option.MPTCP, mpTcp: option.MPTCP,

View File

@ -162,6 +162,7 @@ func NewShadowSocksR(option ShadowSocksROption) (*ShadowSocksR, error) {
name: option.Name, name: option.Name,
addr: addr, addr: addr,
tp: C.ShadowsocksR, tp: C.ShadowsocksR,
pdName: option.ProviderName,
udp: option.UDP, udp: option.UDP,
tfo: option.TFO, tfo: option.TFO,
mpTcp: option.MPTCP, mpTcp: option.MPTCP,

View File

@ -165,6 +165,7 @@ func NewSnell(option SnellOption) (*Snell, error) {
name: option.Name, name: option.Name,
addr: addr, addr: addr,
tp: C.Snell, tp: C.Snell,
pdName: option.ProviderName,
udp: option.UDP, udp: option.UDP,
tfo: option.TFO, tfo: option.TFO,
mpTcp: option.MPTCP, mpTcp: option.MPTCP,

View File

@ -190,6 +190,7 @@ func NewSocks5(option Socks5Option) (*Socks5, error) {
name: option.Name, name: option.Name,
addr: net.JoinHostPort(option.Server, strconv.Itoa(option.Port)), addr: net.JoinHostPort(option.Server, strconv.Itoa(option.Port)),
tp: C.Socks5, tp: C.Socks5,
pdName: option.ProviderName,
udp: option.UDP, udp: option.UDP,
tfo: option.TFO, tfo: option.TFO,
mpTcp: option.MPTCP, mpTcp: option.MPTCP,

View File

@ -186,6 +186,7 @@ func NewSsh(option SshOption) (*Ssh, error) {
name: option.Name, name: option.Name,
addr: addr, addr: addr,
tp: C.Ssh, tp: C.Ssh,
pdName: option.ProviderName,
udp: false, udp: false,
iface: option.Interface, iface: option.Interface,
rmark: option.RoutingMark, rmark: option.RoutingMark,

View File

@ -238,6 +238,7 @@ func NewSudoku(option SudokuOption) (*Sudoku, error) {
name: option.Name, name: option.Name,
addr: baseConf.ServerAddress, addr: baseConf.ServerAddress,
tp: C.Sudoku, tp: C.Sudoku,
pdName: option.ProviderName,
udp: true, udp: true,
tfo: option.TFO, tfo: option.TFO,
mpTcp: option.MPTCP, mpTcp: option.MPTCP,

View File

@ -288,6 +288,7 @@ func NewTrojan(option TrojanOption) (*Trojan, error) {
name: option.Name, name: option.Name,
addr: addr, addr: addr,
tp: C.Trojan, tp: C.Trojan,
pdName: option.ProviderName,
udp: option.UDP, udp: option.UDP,
tfo: option.TFO, tfo: option.TFO,
mpTcp: option.MPTCP, mpTcp: option.MPTCP,

View File

@ -252,6 +252,7 @@ func NewTuic(option TuicOption) (*Tuic, error) {
name: option.Name, name: option.Name,
addr: addr, addr: addr,
tp: C.Tuic, tp: C.Tuic,
pdName: option.ProviderName,
udp: true, udp: true,
tfo: option.FastOpen, tfo: option.FastOpen,
iface: option.Interface, iface: option.Interface,

View File

@ -417,6 +417,7 @@ func NewVless(option VlessOption) (*Vless, error) {
name: option.Name, name: option.Name,
addr: net.JoinHostPort(option.Server, strconv.Itoa(option.Port)), addr: net.JoinHostPort(option.Server, strconv.Itoa(option.Port)),
tp: C.Vless, tp: C.Vless,
pdName: option.ProviderName,
udp: option.UDP, udp: option.UDP,
xudp: option.XUDP, xudp: option.XUDP,
tfo: option.TFO, tfo: option.TFO,

View File

@ -427,6 +427,7 @@ func NewVmess(option VmessOption) (*Vmess, error) {
name: option.Name, name: option.Name,
addr: net.JoinHostPort(option.Server, strconv.Itoa(option.Port)), addr: net.JoinHostPort(option.Server, strconv.Itoa(option.Port)),
tp: C.Vmess, tp: C.Vmess,
pdName: option.ProviderName,
udp: option.UDP, udp: option.UDP,
xudp: option.XUDP, xudp: option.XUDP,
tfo: option.TFO, tfo: option.TFO,

View File

@ -170,6 +170,7 @@ func NewWireGuard(option WireGuardOption) (*WireGuard, error) {
name: option.Name, name: option.Name,
addr: net.JoinHostPort(option.Server, strconv.Itoa(option.Port)), addr: net.JoinHostPort(option.Server, strconv.Itoa(option.Port)),
tp: C.WireGuard, tp: C.WireGuard,
pdName: option.ProviderName,
udp: option.UDP, udp: option.UDP,
iface: option.Interface, iface: option.Interface,
rmark: option.RoutingMark, rmark: option.RoutingMark,

View File

@ -18,6 +18,7 @@ func ParseProxy(mapping map[string]any, options ...ProxyOption) (C.Proxy, error)
opt := applyProxyOptions(options...) opt := applyProxyOptions(options...)
basicOption := outbound.BasicOption{ basicOption := outbound.BasicOption{
DialerForAPI: opt.DialerForAPI, DialerForAPI: opt.DialerForAPI,
ProviderName: opt.ProviderName,
} }
var ( var (
@ -186,6 +187,7 @@ func ParseProxy(mapping map[string]any, options ...ProxyOption) (C.Proxy, error)
type proxyOption struct { type proxyOption struct {
DialerForAPI C.Dialer DialerForAPI C.Dialer
ProviderName string
} }
func applyProxyOptions(options ...ProxyOption) proxyOption { func applyProxyOptions(options ...ProxyOption) proxyOption {
@ -203,3 +205,9 @@ func WithDialerForAPI(dialer C.Dialer) ProxyOption {
opt.DialerForAPI = dialer opt.DialerForAPI = dialer
} }
} }
func WithProviderName(name string) ProxyOption {
return func(opt *proxyOption) {
opt.ProviderName = name
}
}

View File

@ -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) 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 { if err != nil {
return nil, err return nil, err
} }

View File

@ -330,7 +330,7 @@ func (cp *CompatibleProvider) Close() error {
return cp.compatibleProvider.Close() 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 var excludeTypeArray []string
if excludeType != "" { if excludeType != "" {
excludeTypeArray = strings.Split(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 { if err != nil {
return nil, fmt.Errorf("proxy %d error: %w", idx, err) return nil, fmt.Errorf("proxy %d error: %w", idx, err)
} }

View File

@ -102,13 +102,14 @@ type Dialer interface {
} }
type ProxyInfo struct { type ProxyInfo struct {
XUDP bool XUDP bool
TFO bool TFO bool
MPTCP bool MPTCP bool
SMUX bool SMUX bool
Interface string Interface string
RoutingMark int RoutingMark int
DialerProxy string ProviderName string
DialerProxy string
} }
type ProxyAdapter interface { type ProxyAdapter interface {