From 7afda5881853f689ce0972fb9d3d490306fd5203 Mon Sep 17 00:00:00 2001 From: Shtorm <108103062+shtorm-7@users.noreply.github.com> Date: Sat, 5 Sep 2026 09:23:55 +0300 Subject: [PATCH] provider: Add override_dialer_options option --- adapter/provider/adapter.go | 20 +++++++++++++++----- examples/provider/local.json | 4 ++++ examples/provider/remote.json | 4 ++++ option/provider.go | 33 ++++++++++++++++++--------------- provider/local/provider.go | 2 ++ provider/remote/provider.go | 1 + 6 files changed, 44 insertions(+), 20 deletions(-) diff --git a/adapter/provider/adapter.go b/adapter/provider/adapter.go index 0b4a0505..1a3a93ed 100644 --- a/adapter/provider/adapter.go +++ b/adapter/provider/adapter.go @@ -36,11 +36,12 @@ type Adapter struct { callbackAccess sync.Mutex callbacks list.List[adapter.ProviderUpdateCallback] - link string - enabled bool - removeEmojis bool - timeout time.Duration - interval time.Duration + link string + enabled bool + removeEmojis bool + overrideDialerOptions *option.DialerOptions + timeout time.Duration + interval time.Duration } func NewAdapter(ctx context.Context, router adapter.Router, outbound adapter.OutboundManager, logFactory log.Factory, logger log.ContextLogger, providerTag string, providerType string, options option.ProviderHealthCheckOptions) Adapter { @@ -75,6 +76,10 @@ func (a *Adapter) SetRemoveEmojis(remove bool) { a.removeEmojis = remove } +func (a *Adapter) SetOverrideDialerOptions(options *option.DialerOptions) { + a.overrideDialerOptions = options +} + func (a *Adapter) Start() error { a.history = service.PtrFromContext[urltest.HistoryStorage](a.ctx) if a.history == nil { @@ -119,6 +124,11 @@ func (a *Adapter) UpdateOutbounds(oldOpts []option.Outbound, newOpts []option.Ou oldOptByTag[opt.Tag] = opt } for i, opt := range newOpts { + if a.overrideDialerOptions != nil { + if wrapper, ok := opt.Options.(option.DialerOptionsWrapper); ok { + wrapper.ReplaceDialerOptions(*a.overrideDialerOptions) + } + } var tag string if opt.Tag != "" { tag = F.ToString(a.providerTag, "/", opt.Tag) diff --git a/examples/provider/local.json b/examples/provider/local.json index d16e08ae..0266abae 100644 --- a/examples/provider/local.json +++ b/examples/provider/local.json @@ -50,6 +50,10 @@ "path": "subscriptions/my-sub.txt", // Remove emoji flags from proxy names. "remove_emojis": true, + // Override dial fields on every outbound from this provider. + "override_dialer_options": { + // Dial fields + }, "health_check": { "enabled": true, "url": "https://www.gstatic.com/generate_204", diff --git a/examples/provider/remote.json b/examples/provider/remote.json index e1c7f9e9..ba25cb22 100644 --- a/examples/provider/remote.json +++ b/examples/provider/remote.json @@ -82,6 +82,10 @@ "include": "(?i)hk|jp|sg|us", // Remove emoji flags from proxy names. "remove_emojis": true, + // Override dial fields on every outbound from this provider. + "override_dialer_options": { + // Dial fields + }, "health_check": { "enabled": true, "url": "https://www.gstatic.com/generate_204", diff --git a/option/provider.go b/option/provider.go index 34f75913..f138e752 100644 --- a/option/provider.go +++ b/option/provider.go @@ -47,28 +47,31 @@ func (h *Provider) UnmarshalJSONContext(ctx context.Context, content []byte) err } type ProviderLocalOptions struct { - Path string `json:"path"` - RemoveEmojis bool `json:"remove_emojis,omitempty"` - HealthCheck ProviderHealthCheckOptions `json:"health_check,omitempty"` + Path string `json:"path"` + RemoveEmojis bool `json:"remove_emojis,omitempty"` + HealthCheck ProviderHealthCheckOptions `json:"health_check,omitempty"` + OverrideDialerOptions *DialerOptions `json:"override_dialer_options,omitempty"` } type ProviderRemoteOptions struct { - URL string `json:"url"` - UserAgent string `json:"user_agent,omitempty"` - Headers badoption.HTTPHeader `json:"headers,omitempty"` - DownloadDetour string `json:"download_detour,omitempty"` - UpdateInterval badoption.Duration `json:"update_interval,omitempty"` + URL string `json:"url"` + UserAgent string `json:"user_agent,omitempty"` + Headers badoption.HTTPHeader `json:"headers,omitempty"` + DownloadDetour string `json:"download_detour,omitempty"` + UpdateInterval badoption.Duration `json:"update_interval,omitempty"` - Exclude *badoption.Regexp `json:"exclude,omitempty"` - Include *badoption.Regexp `json:"include,omitempty"` - RemoveEmojis bool `json:"remove_emojis,omitempty"` - HealthCheck ProviderHealthCheckOptions `json:"health_check,omitempty"` + Exclude *badoption.Regexp `json:"exclude,omitempty"` + Include *badoption.Regexp `json:"include,omitempty"` + RemoveEmojis bool `json:"remove_emojis,omitempty"` + HealthCheck ProviderHealthCheckOptions `json:"health_check,omitempty"` + OverrideDialerOptions *DialerOptions `json:"override_dialer_options,omitempty"` } type ProviderInlineOptions struct { - Outbounds []Outbound `json:"outbounds,omitempty"` - RemoveEmojis bool `json:"remove_emojis,omitempty"` - HealthCheck ProviderHealthCheckOptions `json:"health_check,omitempty"` + Outbounds []Outbound `json:"outbounds,omitempty"` + RemoveEmojis bool `json:"remove_emojis,omitempty"` + HealthCheck ProviderHealthCheckOptions `json:"health_check,omitempty"` + OverrideDialerOptions *DialerOptions `json:"override_dialer_options,omitempty"` } type ProviderHealthCheckOptions struct { diff --git a/provider/local/provider.go b/provider/local/provider.go index 89cd3d86..eb8ceaaf 100644 --- a/provider/local/provider.go +++ b/provider/local/provider.go @@ -52,6 +52,7 @@ func NewProviderInline(ctx context.Context, router adapter.Router, logFactory lo logger: logger, } p.SetRemoveEmojis(options.RemoveEmojis) + p.SetOverrideDialerOptions(options.OverrideDialerOptions) p.UpdateOutbounds(nil, options.Outbounds) return p, nil } @@ -71,6 +72,7 @@ func NewProviderLocal(ctx context.Context, router adapter.Router, logFactory log provider: service.FromContext[adapter.ProviderManager](ctx), } provider.SetRemoveEmojis(options.RemoveEmojis) + provider.SetOverrideDialerOptions(options.OverrideDialerOptions) filePath := filemanager.BasePath(ctx, options.Path) provider.path, _ = filepath.Abs(filePath) watcher, err := fswatch.NewWatcher(fswatch.Options{ diff --git a/provider/remote/provider.go b/provider/remote/provider.go index a22414fd..fec616f9 100644 --- a/provider/remote/provider.go +++ b/provider/remote/provider.go @@ -101,6 +101,7 @@ func NewProviderRemote(ctx context.Context, router adapter.Router, logFactory lo include: (*regexp.Regexp)(options.Include), } p.SetRemoveEmojis(options.RemoveEmojis) + p.SetOverrideDialerOptions(options.OverrideDialerOptions) return p, nil }