Browse Source

Added experiment to avoid sending the termination signal

Shelikhoo 4 years ago
parent
commit
c5357e1f00
3 changed files with 10 additions and 3 deletions
  1. 6 1
      proxy/vmess/account.go
  2. 3 1
      proxy/vmess/inbound/inbound.go
  3. 1 1
      proxy/vmess/outbound/outbound.go

+ 6 - 1
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
 }

+ 3 - 1
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
 		}

+ 1 - 1
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
 			}