0x00 TL;DR我使用 Go 来实现一个 http 客户端和 squid 作为转发代理来向远程服务器发送请求。当通过代理使用 http/1.1 或 http/1.1, http2 没有代理时一切顺利,但是,当通过代理使用 http2 客户端时,大多数连接立即关闭,只保留一两个。不确定这是我的错误代码还是什么。在 http 传输上启用了 idleConn 配置。提前致谢。0x01 环境代码package mainimport ( "context" "crypto/tls" "fmt" "io" "io/ioutil" "net" "net/http" "net/url" "sync" "time")const ( proxyURL = "http://{{proxy-ip}}:3128")func main() { wg := &sync.WaitGroup{} wg.Add(1) go func() { doSendRequests() wg.Done() }() wg.Wait()}func doSendRequests() { //client := newHTTPClient(nil) client := newHTTPClient(proxy) round := 0 for { round += 1 for i := 0; i < 5; i++ { go func(r int) { start := time.Now() var err error defer func() { duration := time.Since(start) fmt.Printf("Round: %d, A: %v, duration: %v\n", r, err, duration) }() req := newRequest("https://www.google.com") resp, err := client.Do(req) if err == nil { io.Copy(ioutil.Discard, resp.Body) resp.Body.Close() } else { fmt.Printf("A: %v\n", err) } }(round) } time.Sleep(100 * time.Second) }}type TLSDialer struct { net.Dialer}var ( config = &tls.Config{InsecureSkipVerify: true})func (dialer *TLSDialer) DialContext(ctx context.Context, network, addr string) (net.Conn, error) { return tls.DialWithDialer(&dialer.Dialer, network, addr, config)}var ( DefaultDialer = net.Dialer{ Timeout: 30 * time.Second, KeepAlive: 30 * time.Second, DualStack: true, } DefaultTLSDialer = TLSDialer{DefaultDialer})func proxy(req *http.Request) (*url.URL, error) { uri, err := url.Parse(proxyURL) if err != nil { return nil, nil } return uri, nil}
- 1 回答
- 0 关注
- 190 浏览
添加回答
举报
0/150
提交
取消
