fix: 修复HTTP代理响应读取和URL解析错误

正确处理HTTP代理CONNECT响应,逐行读取直到空行以避免读取越界;
检查url.Parse返回的错误,防止解析失败时设置无效Cookie。
This commit is contained in:
mogumc committed 2026-05-27 20:49:19 +08:00
1 parent d8539b8813
commit f6d9e85d0f
2 files changed
+22 -21

No files matched your search

+4 -1
View File
@@ -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
}
+18 -20
View File
@@ -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