From f333359c8a8455b8cd564c51d5bb54fd0e7a617d Mon Sep 17 00:00:00 2001 From: wwqgtxx Date: Fri, 8 May 2026 17:26:30 +0800 Subject: [PATCH] chore: move magic close http2 connections function to own fork --- common/httputils/force_close.go | 8 +++- common/httputils/h2_transport_close.go | 63 -------------------------- go.mod | 2 +- go.sum | 4 +- 4 files changed, 9 insertions(+), 68 deletions(-) delete mode 100644 common/httputils/h2_transport_close.go diff --git a/common/httputils/force_close.go b/common/httputils/force_close.go index 526a0a2a..06a083bf 100644 --- a/common/httputils/force_close.go +++ b/common/httputils/force_close.go @@ -10,12 +10,16 @@ type closeIdleTransport interface { CloseIdleConnections() } +type closeHttp2Connections interface { + CloseHttp2Connections() +} + func CloseTransport(roundTripper http.RoundTripper) { if tr, ok := roundTripper.(closeIdleTransport); ok { tr.CloseIdleConnections() // for *http.Transport } - if tr, ok := roundTripper.(*http.Http2Transport); ok { - closeHttp2Transport(tr) // for *http2.Transport + if tr, ok := roundTripper.(closeHttp2Connections); ok { + tr.CloseHttp2Connections() // for *http.Transport in our own fork } if tr, ok := roundTripper.(io.Closer); ok { _ = tr.Close() // for *http3.Transport diff --git a/common/httputils/h2_transport_close.go b/common/httputils/h2_transport_close.go deleted file mode 100644 index 00bedb9c..00000000 --- a/common/httputils/h2_transport_close.go +++ /dev/null @@ -1,63 +0,0 @@ -package httputils - -import ( - "net" - "sync" - "time" - "unsafe" - - "github.com/metacubex/http" -) - -type clientConnPool struct { - t *http.Http2Transport - - mu sync.Mutex - conns map[string][]*http.Http2ClientConn // key is host:port - dialing map[string]unsafe.Pointer // currently in-flight dials - keys map[*http.Http2ClientConn][]string - addConnCalls map[string]unsafe.Pointer // in-flight addConnIfNeeded calls -} - -type clientConn struct { - t *http.Transport - tconn net.Conn // usually *tls.Conn, except specialized impls -} - -type efaceWords struct { - typ unsafe.Pointer - data unsafe.Pointer -} - -type tlsConn interface { - net.Conn - NetConn() net.Conn -} - -func closeClientConn(cc *http.Http2ClientConn) { // like forceCloseConn() in http.Http2ClientConn but also apply for tls-like conn - if conn, ok := (*clientConn)(unsafe.Pointer(cc)).tconn.(tlsConn); ok { - t := time.AfterFunc(time.Second, func() { - _ = conn.NetConn().Close() - }) - defer t.Stop() - } - _ = cc.Close() -} - -func closeHttp2Transport(tr *http.Http2Transport) { - connPool := transportConnPool(tr) - p := (*clientConnPool)((*efaceWords)(unsafe.Pointer(&connPool)).data) - p.mu.Lock() - defer p.mu.Unlock() - for _, vv := range p.conns { - for _, cc := range vv { - closeClientConn(cc) - } - } - // cleanup - p.conns = make(map[string][]*http.Http2ClientConn) - p.keys = make(map[*http.Http2ClientConn][]string) -} - -//go:linkname transportConnPool github.com/metacubex/http.(*http2Transport).connPool -func transportConnPool(t *http.Http2Transport) http.Http2ClientConnPool diff --git a/go.mod b/go.mod index 5dec002e..bda8b7c3 100644 --- a/go.mod +++ b/go.mod @@ -21,7 +21,7 @@ require ( github.com/metacubex/edwards25519 v1.2.0 github.com/metacubex/fswatch v0.1.1 github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759 - github.com/metacubex/http v0.1.3 + github.com/metacubex/http v0.1.4 github.com/metacubex/kcp-go v0.0.0-20260105040817-550693377604 github.com/metacubex/mhurl v0.1.0 github.com/metacubex/mlkem v0.1.0 diff --git a/go.sum b/go.sum index a7aa7dc5..ddd9f619 100644 --- a/go.sum +++ b/go.sum @@ -103,8 +103,8 @@ github.com/metacubex/hkdf v0.1.0 h1:fPA6VzXK8cU1foc/TOmGCDmSa7pZbxlnqhl3RNsthaA= github.com/metacubex/hkdf v0.1.0/go.mod h1:3seEfds3smgTAXqUGn+tgEJH3uXdsUjOiduG/2EtvZ4= github.com/metacubex/hpke v0.1.0 h1:gu2jUNhraehWi0P/z5HX2md3d7L1FhPQE6/Q0E9r9xQ= github.com/metacubex/hpke v0.1.0/go.mod h1:vfDm6gfgrwlXUxKDkWbcE44hXtmc1uxLDm2BcR11b3U= -github.com/metacubex/http v0.1.3 h1:gTDIKAxObYYstqN7MmVts8Z/TVqRV0leo/jxlY9WI4M= -github.com/metacubex/http v0.1.3/go.mod h1:Nxx0zZAo2AhRfanyL+fmmK6ACMtVsfpwIl1aFAik2Eg= +github.com/metacubex/http v0.1.4 h1:gU1y8WlqslzxGmedW2ah74fGL6wJYU2HXUkCMJtCa2A= +github.com/metacubex/http v0.1.4/go.mod h1:Nxx0zZAo2AhRfanyL+fmmK6ACMtVsfpwIl1aFAik2Eg= github.com/metacubex/kcp-go v0.0.0-20260105040817-550693377604 h1:hJwCVlE3ojViC35MGHB+FBr8TuIf3BUFn2EQ1VIamsI= github.com/metacubex/kcp-go v0.0.0-20260105040817-550693377604/go.mod h1:lpmN3m269b3V5jFCWtffqBLS4U3QQoIid9ugtO+OhVc= github.com/metacubex/mhurl v0.1.0 h1:ZdW4Zxe3j3uJ89gNytOazHu6kbHn5owutN/VfXOI8GE=