diff --git a/proxy/vmess/account.go b/proxy/vmess/account.go index cbd71eeff..5023684dc 100644 --- a/proxy/vmess/account.go +++ b/proxy/vmess/account.go @@ -20,6 +20,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. @@ -47,14 +48,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 da9e5f29f..f9f14e9aa 100644 --- a/proxy/vmess/inbound/inbound.go +++ b/proxy/vmess/inbound/inbound.go @@ -203,7 +203,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 b6433b0cc..726ebd04b 100644 --- a/proxy/vmess/outbound/outbound.go +++ b/proxy/vmess/outbound/outbound.go @@ -155,7 +155,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 := bodyWriter.WriteMultiBuffer(buf.MultiBuffer{}); err != nil { return err }