diff --git a/proxy/vmess/protocol/vmess.go b/proxy/vmess/protocol/vmess.go index 2c841f2ed..9aebfcd21 100644 --- a/proxy/vmess/protocol/vmess.go +++ b/proxy/vmess/protocol/vmess.go @@ -194,8 +194,10 @@ func (r *VMessRequestReader) Read(reader io.Reader) (*VMessRequest, error) { } // ToBytes returns a VMessRequest in the form of byte array. -func (request *VMessRequest) ToBytes(idHash user.CounterHash, randomRangeInt64 user.RandomInt64InRange) ([]byte, error) { - buffer := make([]byte, 0, 300) +func (request *VMessRequest) ToBytes(idHash user.CounterHash, randomRangeInt64 user.RandomInt64InRange, buffer []byte) ([]byte, error) { + if buffer == nil { + buffer = make([]byte, 0, 300) + } counter := randomRangeInt64(time.Now().UTC().Unix(), 30) hash := idHash.Hash(request.UserId.Bytes, counter) diff --git a/proxy/vmess/protocol/vmess_test.go b/proxy/vmess/protocol/vmess_test.go index 7318f1cb0..b89604c51 100644 --- a/proxy/vmess/protocol/vmess_test.go +++ b/proxy/vmess/protocol/vmess_test.go @@ -45,7 +45,7 @@ func TestVMessSerialization(t *testing.T) { request.Address = v2net.DomainAddress("v2ray.com", 80) mockTime := int64(1823730) - buffer, err := request.ToBytes(user.NewTimeHash(user.HMACHash{}), func(base int64, delta int) int64 { return mockTime }) + buffer, err := request.ToBytes(user.NewTimeHash(user.HMACHash{}), func(base int64, delta int) int64 { return mockTime }, nil) if err != nil { t.Fatal(err) } @@ -85,6 +85,6 @@ func BenchmarkVMessRequestWriting(b *testing.B) { request.Address = v2net.DomainAddress("v2ray.com", 80) for i := 0; i < b.N; i++ { - request.ToBytes(user.NewTimeHash(user.HMACHash{}), user.GenerateRandomInt64InRange) + request.ToBytes(user.NewTimeHash(user.HMACHash{}), user.GenerateRandomInt64InRange, nil) } } diff --git a/proxy/vmess/vmessin.go b/proxy/vmess/vmessin.go index 3e520c9f0..e0c86ff34 100644 --- a/proxy/vmess/vmessin.go +++ b/proxy/vmess/vmessin.go @@ -93,7 +93,7 @@ func (handler *VMessInboundHandler) HandleConnection(connection net.Conn) error } // Optimize for small response packet - buffer := make([]byte, 0, 1024) + buffer := make([]byte, 0, 2*1024) buffer = append(buffer, response[:]...) if data, open := <-output; open { diff --git a/proxy/vmess/vmessout.go b/proxy/vmess/vmessout.go index 62a647e1d..ee9aac65b 100644 --- a/proxy/vmess/vmessout.go +++ b/proxy/vmess/vmessout.go @@ -130,7 +130,8 @@ func handleRequest(conn *net.TCPConn, request *protocol.VMessRequest, input <-ch return } - buffer, err := request.ToBytes(user.NewTimeHash(user.HMACHash{}), user.GenerateRandomInt64InRange) + buffer := make([]byte, 0, 2*1024) + buffer, err = request.ToBytes(user.NewTimeHash(user.HMACHash{}), user.GenerateRandomInt64InRange, buffer) if err != nil { log.Error("VMessOut: Failed to serialize VMess request: %v", err) return