XTLS Vision: Discard expired pre-connect conn automatically

https://t.me/projectXray/4538408

https://github.com/XTLS/Xray-core/pull/5270#issuecomment-3602122299
This commit is contained in:
RPRX
2025-12-02 13:28:00 +00:00
parent 93312d29e5
commit c123f163c2

View File

@@ -57,7 +57,12 @@ type Handler struct {
testpre uint32 testpre uint32
initpre sync.Once initpre sync.Once
preConns chan stat.Connection preConns chan *ConnExpire
}
type ConnExpire struct {
Conn stat.Connection
Expire time.Time
} }
// New creates a new VLess outbound handler. // New creates a new VLess outbound handler.
@@ -141,26 +146,34 @@ func (h *Handler) Process(ctx context.Context, link *transport.Link, dialer inte
if h.testpre > 0 && h.reverse == nil { if h.testpre > 0 && h.reverse == nil {
h.initpre.Do(func() { h.initpre.Do(func() {
h.preConns = make(chan stat.Connection) h.preConns = make(chan *ConnExpire)
for range h.testpre { // TODO: randomize for range h.testpre { // TODO: randomize
go func() { go func() {
defer func() { recover() }() defer func() { recover() }()
ctx := xctx.ContextWithID(context.Background(), session.NewID()) ctx := xctx.ContextWithID(context.Background(), session.NewID())
for { for {
time.Sleep(time.Millisecond * 200) // TODO: randomize
conn, err := dialer.Dial(ctx, rec.Destination) conn, err := dialer.Dial(ctx, rec.Destination)
if err != nil { if err != nil {
errors.LogWarningInner(ctx, err, "pre-connect failed") errors.LogWarningInner(ctx, err, "pre-connect failed")
continue continue
} }
h.preConns <- conn h.preConns <- &ConnExpire{Conn: conn, Expire: time.Now().Add(time.Minute * 2)} // TODO: customize & randomize
time.Sleep(time.Millisecond * 200) // TODO: customize & randomize
} }
}() }()
} }
}) })
if conn = <-h.preConns; conn == nil { for {
connTime := <-h.preConns
if connTime == nil {
return errors.New("closed handler").AtWarning() return errors.New("closed handler").AtWarning()
} }
if time.Now().Before(connTime.Expire) {
conn = connTime.Conn
break
}
connTime.Conn.Close()
}
} }
if conn == nil { if conn == nil {