mirror of
https://github.com/shadow1ng/fscan.git
synced 2025-09-14 14:06:44 +08:00

将Proxy.go的代理连接逻辑重构为完整的模块化系统, 提供更好的性能、可维护性和功能扩展。 主要变更: - Proxy.go: 从192行单体实现重构为简洁包装层 - 新增proxy模块包含5个核心文件:Types.go、Manager.go等 - 支持多种代理类型:HTTP、HTTPS、SOCKS5、直连 - 实现连接池、缓存机制和智能资源管理 - 添加详细的连接统计和性能监控 - 提供线程安全的配置管理和动态更新 - 完全保持API向后兼容性,无需修改调用代码 新增功能: - HTTP/HTTPS代理支持(原来仅支持SOCKS5) - 连接跟踪和统计分析 - 错误分类和详细上下文信息 - 配置验证和URL解析 - 全局代理管理实例 测试验证: - 编译无错误 ✓ - 基础连接功能正常 ✓ - 向后兼容性验证通过 ✓
149 lines
3.2 KiB
Go
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
|
|
} |