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:
parent
50752aec6b
commit
035d0975b5
@ -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 {
|
||||||
|
Loading…
Reference in New Issue
Block a user