| 
					
				 | 
			
			
				@@ -36,10 +36,9 @@ var ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	ErrorInvalidVerion = errors.New("Invalid Version") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// VMessRequest implements the request message of VMess protocol. It only contains 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// the header of a request message. The data part will be handled by conection 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// handler directly, in favor of data streaming. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// VMessRequest implements the request message of VMess protocol. It only contains the header of a 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// request message. The data part will be handled by conection handler directly, in favor of data 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// streaming. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 type VMessRequest struct { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	Version        byte 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	UserId         user.ID 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -50,6 +49,7 @@ type VMessRequest struct { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	Address        v2net.Address 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// Destination is the final destination of this request. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func (request *VMessRequest) Destination() v2net.Destination { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if request.Command == CmdTCP { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return v2net.NewTCPDestination(request.Address) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -58,16 +58,19 @@ func (request *VMessRequest) Destination() v2net.Destination { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// VMessRequestReader is a parser to read VMessRequest from a byte stream. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 type VMessRequestReader struct { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	vUserSet user.UserSet 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// NewVMessRequestReader creates a new VMessRequestReader with a given UserSet 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func NewVMessRequestReader(vUserSet user.UserSet) *VMessRequestReader { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return &VMessRequestReader{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		vUserSet: vUserSet, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// Read reads a VMessRequest from a byte stream. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func (r *VMessRequestReader) Read(reader io.Reader) (*VMessRequest, error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	buffer := make([]byte, 256) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -190,6 +193,7 @@ func (r *VMessRequestReader) Read(reader io.Reader) (*VMessRequest, error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return request, nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 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) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -250,10 +254,14 @@ func (request *VMessRequest) ToBytes(idHash user.CounterHash, randomRangeInt64 u 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return buffer, nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// VMessResponse is the header of a TCP response in VMess format. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 type VMessResponse [4]byte 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// NewVMessResponse creates a VMessResponse from a given VMessRequest. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func NewVMessResponse(request *VMessRequest) *VMessResponse { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	response := new(VMessResponse) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	copy(response[:], request.ResponseHeader[:]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	return response 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  return &VMessResponse{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    request.ResponseHeader[0], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    request.ResponseHeader[1], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    request.ResponseHeader[2], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    request.ResponseHeader[3]} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |