fix: 修复HTTP代理响应读取和URL解析错误
正确处理HTTP代理CONNECT响应,逐行读取直到空行以避免读取越界; 检查url.Parse返回的错误,防止解析失败时设置无效Cookie。
This commit is contained in:
1 parent
d8539b8813
commit
f6d9e85d0f
2 files changed
+22
-21
No files matched your search
+4
-1
@@ -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
@@ -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
|
||||
|
||||
|
||||
Reference in new issue
Block a user