diff --git a/handler/rss/parse.go b/handler/rss/parse.go index 4e9bc72..46d44a4 100644 --- a/handler/rss/parse.go +++ b/handler/rss/parse.go @@ -1,6 +1,7 @@ package rss import ( + "context" "crypto/md5" "encoding/xml" "errors" @@ -24,11 +25,28 @@ func createHTTPClient() *http.Client { Timeout: 30 * time.Second, } + // 创建强制使用IPv4的DialContext + dialContext := func(ctx context.Context, network, addr string) (net.Conn, error) { + // 强制使用IPv4 + if network == "tcp" { + network = "tcp4" + } + dialer := &net.Dialer{ + Timeout: 30 * time.Second, + KeepAlive: 30 * time.Second, + } + return dialer.DialContext(ctx, network, addr) + } + // 检查是否配置了代理 if config.ConfigManager.GetConfig().Management.ProxyAddr != "" { proxyURL, err := url.Parse(config.ConfigManager.GetConfig().Management.ProxyAddr) if err != nil { log.Printf("解析代理地址失败: %v\n", err) + // 即使代理配置失败,也要使用IPv4 + client.Transport = &http.Transport{ + DialContext: dialContext, + } return client } @@ -38,18 +56,32 @@ func createHTTPClient() *http.Client { if err == nil { client.Transport = &http.Transport{ Dial: func(network, addr string) (net.Conn, error) { + // 强制使用IPv4 + if network == "tcp" { + network = "tcp4" + } return dialer.Dial(network, addr) }, } } else { log.Printf("创建SOCKS5代理失败: %v\n", err) + // 代理失败时使用IPv4直连 + client.Transport = &http.Transport{ + DialContext: dialContext, + } } } else { log.Printf("使用HTTP/HTTPS代理: %s\n", proxyURL.Host) client.Transport = &http.Transport{ - Proxy: http.ProxyURL(proxyURL), + Proxy: http.ProxyURL(proxyURL), + DialContext: dialContext, } } + } else { + // 没有代理时使用IPv4直连 + client.Transport = &http.Transport{ + DialContext: dialContext, + } } return client