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