From 1182647a59a01d3e5db6f9682fe98c2936be5402 Mon Sep 17 00:00:00 2001 From: win Date: Wed, 1 Apr 2026 12:34:46 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20OAuth=20client=20=E5=BC=BA=E5=88=B6=20HT?= =?UTF-8?q?TP/1.1=20+=20=E4=BB=A3=E7=90=86=E8=B7=AF=E7=94=B1=E8=B0=83?= =?UTF-8?q?=E8=AF=95=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - createReqClient: EnableForceHTTP1() 避免 H2 ALPN 升级与自定义 TLS dialer 冲突 - 超时从 15s 延长到 30s - 增加代理路由日志,方便诊断 proxy_id 是否正确传递 - proxyurl.Parse 返回的 parsedProxy 直接复用,省去二次 url.Parse --- .../internal/repository/claude_oauth_service.go | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/backend/internal/repository/claude_oauth_service.go b/backend/internal/repository/claude_oauth_service.go index 433a4803..c27150ed 100644 --- a/backend/internal/repository/claude_oauth_service.go +++ b/backend/internal/repository/claude_oauth_service.go @@ -278,20 +278,20 @@ func createReqClient(proxyURL string) (*req.Client, error) { } client := req.C(). - SetTimeout(15 * time.Second). - SetCookieJar(nil) // 禁用 CookieJar,确保每次授权都是干净的会话 + SetTimeout(30 * time.Second). + SetCookieJar(nil). // 禁用 CookieJar,确保每次授权都是干净的会话 + EnableForceHTTP1() // 强制 HTTP/1.1,避免 H2 升级与自定义 TLS dialer 冲突 - trimmed, _, err := proxyurl.Parse(proxyURL) + trimmed, parsedProxy, err := proxyurl.Parse(proxyURL) if err != nil { return nil, err } - if trimmed != "" { - parsedProxy, parseErr := url.Parse(trimmed) - if parseErr != nil { - return nil, fmt.Errorf("parse proxy URL: %w", parseErr) - } + logger.LegacyPrintf("repository.claude_oauth", "[OAuth] createReqClient: proxyURL=%q trimmed=%q", logredact.RedactProxyURL(proxyURL), logredact.RedactProxyURL(trimmed)) + + if trimmed != "" && parsedProxy != nil { scheme := strings.ToLower(parsedProxy.Scheme) + logger.LegacyPrintf("repository.claude_oauth", "[OAuth] createReqClient: using proxy scheme=%s host=%s", scheme, parsedProxy.Hostname()) switch scheme { case "socks5", "socks5h": socks5Dialer := tlsfingerprint.NewSOCKS5ProxyDialer(profile, parsedProxy) @@ -303,6 +303,7 @@ func createReqClient(proxyURL string) (*req.Client, error) { client.SetProxyURL(trimmed) } } else { + logger.LegacyPrintf("repository.claude_oauth", "[OAuth] createReqClient: no proxy, using direct connection with utls") dialer := tlsfingerprint.NewDialer(profile, nil) client.SetDialTLS(dialer.DialTLSContext) }