fscan/Common/proxy/Global.go
ZacharyZcR 879293e680 refactor: 重构代理系统为模块化架构
将Proxy.go的代理连接逻辑重构为完整的模块化系统,
提供更好的性能、可维护性和功能扩展。

主要变更:
- Proxy.go: 从192行单体实现重构为简洁包装层
- 新增proxy模块包含5个核心文件:Types.go、Manager.go等
- 支持多种代理类型:HTTP、HTTPS、SOCKS5、直连
- 实现连接池、缓存机制和智能资源管理
- 添加详细的连接统计和性能监控
- 提供线程安全的配置管理和动态更新
- 完全保持API向后兼容性,无需修改调用代码

新增功能:
- HTTP/HTTPS代理支持(原来仅支持SOCKS5)
- 连接跟踪和统计分析
- 错误分类和详细上下文信息
- 配置验证和URL解析
- 全局代理管理实例

测试验证:
- 编译无错误 ✓
- 基础连接功能正常 ✓
- 向后兼容性验证通过 ✓
2025-08-05 03:36:53 +08:00

149 lines
3.2 KiB
Go

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
}