mirror of
https://github.com/XTLS/Xray-core.git
synced 2026-05-08 14:13:22 +00:00
Hysteria transport: Fix client-side clientManager (#5928)
Fixes https://github.com/XTLS/Xray-core/issues/5911
This commit is contained in:
@@ -94,6 +94,12 @@ func (s *Server) Process(ctx context.Context, network net.Network, conn stat.Con
|
|||||||
useremail = inbound.User.Email
|
useremail = inbound.User.Email
|
||||||
userlevel = inbound.User.Level
|
userlevel = inbound.User.Level
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
// get a dummy user
|
||||||
|
inbound.User = &protocol.MemoryUser{
|
||||||
|
Email: "",
|
||||||
|
Level: 0,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, ok := iConn.(*hysteria.InterUdpConn); ok {
|
if _, ok := iConn.(*hysteria.InterUdpConn); ok {
|
||||||
|
|||||||
@@ -421,8 +421,13 @@ func (c *client) udphopDialer(addr *net.UDPAddr) (net.PacketConn, error) {
|
|||||||
return pktConn, nil
|
return pktConn, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type dialerConf struct {
|
||||||
|
net.Destination
|
||||||
|
*internet.MemoryStreamConfig
|
||||||
|
}
|
||||||
|
|
||||||
type clientManager struct {
|
type clientManager struct {
|
||||||
m map[string]*client
|
m map[dialerConf]*client
|
||||||
mutex sync.Mutex
|
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) {
|
func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.MemoryStreamConfig) (stat.Connection, error) {
|
||||||
tlsConfig := tls.ConfigFromStreamSettings(streamSettings)
|
tlsConfig := tls.ConfigFromStreamSettings(streamSettings)
|
||||||
@@ -444,13 +450,24 @@ func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.Me
|
|||||||
}
|
}
|
||||||
|
|
||||||
requireDatagram := hyCtx.RequireDatagramFromContext(ctx)
|
requireDatagram := hyCtx.RequireDatagramFromContext(ctx)
|
||||||
addr := dest.NetAddr()
|
|
||||||
config := streamSettings.ProtocolSettings.(*Config)
|
config := streamSettings.ProtocolSettings.(*Config)
|
||||||
|
|
||||||
manger.mutex.Lock()
|
initmanager.Do(func() {
|
||||||
c, ok := manger.m[addr]
|
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 {
|
if !ok {
|
||||||
dest.Network = net.Network_UDP
|
|
||||||
c = &client{
|
c = &client{
|
||||||
ctx: ctx,
|
ctx: ctx,
|
||||||
dest: dest,
|
dest: dest,
|
||||||
@@ -460,10 +477,10 @@ func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.Me
|
|||||||
udpmaskManager: streamSettings.UdpmaskManager,
|
udpmaskManager: streamSettings.UdpmaskManager,
|
||||||
quicParams: streamSettings.QuicParams,
|
quicParams: streamSettings.QuicParams,
|
||||||
}
|
}
|
||||||
manger.m[addr] = c
|
manager.m[dialerConf{Destination: dest, MemoryStreamConfig: streamSettings}] = c
|
||||||
}
|
}
|
||||||
c.setCtx(ctx)
|
c.setCtx(ctx)
|
||||||
manger.mutex.Unlock()
|
manager.mutex.Unlock()
|
||||||
|
|
||||||
if requireDatagram {
|
if requireDatagram {
|
||||||
return c.udp()
|
return c.udp()
|
||||||
@@ -471,19 +488,6 @@ func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.Me
|
|||||||
return c.tcp()
|
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() {
|
func init() {
|
||||||
common.Must(internet.RegisterTransportDialer(protocolName, Dial))
|
common.Must(internet.RegisterTransportDialer(protocolName, Dial))
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user