diff --git a/proxy/vmess/account.go b/proxy/vmess/account.go index 8f5e6004..809bca21 100644 --- a/proxy/vmess/account.go +++ b/proxy/vmess/account.go @@ -18,6 +18,7 @@ type MemoryAccount struct { Security protocol.SecurityType AuthenticatedLengthExperiment bool + NoTerminationSignal bool } // AnyValidID returns an ID that is either the main ID or one of the alternative IDs if any. @@ -45,14 +46,18 @@ func (a *Account) AsAccount() (protocol.Account, error) { return nil, newError("failed to parse ID").Base(err).AtError() } protoID := protocol.NewID(id) - var AuthenticatedLength bool + var AuthenticatedLength, NoTerminationSignal bool if strings.Contains(a.TestsEnabled, "AuthenticatedLength") { AuthenticatedLength = true } + if strings.Contains(a.TestsEnabled, "NoTerminationSignal") { + NoTerminationSignal = true + } return &MemoryAccount{ ID: protoID, AlterIDs: protocol.NewAlterIDs(protoID, uint16(a.AlterId)), Security: a.SecuritySettings.GetSecurityType(), AuthenticatedLengthExperiment: AuthenticatedLength, + NoTerminationSignal: NoTerminationSignal, }, nil } diff --git a/proxy/vmess/inbound/inbound.go b/proxy/vmess/inbound/inbound.go index ec508adb..64cdc934 100644 --- a/proxy/vmess/inbound/inbound.go +++ b/proxy/vmess/inbound/inbound.go @@ -207,7 +207,9 @@ func transferResponse(timer signal.ActivityUpdater, session *encoding.ServerSess return err } - if request.Option.Has(protocol.RequestOptionChunkStream) { + account := request.User.Account.(*vmess.MemoryAccount) + + if request.Option.Has(protocol.RequestOptionChunkStream) && !account.NoTerminationSignal { if err := bodyWriter.WriteMultiBuffer(buf.MultiBuffer{}); err != nil { return err } diff --git a/proxy/vmess/outbound/outbound.go b/proxy/vmess/outbound/outbound.go index a618daea..6facc61a 100644 --- a/proxy/vmess/outbound/outbound.go +++ b/proxy/vmess/outbound/outbound.go @@ -168,7 +168,7 @@ func (h *Handler) Process(ctx context.Context, link *transport.Link, dialer inte return err } - if request.Option.Has(protocol.RequestOptionChunkStream) { + if request.Option.Has(protocol.RequestOptionChunkStream) && !account.NoTerminationSignal { if err := bodyWriter2.WriteMultiBuffer(buf.MultiBuffer{}); err != nil { return err }