feat: 强制使用IPv4发起订阅请求

This commit is contained in:
lixiangwuxian 2025-07-21 02:34:13 +08:00
parent 3811049f30
commit 06ba479094

View File

@ -1,6 +1,7 @@
package rss package rss
import ( import (
"context"
"crypto/md5" "crypto/md5"
"encoding/xml" "encoding/xml"
"errors" "errors"
@ -24,11 +25,28 @@ func createHTTPClient() *http.Client {
Timeout: 30 * time.Second, 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 != "" { if config.ConfigManager.GetConfig().Management.ProxyAddr != "" {
proxyURL, err := url.Parse(config.ConfigManager.GetConfig().Management.ProxyAddr) proxyURL, err := url.Parse(config.ConfigManager.GetConfig().Management.ProxyAddr)
if err != nil { if err != nil {
log.Printf("解析代理地址失败: %v\n", err) log.Printf("解析代理地址失败: %v\n", err)
// 即使代理配置失败也要使用IPv4
client.Transport = &http.Transport{
DialContext: dialContext,
}
return client return client
} }
@ -38,18 +56,32 @@ func createHTTPClient() *http.Client {
if err == nil { if err == nil {
client.Transport = &http.Transport{ client.Transport = &http.Transport{
Dial: func(network, addr string) (net.Conn, error) { Dial: func(network, addr string) (net.Conn, error) {
// 强制使用IPv4
if network == "tcp" {
network = "tcp4"
}
return dialer.Dial(network, addr) return dialer.Dial(network, addr)
}, },
} }
} else { } else {
log.Printf("创建SOCKS5代理失败: %v\n", err) log.Printf("创建SOCKS5代理失败: %v\n", err)
// 代理失败时使用IPv4直连
client.Transport = &http.Transport{
DialContext: dialContext,
}
} }
} else { } else {
log.Printf("使用HTTP/HTTPS代理: %s\n", proxyURL.Host) log.Printf("使用HTTP/HTTPS代理: %s\n", proxyURL.Host)
client.Transport = &http.Transport{ client.Transport = &http.Transport{
Proxy: http.ProxyURL(proxyURL), Proxy: http.ProxyURL(proxyURL),
DialContext: dialContext,
} }
} }
} else {
// 没有代理时使用IPv4直连
client.Transport = &http.Transport{
DialContext: dialContext,
}
} }
return client return client