From 77a5373d44566e4696b7de51477932ac1f22b9a5 Mon Sep 17 00:00:00 2001 From: Tension Date: Tue, 30 Dec 2025 14:39:15 +0800 Subject: [PATCH] feat(adapter): add support for additional parameters in Adapter and Client structs --- adapter/adapter.go | 122 +++++++++++---------- adapter/client.go | 14 ++- internal/handler/subscribe.go | 15 +++ internal/logic/subscribe/subscribeLogic.go | 1 + internal/types/subscribe.go | 8 +- 5 files changed, 96 insertions(+), 64 deletions(-) diff --git a/adapter/adapter.go b/adapter/adapter.go index da5d049..b915bd0 100644 --- a/adapter/adapter.go +++ b/adapter/adapter.go @@ -8,16 +8,24 @@ import ( ) type Adapter struct { - SiteName string // 站点名称 - Servers []*node.Node // 服务器列表 - UserInfo User // 用户信息 - ClientTemplate string // 客户端配置模板 - OutputFormat string // 输出格式,默认是 base64 - SubscribeName string // 订阅名称 + Type string // 协议类型 + SiteName string // 站点名称 + Servers []*node.Node // 服务器列表 + UserInfo User // 用户信息 + ClientTemplate string // 客户端配置模板 + OutputFormat string // 输出格式,默认是 base64 + SubscribeName string // 订阅名称 + Params map[string]string // 其他参数 } type Option func(*Adapter) +func WithParams(params map[string]string) Option { + return func(opts *Adapter) { + opts.Params = params + } +} + // WithServers 设置服务器列表 func WithServers(servers []*node.Node) Option { return func(opts *Adapter) { @@ -76,6 +84,7 @@ func (adapter *Adapter) Client() (*Client, error) { OutputFormat: adapter.OutputFormat, Proxies: []Proxy{}, UserInfo: adapter.UserInfo, + Params: adapter.Params, } proxies, err := adapter.Proxies(adapter.Servers) @@ -101,55 +110,58 @@ func (adapter *Adapter) Proxies(servers []*node.Node) ([]Proxy, error) { } for _, protocol := range protocols { if protocol.Type == item.Protocol { - proxies = append(proxies, Proxy{ - Sort: item.Sort, - Name: item.Name, - Server: item.Address, - Port: item.Port, - Type: item.Protocol, - Tags: strings.Split(item.Tags, ","), - Security: protocol.Security, - SNI: protocol.SNI, - AllowInsecure: protocol.AllowInsecure, - Fingerprint: protocol.Fingerprint, - RealityServerAddr: protocol.RealityServerAddr, - RealityServerPort: protocol.RealityServerPort, - RealityPrivateKey: protocol.RealityPrivateKey, - RealityPublicKey: protocol.RealityPublicKey, - RealityShortId: protocol.RealityShortId, - Transport: protocol.Transport, - Host: protocol.Host, - Path: protocol.Path, - ServiceName: protocol.ServiceName, - Method: protocol.Cipher, - ServerKey: protocol.ServerKey, - Flow: protocol.Flow, - HopPorts: protocol.HopPorts, - HopInterval: protocol.HopInterval, - ObfsPassword: protocol.ObfsPassword, - UpMbps: protocol.UpMbps, - DownMbps: protocol.DownMbps, - DisableSNI: protocol.DisableSNI, - ReduceRtt: protocol.ReduceRtt, - UDPRelayMode: protocol.UDPRelayMode, - CongestionController: protocol.CongestionController, - PaddingScheme: protocol.PaddingScheme, - Multiplex: protocol.Multiplex, - XhttpMode: protocol.XhttpMode, - XhttpExtra: protocol.XhttpExtra, - Encryption: protocol.Encryption, - EncryptionMode: protocol.EncryptionMode, - EncryptionRtt: protocol.EncryptionRtt, - EncryptionTicket: protocol.EncryptionTicket, - EncryptionServerPadding: protocol.EncryptionServerPadding, - EncryptionPrivateKey: protocol.EncryptionPrivateKey, - EncryptionClientPadding: protocol.EncryptionClientPadding, - EncryptionPassword: protocol.EncryptionPassword, - Ratio: protocol.Ratio, - CertMode: protocol.CertMode, - CertDNSProvider: protocol.CertDNSProvider, - CertDNSEnv: protocol.CertDNSEnv, - }) + proxies = append( + proxies, + Proxy{ + Sort: item.Sort, + Name: item.Name, + Server: item.Address, + Port: item.Port, + Type: item.Protocol, + Tags: strings.Split(item.Tags, ","), + Security: protocol.Security, + SNI: protocol.SNI, + AllowInsecure: protocol.AllowInsecure, + Fingerprint: protocol.Fingerprint, + RealityServerAddr: protocol.RealityServerAddr, + RealityServerPort: protocol.RealityServerPort, + RealityPrivateKey: protocol.RealityPrivateKey, + RealityPublicKey: protocol.RealityPublicKey, + RealityShortId: protocol.RealityShortId, + Transport: protocol.Transport, + Host: protocol.Host, + Path: protocol.Path, + ServiceName: protocol.ServiceName, + Method: protocol.Cipher, + ServerKey: protocol.ServerKey, + Flow: protocol.Flow, + HopPorts: protocol.HopPorts, + HopInterval: protocol.HopInterval, + ObfsPassword: protocol.ObfsPassword, + UpMbps: protocol.UpMbps, + DownMbps: protocol.DownMbps, + DisableSNI: protocol.DisableSNI, + ReduceRtt: protocol.ReduceRtt, + UDPRelayMode: protocol.UDPRelayMode, + CongestionController: protocol.CongestionController, + PaddingScheme: protocol.PaddingScheme, + Multiplex: protocol.Multiplex, + XhttpMode: protocol.XhttpMode, + XhttpExtra: protocol.XhttpExtra, + Encryption: protocol.Encryption, + EncryptionMode: protocol.EncryptionMode, + EncryptionRtt: protocol.EncryptionRtt, + EncryptionTicket: protocol.EncryptionTicket, + EncryptionServerPadding: protocol.EncryptionServerPadding, + EncryptionPrivateKey: protocol.EncryptionPrivateKey, + EncryptionClientPadding: protocol.EncryptionClientPadding, + EncryptionPassword: protocol.EncryptionPassword, + Ratio: protocol.Ratio, + CertMode: protocol.CertMode, + CertDNSProvider: protocol.CertDNSProvider, + CertDNSEnv: protocol.CertDNSEnv, + }, + ) } } } diff --git a/adapter/client.go b/adapter/client.go index e456898..d267c12 100644 --- a/adapter/client.go +++ b/adapter/client.go @@ -93,12 +93,13 @@ type User struct { } type Client struct { - SiteName string // Name of the site - SubscribeName string // Name of the subscription - ClientTemplate string // Template for the entire client configuration - OutputFormat string // json, yaml, etc. - Proxies []Proxy // List of proxy configurations - UserInfo User // User information + SiteName string // Name of the site + SubscribeName string // Name of the subscription + ClientTemplate string // Template for the entire client configuration + OutputFormat string // json, yaml, etc. + Proxies []Proxy // List of proxy configurations + UserInfo User // User information + Params map[string]string // Additional parameters } func (c *Client) Build() ([]byte, error) { @@ -119,6 +120,7 @@ func (c *Client) Build() ([]byte, error) { "OutputFormat": c.OutputFormat, "Proxies": proxies, "UserInfo": c.UserInfo, + "Params": c.Params, }) if err != nil { return nil, err diff --git a/internal/handler/subscribe.go b/internal/handler/subscribe.go index 6c228ed..790ed1b 100644 --- a/internal/handler/subscribe.go +++ b/internal/handler/subscribe.go @@ -23,6 +23,10 @@ func SubscribeHandler(svcCtx *svc.ServiceContext) func(c *gin.Context) { ua := c.GetHeader("User-Agent") req.UA = c.Request.Header.Get("User-Agent") req.Flag = c.Query("flag") + req.Type = c.Query("type") + // 获取所有查询参数 + req.Params = getQueryMap(c.Request) + if svcCtx.Config.Subscribe.PanDomain { domain := c.Request.Host domainArr := strings.Split(domain, ".") @@ -94,3 +98,14 @@ func RegisterSubscribeHandlers(router *gin.Engine, serverCtx *svc.ServiceContext } router.GET(path, SubscribeHandler(serverCtx)) } + +// GetQueryMap 将 http.Request 的查询参数转换为 map[string]string +func getQueryMap(r *http.Request) map[string]string { + result := make(map[string]string) + for k, v := range r.URL.Query() { + if len(v) > 0 { + result[k] = v[0] + } + } + return result +} diff --git a/internal/logic/subscribe/subscribeLogic.go b/internal/logic/subscribe/subscribeLogic.go index 4b884bd..29a5a94 100644 --- a/internal/logic/subscribe/subscribeLogic.go +++ b/internal/logic/subscribe/subscribeLogic.go @@ -108,6 +108,7 @@ func (l *SubscribeLogic) Handler(req *types.SubscribeRequest) (resp *types.Subsc Traffic: userSubscribe.Traffic, SubscribeURL: l.getSubscribeV2URL(req.Token), }), + adapter.WithParams(req.Params), ) // Get client config diff --git a/internal/types/subscribe.go b/internal/types/subscribe.go index 0e8ab26..ec1bfd9 100644 --- a/internal/types/subscribe.go +++ b/internal/types/subscribe.go @@ -2,9 +2,11 @@ package types type ( SubscribeRequest struct { - Flag string - Token string - UA string + Flag string + Token string + Type string + UA string + Params map[string]string } SubscribeResponse struct { Config []byte