|
|
|
@ -6,7 +6,6 @@ import (
|
|
|
|
|
"hash/fnv"
|
|
|
|
|
"io"
|
|
|
|
|
|
|
|
|
|
"github.com/v2ray/v2ray-core/common/alloc"
|
|
|
|
|
"github.com/v2ray/v2ray-core/common/crypto"
|
|
|
|
|
"github.com/v2ray/v2ray-core/common/log"
|
|
|
|
|
"github.com/v2ray/v2ray-core/common/protocol"
|
|
|
|
@ -99,33 +98,32 @@ func (this *ClientSession) DecodeResponseHeader(reader io.Reader) (*protocol.Res
|
|
|
|
|
aesStream := crypto.NewAesDecryptionStream(this.responseBodyKey, this.responseBodyIV)
|
|
|
|
|
this.responseReader = crypto.NewCryptionReader(aesStream, reader)
|
|
|
|
|
|
|
|
|
|
buffer := alloc.NewSmallBuffer()
|
|
|
|
|
defer buffer.Release()
|
|
|
|
|
buffer := make([]byte, 256)
|
|
|
|
|
|
|
|
|
|
_, err := io.ReadFull(this.responseReader, buffer.Value[:4])
|
|
|
|
|
_, err := io.ReadFull(this.responseReader, buffer[:4])
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Info("Raw: Failed to read response header: ", err)
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if buffer.Value[0] != this.responseHeader {
|
|
|
|
|
log.Info("Raw: Unexpected response header. Expecting ", this.responseHeader, " but actually ", buffer.Value[0])
|
|
|
|
|
if buffer[0] != this.responseHeader {
|
|
|
|
|
log.Info("Raw: Unexpected response header. Expecting ", this.responseHeader, " but actually ", buffer[0])
|
|
|
|
|
return nil, transport.ErrCorruptedPacket
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
header := &protocol.ResponseHeader{
|
|
|
|
|
Option: protocol.ResponseOption(buffer.Value[1]),
|
|
|
|
|
Option: protocol.ResponseOption(buffer[1]),
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if buffer.Value[2] != 0 {
|
|
|
|
|
cmdId := buffer.Value[2]
|
|
|
|
|
dataLen := int(buffer.Value[3])
|
|
|
|
|
_, err := io.ReadFull(this.responseReader, buffer.Value[:dataLen])
|
|
|
|
|
if buffer[2] != 0 {
|
|
|
|
|
cmdId := buffer[2]
|
|
|
|
|
dataLen := int(buffer[3])
|
|
|
|
|
_, err := io.ReadFull(this.responseReader, buffer[:dataLen])
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Info("Raw: Failed to read response command: ", err)
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
data := buffer.Value[:dataLen]
|
|
|
|
|
data := buffer[:dataLen]
|
|
|
|
|
command, err := UnmarshalCommand(cmdId, data)
|
|
|
|
|
if err == nil {
|
|
|
|
|
header.Command = command
|
|
|
|
|