|
|
@@ -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]}
|
|
|
}
|