From 06ba479094dd5d4b44430174305055715b83faaa Mon Sep 17 00:00:00 2001 From: lixiangwuxian Date: Mon, 21 Jul 2025 02:34:13 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=BC=BA=E5=88=B6=E4=BD=BF=E7=94=A8IPv?= =?UTF-8?q?4=E5=8F=91=E8=B5=B7=E8=AE=A2=E9=98=85=E8=AF=B7=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- handler/rss/parse.go | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) 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