0
0
mirror of https://github.com/XTLS/REALITY.git synced 2025-08-23 06:58:39 +00:00

Allow parallel PostHandshakeRecordsLens detection

This commit is contained in:
风扇滑翔翼 2025-06-26 19:18:40 +00:00 committed by GitHub
parent 50752aec6b
commit 035d0975b5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -12,18 +12,31 @@ import (
utls "github.com/refraction-networking/utls" utls "github.com/refraction-networking/utls"
) )
type postHandshakeRecordsLens struct {
lens map[string][]int
once sync.Once
}
var GlobalPostHandshakeRecordsLock sync.Mutex var GlobalPostHandshakeRecordsLock sync.Mutex
var GlobalPostHandshakeRecordsLens map[*Config]map[string][]int var GlobalPostHandshakeRecordsLens map[*Config]*postHandshakeRecordsLens
func DetectPostHandshakeRecordsLens(config *Config) map[string][]int { func DetectPostHandshakeRecordsLens(config *Config) map[string][]int {
GlobalPostHandshakeRecordsLock.Lock() GlobalPostHandshakeRecordsLock.Lock()
defer GlobalPostHandshakeRecordsLock.Unlock()
if GlobalPostHandshakeRecordsLens == nil { if GlobalPostHandshakeRecordsLens == nil {
GlobalPostHandshakeRecordsLens = make(map[*Config]map[string][]int) GlobalPostHandshakeRecordsLens = make(map[*Config]*postHandshakeRecordsLens)
} }
var postHandshakeRecordsLensCache *postHandshakeRecordsLens
if GlobalPostHandshakeRecordsLens[config] == nil { if GlobalPostHandshakeRecordsLens[config] == nil {
GlobalPostHandshakeRecordsLens[config] = make(map[string][]int) postHandshakeRecordsLensCache = &postHandshakeRecordsLens{
lens: make(map[string][]int),
}
GlobalPostHandshakeRecordsLens[config] = postHandshakeRecordsLensCache
} else {
postHandshakeRecordsLensCache = GlobalPostHandshakeRecordsLens[config]
}
GlobalPostHandshakeRecordsLock.Unlock()
postHandshakeRecordsLensCache.once.Do(func() {
for sni := range config.ServerNames { for sni := range config.ServerNames {
target, err := net.Dial("tcp", config.Dest) target, err := net.Dial("tcp", config.Dest)
if err != nil { if err != nil {
@ -36,7 +49,7 @@ func DetectPostHandshakeRecordsLens(config *Config) map[string][]int {
} }
detectConn := &DetectConn{ detectConn := &DetectConn{
Conn: target, Conn: target,
PostHandshakeRecordsLens: GlobalPostHandshakeRecordsLens[config], PostHandshakeRecordsLens: postHandshakeRecordsLensCache.lens,
Sni: sni, Sni: sni,
} }
uConn := utls.UClient(detectConn, &utls.Config{ uConn := utls.UClient(detectConn, &utls.Config{
@ -47,8 +60,8 @@ func DetectPostHandshakeRecordsLens(config *Config) map[string][]int {
} }
io.Copy(io.Discard, uConn) io.Copy(io.Discard, uConn)
} }
} })
return GlobalPostHandshakeRecordsLens[config] return postHandshakeRecordsLensCache.lens
} }
type DetectConn struct { type DetectConn struct {