|  | @@ -161,48 +161,44 @@ 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, buffer []byte) ([]byte, error) {
 | 
	
		
			
				|  |  | +func (request *VMessRequest) ToBytes(idHash user.CounterHash, randomRangeInt64 user.RandomInt64InRange, buffer *alloc.Buffer) (*alloc.Buffer, error) {
 | 
	
		
			
				|  |  |  	if buffer == nil {
 | 
	
		
			
				|  |  | -		buffer = make([]byte, 0, 300)
 | 
	
		
			
				|  |  | +		buffer = alloc.NewSmallBuffer().Clear()
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	counter := randomRangeInt64(time.Now().UTC().Unix(), 30)
 | 
	
		
			
				|  |  |  	hash := idHash.Hash(request.UserId.Bytes[:], counter)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	buffer = append(buffer, hash...)
 | 
	
		
			
				|  |  | +	buffer.Append(hash)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	encryptionBegin := len(buffer)
 | 
	
		
			
				|  |  | +	encryptionBegin := buffer.Len()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	buffer = append(buffer, request.Version)
 | 
	
		
			
				|  |  | -	buffer = append(buffer, request.RequestIV...)
 | 
	
		
			
				|  |  | -	buffer = append(buffer, request.RequestKey...)
 | 
	
		
			
				|  |  | -	buffer = append(buffer, request.ResponseHeader...)
 | 
	
		
			
				|  |  | -	buffer = append(buffer, request.Command)
 | 
	
		
			
				|  |  | -	buffer = append(buffer, request.Address.PortBytes()...)
 | 
	
		
			
				|  |  | +	buffer.AppendBytes(request.Version)
 | 
	
		
			
				|  |  | +	buffer.Append(request.RequestIV)
 | 
	
		
			
				|  |  | +	buffer.Append(request.RequestKey)
 | 
	
		
			
				|  |  | +	buffer.Append(request.ResponseHeader)
 | 
	
		
			
				|  |  | +	buffer.AppendBytes(request.Command)
 | 
	
		
			
				|  |  | +	buffer.Append(request.Address.PortBytes())
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	switch {
 | 
	
		
			
				|  |  |  	case request.Address.IsIPv4():
 | 
	
		
			
				|  |  | -		buffer = append(buffer, addrTypeIPv4)
 | 
	
		
			
				|  |  | -		buffer = append(buffer, request.Address.IP()...)
 | 
	
		
			
				|  |  | +		buffer.AppendBytes(addrTypeIPv4)
 | 
	
		
			
				|  |  | +		buffer.Append(request.Address.IP())
 | 
	
		
			
				|  |  |  	case request.Address.IsIPv6():
 | 
	
		
			
				|  |  | -		buffer = append(buffer, addrTypeIPv6)
 | 
	
		
			
				|  |  | -		buffer = append(buffer, request.Address.IP()...)
 | 
	
		
			
				|  |  | +		buffer.AppendBytes(addrTypeIPv6)
 | 
	
		
			
				|  |  | +		buffer.Append(request.Address.IP())
 | 
	
		
			
				|  |  |  	case request.Address.IsDomain():
 | 
	
		
			
				|  |  | -		buffer = append(buffer, addrTypeDomain)
 | 
	
		
			
				|  |  | -		buffer = append(buffer, byte(len(request.Address.Domain())))
 | 
	
		
			
				|  |  | -		buffer = append(buffer, []byte(request.Address.Domain())...)
 | 
	
		
			
				|  |  | +		buffer.AppendBytes(addrTypeDomain, byte(len(request.Address.Domain())))
 | 
	
		
			
				|  |  | +		buffer.Append([]byte(request.Address.Domain()))
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	encryptionEnd := len(buffer)
 | 
	
		
			
				|  |  | +	encryptionEnd := buffer.Len()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	fnv1a := fnv.New32a()
 | 
	
		
			
				|  |  | -	fnv1a.Write(buffer[encryptionBegin:encryptionEnd])
 | 
	
		
			
				|  |  | +	fnv1a.Write(buffer.Value[encryptionBegin:encryptionEnd])
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	fnvHash := fnv1a.Sum32()
 | 
	
		
			
				|  |  | -	buffer = append(buffer, byte(fnvHash>>24))
 | 
	
		
			
				|  |  | -	buffer = append(buffer, byte(fnvHash>>16))
 | 
	
		
			
				|  |  | -	buffer = append(buffer, byte(fnvHash>>8))
 | 
	
		
			
				|  |  | -	buffer = append(buffer, byte(fnvHash))
 | 
	
		
			
				|  |  | +	buffer.AppendBytes(byte(fnvHash>>24), byte(fnvHash>>16), byte(fnvHash>>8), byte(fnvHash))
 | 
	
		
			
				|  |  |  	encryptionEnd += 4
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	aesCipher, err := aes.NewCipher(request.UserId.CmdKey())
 | 
	
	
		
			
				|  | @@ -210,7 +206,7 @@ func (request *VMessRequest) ToBytes(idHash user.CounterHash, randomRangeInt64 u
 | 
	
		
			
				|  |  |  		return nil, err
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  	aesStream := cipher.NewCFBEncrypter(aesCipher, user.Int64Hash(counter))
 | 
	
		
			
				|  |  | -	aesStream.XORKeyStream(buffer[encryptionBegin:encryptionEnd], buffer[encryptionBegin:encryptionEnd])
 | 
	
		
			
				|  |  | +	aesStream.XORKeyStream(buffer.Value[encryptionBegin:encryptionEnd], buffer.Value[encryptionBegin:encryptionEnd])
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	return buffer, nil
 | 
	
		
			
				|  |  |  }
 |