Browse Source

Fix ending in vmess reader.

v2ray 9 năm trước cách đây
mục cha
commit
0bc846f016

+ 3 - 0
proxy/dokodemo/dokodemo.go

@@ -129,6 +129,8 @@ func (this *DokodemoDoor) HandleTCPConnection(conn *hub.Connection) {
 	outputFinish.Lock()
 
 	reader := v2net.NewTimeOutReader(this.config.Timeout, conn)
+	defer reader.Release()
+
 	go func() {
 		v2reader := v2io.NewAdaptiveReader(reader)
 		defer v2reader.Release()
@@ -147,4 +149,5 @@ func (this *DokodemoDoor) HandleTCPConnection(conn *hub.Connection) {
 	}()
 
 	outputFinish.Lock()
+	inputFinish.Lock()
 }

+ 6 - 6
proxy/vmess/io/reader.go

@@ -62,12 +62,6 @@ func (this *AuthChunkReader) Read() (*alloc.Buffer, error) {
 		buffer = AllocBuffer(this.chunkLength).Clear()
 	}
 
-	_, err := buffer.FillFrom(this.reader)
-	if err != nil {
-		buffer.Release()
-		return nil, err
-	}
-
 	if this.chunkLength == -1 {
 		for buffer.Len() < 6 {
 			_, err := buffer.FillFrom(this.reader)
@@ -80,6 +74,12 @@ func (this *AuthChunkReader) Read() (*alloc.Buffer, error) {
 		this.chunkLength = int(length) - 4
 		this.validator = NewValidator(serial.BytesLiteral(buffer.Value[2:6]).Uint32Value())
 		buffer.SliceFrom(6)
+	} else if buffer.Len() < this.chunkLength {
+		_, err := buffer.FillFrom(this.reader)
+		if err != nil {
+			buffer.Release()
+			return nil, err
+		}
 	}
 
 	if this.chunkLength == 0 {

+ 5 - 3
testing/scenarios/dynamic_vmess_test.go

@@ -1,6 +1,8 @@
 package scenarios
 
 import (
+	"bytes"
+	"io"
 	"net"
 	"testing"
 
@@ -42,10 +44,10 @@ func TestDynamicVMess(t *testing.T) {
 
 		conn.CloseWrite()
 
-		response := make([]byte, 1024)
-		nBytes, err = conn.Read(response)
+		response := bytes.NewBuffer(nil)
+		_, err = io.Copy(response, conn)
 		assert.Error(err).IsNil()
-		assert.StringLiteral("Processed: " + payload).Equals(string(response[:nBytes]))
+		assert.StringLiteral("Processed: " + payload).Equals(string(response.Bytes()))
 
 		conn.Close()
 	}