Hysteria transport: Fix client-side clientManager (#5928)

Fixes https://github.com/XTLS/Xray-core/issues/5911
This commit is contained in:
风扇滑翔翼
2026-04-14 00:14:15 +08:00
committed by GitHub
parent 806b8dc27d
commit e9f7d61c2e
2 changed files with 31 additions and 21 deletions

View File

@@ -94,6 +94,12 @@ func (s *Server) Process(ctx context.Context, network net.Network, conn stat.Con
useremail = inbound.User.Email
userlevel = inbound.User.Level
}
} else {
// get a dummy user
inbound.User = &protocol.MemoryUser{
Email: "",
Level: 0,
}
}
if _, ok := iConn.(*hysteria.InterUdpConn); ok {

View File

@@ -421,8 +421,13 @@ func (c *client) udphopDialer(addr *net.UDPAddr) (net.PacketConn, error) {
return pktConn, nil
}
type dialerConf struct {
net.Destination
*internet.MemoryStreamConfig
}
type clientManager struct {
m map[string]*client
m map[dialerConf]*client
mutex sync.Mutex
}
@@ -435,7 +440,8 @@ func (m *clientManager) clean() {
}
}
var manger *clientManager
var manager *clientManager
var initmanager sync.Once
func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.MemoryStreamConfig) (stat.Connection, error) {
tlsConfig := tls.ConfigFromStreamSettings(streamSettings)
@@ -444,13 +450,24 @@ func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.Me
}
requireDatagram := hyCtx.RequireDatagramFromContext(ctx)
addr := dest.NetAddr()
config := streamSettings.ProtocolSettings.(*Config)
manger.mutex.Lock()
c, ok := manger.m[addr]
initmanager.Do(func() {
manager = &clientManager{
m: make(map[dialerConf]*client),
}
(&task.Periodic{
Interval: 30 * time.Second,
Execute: func() error {
manager.clean()
return nil
},
}).Start()
})
manager.mutex.Lock()
dest.Network = net.Network_UDP
c, ok := manager.m[dialerConf{Destination: dest, MemoryStreamConfig: streamSettings}]
if !ok {
dest.Network = net.Network_UDP
c = &client{
ctx: ctx,
dest: dest,
@@ -460,10 +477,10 @@ func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.Me
udpmaskManager: streamSettings.UdpmaskManager,
quicParams: streamSettings.QuicParams,
}
manger.m[addr] = c
manager.m[dialerConf{Destination: dest, MemoryStreamConfig: streamSettings}] = c
}
c.setCtx(ctx)
manger.mutex.Unlock()
manager.mutex.Unlock()
if requireDatagram {
return c.udp()
@@ -471,19 +488,6 @@ func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.Me
return c.tcp()
}
func init() {
manger = &clientManager{
m: make(map[string]*client),
}
(&task.Periodic{
Interval: 30 * time.Second,
Execute: func() error {
manger.clean()
return nil
},
}).Start()
}
func init() {
common.Must(internet.RegisterTransportDialer(protocolName, Dial))
}