From c320e89108c73b3d83ace6c2f32db1da7a48e5d4 Mon Sep 17 00:00:00 2001 From: Ran The <197520740+ranthe21@users.noreply.github.com> Date: Thu, 9 Jul 2026 23:55:40 +0300 Subject: [PATCH] HTTPUpgrade server: Keep accepting after transient errors as RAW does; Add handshake read deadline as WS does (#6463) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit https://github.com/XTLS/Xray-core/pull/6463#issuecomment-4929183257 --------- Co-authored-by: 风扇滑翔翼 --- transport/internet/httpupgrade/hub.go | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/transport/internet/httpupgrade/hub.go b/transport/internet/httpupgrade/hub.go index cb9a79d9a..cbf6a0d47 100644 --- a/transport/internet/httpupgrade/hub.go +++ b/transport/internet/httpupgrade/hub.go @@ -4,8 +4,10 @@ import ( "bufio" "context" "crypto/tls" + "io" "net/http" "strings" + "time" "github.com/xtls/xray-core/common" "github.com/xtls/xray-core/common/errors" @@ -43,7 +45,11 @@ func (s *server) Handle(conn net.Conn) { // 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) + // timeout and header limit are the same as websocket + conn.SetReadDeadline(time.Now().Add(time.Second * 4)) + defer conn.SetReadDeadline(time.Time{}) + connReader := bufio.NewReader(io.LimitReader(conn, 12288)) + req, err := http.ReadRequest(connReader) if err != nil { return nil, err @@ -94,7 +100,15 @@ func (s *server) keepAccepting() { for { conn, err := s.innnerListener.Accept() if err != nil { - return + errStr := err.Error() + if strings.Contains(errStr, "closed") { + break + } + errors.LogWarningInner(context.Background(), err, "failed to accept raw connections") + if strings.Contains(errStr, "too many") { + time.Sleep(time.Millisecond * 500) + } + continue } go s.Handle(conn) }