From 7abad3fac02855d64424fafd7268c5d8f5f754a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A3=8E=E6=89=87=E6=BB=91=E7=BF=94=E7=BF=BC?= Date: Thu, 12 Feb 2026 22:18:38 +0800 Subject: [PATCH] HTTPUpgrade server: Fix certain stuck in Handle() (#5661) https://github.com/XTLS/Xray-core/pull/5661#issuecomment-3890662818 --- transport/internet/httpupgrade/hub.go | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/transport/internet/httpupgrade/hub.go b/transport/internet/httpupgrade/hub.go index c3a51607..778a35e5 100644 --- a/transport/internet/httpupgrade/hub.go +++ b/transport/internet/httpupgrade/hub.go @@ -31,7 +31,18 @@ func (s *server) Addr() net.Addr { return nil } -func (s *server) Handle(conn net.Conn) (stat.Connection, error) { +func (s *server) Handle(conn net.Conn) { + upgradedConn, err := s.upgrade(conn) + if err != nil { + common.CloseIfExists(conn) + errors.LogInfoInner(context.Background(), err, "failed to handle request") + return + } + s.addConn(upgradedConn) +} + +// upgrade execute a fake websocket upgrade process and return the available connection +func (s *server) upgrade(conn net.Conn) (stat.Connection, error) { connReader := bufio.NewReader(conn) req, err := http.ReadRequest(connReader) if err != nil { @@ -52,7 +63,6 @@ func (s *server) Handle(conn net.Conn) (stat.Connection, error) { connection := strings.ToLower(req.Header.Get("Connection")) upgrade := strings.ToLower(req.Header.Get("Upgrade")) if connection != "upgrade" || upgrade != "websocket" { - _ = conn.Close() return nil, errors.New("unrecognized request") } resp := &http.Response{ @@ -67,7 +77,6 @@ func (s *server) Handle(conn net.Conn) (stat.Connection, error) { resp.Header.Set("Upgrade", "websocket") err = resp.Write(conn) if err != nil { - _ = conn.Close() return nil, err } @@ -99,12 +108,7 @@ func (s *server) keepAccepting() { if err != nil { return } - handledConn, err := s.Handle(conn) - if err != nil { - errors.LogInfoInner(context.Background(), err, "failed to handle request") - continue - } - s.addConn(handledConn) + go s.Handle(conn) } }