From f6d9e85d0fb8362d81a99288c3161851147daa2a Mon Sep 17 00:00:00 2001 From: mogumc Date: Wed, 27 May 2026 20:49:19 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8DHTTP=E4=BB=A3=E7=90=86?= =?UTF-8?q?=E5=93=8D=E5=BA=94=E8=AF=BB=E5=8F=96=E5=92=8CURL=E8=A7=A3?= =?UTF-8?q?=E6=9E=90=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 正确处理HTTP代理CONNECT响应,逐行读取直到空行以避免读取越界; 检查url.Parse返回的错误,防止解析失败时设置无效Cookie。 --- api/http.go | 5 ++++- api/socket.go | 38 ++++++++++++++++++-------------------- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/api/http.go b/api/http.go index 49c9263..96050ac 100644 --- a/api/http.go +++ b/api/http.go @@ -130,12 +130,15 @@ func setupCookies(client *http.Client, req *HttpRequest) { if len(req.Cookies) == 0 { return } + parsedURL, err := url.Parse(req.URL) + if err != nil { + return + } cookieJar, _ := cookiejar.New(nil) var cookieList []*http.Cookie for name, value := range req.Cookies { cookieList = append(cookieList, &http.Cookie{Name: name, Value: value}) } - parsedURL, _ := url.Parse(req.URL) cookieJar.SetCookies(parsedURL, cookieList) client.Jar = cookieJar } diff --git a/api/socket.go b/api/socket.go index 42bf6ea..3a96bf9 100644 --- a/api/socket.go +++ b/api/socket.go @@ -1,10 +1,12 @@ package api import ( + "bufio" "fmt" "net" "net/http" "net/url" + "strings" "sync" "time" @@ -319,38 +321,34 @@ func httpConnectProxy(target, proxyAddr string) (net.Conn, error) { return nil, err } - // 读取响应 - buf := make([]byte, 1024) - n, err := conn.Read(buf) + // 读取响应(直到遇到空行) + reader := bufio.NewReader(conn) + line, err := reader.ReadString('\n') if err != nil { conn.Close() return nil, err } // 检查 200 状态 - resp := string(buf[:n]) - if !contains(resp, "200") { + if !strings.Contains(line, "200") { conn.Close() - return nil, fmt.Errorf("代理连接失败: %s", resp) + return nil, fmt.Errorf("代理连接失败: %s", strings.TrimSpace(line)) + } + + // 读取剩余响应头直到空行 + for { + line, err := reader.ReadString('\n') + if err != nil { + break + } + if line == "\r\n" || line == "\n" { + break + } } return conn, nil } -// contains 检查字符串是否包含子串 -func contains(s, substr string) bool { - return len(s) >= len(substr) && (s == substr || len(s) > 0 && containsSubstr(s, substr)) -} - -func containsSubstr(s, substr string) bool { - for i := 0; i <= len(s)-len(substr); i++ { - if s[i:i+len(substr)] == substr { - return true - } - } - return false -} - // tcpBufSize TCP 读取缓冲区大小,64KB 覆盖绝大多数调试场景 const tcpBufSize = 64 << 10