package proxy import ( "context" "crypto/tls" "net" "sync" ) var ( globalManager ProxyManager globalMutex sync.RWMutex once sync.Once ) // InitGlobalProxy 初始化全局代理管理器 func InitGlobalProxy(proxyURL string) error { globalMutex.Lock() defer globalMutex.Unlock() config, err := ParseProxyURL(proxyURL) if err != nil { return err } if err := ValidateProxyConfig(config); err != nil { return err } // 关闭旧的管理器 if globalManager != nil { globalManager.Close() } globalManager = NewProxyManager(config) return nil } // GetGlobalProxy 获取全局代理管理器 func GetGlobalProxy() ProxyManager { globalMutex.RLock() defer globalMutex.RUnlock() if globalManager == nil { // 使用默认配置初始化 once.Do(func() { globalManager = NewProxyManager(DefaultProxyConfig()) }) } return globalManager } // UpdateGlobalProxyConfig 更新全局代理配置 func UpdateGlobalProxyConfig(config *ProxyConfig) error { if err := ValidateProxyConfig(config); err != nil { return err } manager := GetGlobalProxy() return manager.UpdateConfig(config) } // CloseGlobalProxy 关闭全局代理管理器 func CloseGlobalProxy() error { globalMutex.Lock() defer globalMutex.Unlock() if globalManager != nil { err := globalManager.Close() globalManager = nil return err } return nil } // GetGlobalProxyStats 获取全局代理统计信息 func GetGlobalProxyStats() *ProxyStats { manager := GetGlobalProxy() return manager.Stats() } // 便捷函数 // DialWithProxy 使用全局代理拨号 func DialWithProxy(network, address string) (net.Conn, error) { manager := GetGlobalProxy() dialer, err := manager.GetDialer() if err != nil { return nil, err } return dialer.Dial(network, address) } // DialContextWithProxy 使用全局代理和上下文拨号 func DialContextWithProxy(ctx context.Context, network, address string) (net.Conn, error) { manager := GetGlobalProxy() dialer, err := manager.GetDialer() if err != nil { return nil, err } return dialer.DialContext(ctx, network, address) } // DialTLSWithProxy 使用全局代理建立TLS连接 func DialTLSWithProxy(network, address string, config *tls.Config) (net.Conn, error) { manager := GetGlobalProxy() dialer, err := manager.GetTLSDialer() if err != nil { return nil, err } return dialer.DialTLS(network, address, config) } // DialTLSContextWithProxy 使用全局代理和上下文建立TLS连接 func DialTLSContextWithProxy(ctx context.Context, network, address string, config *tls.Config) (net.Conn, error) { manager := GetGlobalProxy() dialer, err := manager.GetTLSDialer() if err != nil { return nil, err } return dialer.DialTLSContext(ctx, network, address, config) } // IsProxyEnabledGlobally 检查全局是否启用了代理 func IsProxyEnabledGlobally() bool { manager := GetGlobalProxy() stats := manager.Stats() return stats.ProxyType != "none" } // GetGlobalProxyType 获取全局代理类型 func GetGlobalProxyType() string { manager := GetGlobalProxy() stats := manager.Stats() return stats.ProxyType } // GetGlobalProxyAddress 获取全局代理地址 func GetGlobalProxyAddress() string { manager := GetGlobalProxy() stats := manager.Stats() return stats.ProxyAddress }