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