diff --git a/proxy/socks/server.go b/proxy/socks/server.go index 34c42ae9..472b23a0 100644 --- a/proxy/socks/server.go +++ b/proxy/socks/server.go @@ -2,6 +2,7 @@ package socks import ( "context" + goerrors "errors" "io" "time" @@ -78,7 +79,13 @@ func (s *Server) Process(ctx context.Context, network net.Network, conn stat.Con switch network { case net.Network_TCP: firstbyte := make([]byte, 1) - conn.Read(firstbyte) + if n, err := conn.Read(firstbyte); n == 0 { + if goerrors.Is(err, io.EOF) { + errors.LogInfo(ctx, "Connection closed immediately, likely health check connection") + return nil + } + return errors.New("failed to read from connection").Base(err) + } if firstbyte[0] != 5 && firstbyte[0] != 4 { // Check if it is Socks5/4/4a errors.LogDebug(ctx, "Not Socks request, try to parse as HTTP request") return s.httpServer.ProcessWithFirstbyte(ctx, network, conn, dispatcher, firstbyte...)