0
0
mirror of https://github.com/XTLS/REALITY.git synced 2025-08-22 14:38:35 +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"
)
type postHandshakeRecordsLens struct {
lens map[string][]int
once sync.Once
}
var GlobalPostHandshakeRecordsLock sync.Mutex
var GlobalPostHandshakeRecordsLens map[*Config]map[string][]int
var GlobalPostHandshakeRecordsLens map[*Config]*postHandshakeRecordsLens
func DetectPostHandshakeRecordsLens(config *Config) map[string][]int {
GlobalPostHandshakeRecordsLock.Lock()
defer GlobalPostHandshakeRecordsLock.Unlock()
if GlobalPostHandshakeRecordsLens == nil {
GlobalPostHandshakeRecordsLens = make(map[*Config]map[string][]int)
GlobalPostHandshakeRecordsLens = make(map[*Config]*postHandshakeRecordsLens)
}
var postHandshakeRecordsLensCache *postHandshakeRecordsLens
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 {
target, err := net.Dial("tcp", config.Dest)
if err != nil {
@ -36,7 +49,7 @@ func DetectPostHandshakeRecordsLens(config *Config) map[string][]int {
}
detectConn := &DetectConn{
Conn: target,
PostHandshakeRecordsLens: GlobalPostHandshakeRecordsLens[config],
PostHandshakeRecordsLens: postHandshakeRecordsLensCache.lens,
Sni: sni,
}
uConn := utls.UClient(detectConn, &utls.Config{
@ -47,8 +60,8 @@ func DetectPostHandshakeRecordsLens(config *Config) map[string][]int {
}
io.Copy(io.Discard, uConn)
}
}
return GlobalPostHandshakeRecordsLens[config]
})
return postHandshakeRecordsLensCache.lens
}
type DetectConn struct {