mirror of
https://github.com/v2fly/v2ray-core.git
synced 2025-12-29 05:25:21 -05:00
refactor buffer
This commit is contained in:
@@ -4,6 +4,7 @@ import (
|
||||
"bytes"
|
||||
"crypto/rand"
|
||||
"io"
|
||||
|
||||
"v2ray.com/core/common/buf"
|
||||
"v2ray.com/core/common/crypto"
|
||||
"v2ray.com/core/common/errors"
|
||||
@@ -29,11 +30,11 @@ func ReadTCPSession(user *protocol.User, reader io.Reader) (*protocol.RequestHea
|
||||
}
|
||||
account := rawAccount.(*ShadowsocksAccount)
|
||||
|
||||
buffer := buf.NewLocalBuffer(512)
|
||||
buffer := buf.NewLocal(512)
|
||||
defer buffer.Release()
|
||||
|
||||
ivLen := account.Cipher.IVSize()
|
||||
_, err = buffer.FillFullFrom(reader, ivLen)
|
||||
err = buffer.AppendSupplier(buf.ReadFullFrom(reader, ivLen))
|
||||
if err != nil {
|
||||
return nil, nil, errors.Base(err).Message("Shadowsocks|TCP: Failed to read IV.")
|
||||
}
|
||||
@@ -54,7 +55,7 @@ func ReadTCPSession(user *protocol.User, reader io.Reader) (*protocol.RequestHea
|
||||
}
|
||||
|
||||
buffer.Clear()
|
||||
_, err = buffer.FillFullFrom(reader, 1)
|
||||
err = buffer.AppendSupplier(buf.ReadFullFrom(reader, 1))
|
||||
if err != nil {
|
||||
return nil, nil, errors.Base(err).Message("Shadowsocks|TCP: Failed to read address type.")
|
||||
}
|
||||
@@ -74,24 +75,24 @@ func ReadTCPSession(user *protocol.User, reader io.Reader) (*protocol.RequestHea
|
||||
|
||||
switch addrType {
|
||||
case AddrTypeIPv4:
|
||||
_, err := buffer.FillFullFrom(reader, 4)
|
||||
err := buffer.AppendSupplier(buf.ReadFullFrom(reader, 4))
|
||||
if err != nil {
|
||||
return nil, nil, errors.Base(err).Message("Shadowsocks|TCP: Failed to read IPv4 address.")
|
||||
}
|
||||
request.Address = v2net.IPAddress(buffer.BytesFrom(-4))
|
||||
case AddrTypeIPv6:
|
||||
_, err := buffer.FillFullFrom(reader, 16)
|
||||
err := buffer.AppendSupplier(buf.ReadFullFrom(reader, 16))
|
||||
if err != nil {
|
||||
return nil, nil, errors.Base(err).Message("Shadowsocks|TCP: Failed to read IPv6 address.")
|
||||
}
|
||||
request.Address = v2net.IPAddress(buffer.BytesFrom(-16))
|
||||
case AddrTypeDomain:
|
||||
_, err := buffer.FillFullFrom(reader, 1)
|
||||
err := buffer.AppendSupplier(buf.ReadFullFrom(reader, 1))
|
||||
if err != nil {
|
||||
return nil, nil, errors.Base(err).Message("Shadowsocks|TCP: Failed to read domain lenth.")
|
||||
}
|
||||
domainLength := int(buffer.BytesFrom(-1)[0])
|
||||
_, err = buffer.FillFullFrom(reader, domainLength)
|
||||
err = buffer.AppendSupplier(buf.ReadFullFrom(reader, domainLength))
|
||||
if err != nil {
|
||||
return nil, nil, errors.Base(err).Message("Shadowsocks|TCP: Failed to read domain.")
|
||||
}
|
||||
@@ -100,7 +101,7 @@ func ReadTCPSession(user *protocol.User, reader io.Reader) (*protocol.RequestHea
|
||||
return nil, nil, errors.New("Shadowsocks|TCP: Unknown address type: ", addrType)
|
||||
}
|
||||
|
||||
_, err = buffer.FillFullFrom(reader, 2)
|
||||
err = buffer.AppendSupplier(buf.ReadFullFrom(reader, 2))
|
||||
if err != nil {
|
||||
return nil, nil, errors.Base(err).Message("Shadowsocks|TCP: Failed to read port.")
|
||||
}
|
||||
@@ -110,7 +111,7 @@ func ReadTCPSession(user *protocol.User, reader io.Reader) (*protocol.RequestHea
|
||||
actualAuth := make([]byte, AuthSize)
|
||||
authenticator.Authenticate(buffer.Bytes())(actualAuth)
|
||||
|
||||
_, err := buffer.FillFullFrom(reader, AuthSize)
|
||||
err := buffer.AppendSupplier(buf.ReadFullFrom(reader, AuthSize))
|
||||
if err != nil {
|
||||
return nil, nil, errors.Base(err).Message("Shadowsocks|TCP: Failed to read OTA.")
|
||||
}
|
||||
@@ -152,7 +153,7 @@ func WriteTCPRequest(request *protocol.RequestHeader, writer io.Writer) (v2io.Wr
|
||||
|
||||
writer = crypto.NewCryptionWriter(stream, writer)
|
||||
|
||||
header := buf.NewLocalBuffer(512)
|
||||
header := buf.NewLocal(512)
|
||||
|
||||
switch request.Address.Family() {
|
||||
case v2net.AddressFamilyIPv4:
|
||||
@@ -168,13 +169,13 @@ func WriteTCPRequest(request *protocol.RequestHeader, writer io.Writer) (v2io.Wr
|
||||
return nil, errors.New("Shadowsocks|TCP: Unsupported address type: ", request.Address.Family())
|
||||
}
|
||||
|
||||
header.AppendFunc(serial.WriteUint16(uint16(request.Port)))
|
||||
header.AppendSupplier(serial.WriteUint16(uint16(request.Port)))
|
||||
|
||||
if request.Option.Has(RequestOptionOneTimeAuth) {
|
||||
header.SetByte(0, header.Byte(0)|0x10)
|
||||
|
||||
authenticator := NewAuthenticator(HeaderKeyGenerator(account.Key, iv))
|
||||
header.AppendFunc(authenticator.Authenticate(header.Bytes()))
|
||||
header.AppendSupplier(authenticator.Authenticate(header.Bytes()))
|
||||
}
|
||||
|
||||
_, err = writer.Write(header.Bytes())
|
||||
@@ -243,9 +244,9 @@ func EncodeUDPPacket(request *protocol.RequestHeader, payload *buf.Buffer) (*buf
|
||||
}
|
||||
account := rawAccount.(*ShadowsocksAccount)
|
||||
|
||||
buffer := buf.NewSmallBuffer()
|
||||
buffer := buf.NewSmall()
|
||||
ivLen := account.Cipher.IVSize()
|
||||
buffer.FillFullFrom(rand.Reader, ivLen)
|
||||
buffer.AppendSupplier(buf.ReadFullFrom(rand.Reader, ivLen))
|
||||
iv := buffer.Bytes()
|
||||
|
||||
switch request.Address.Family() {
|
||||
@@ -262,14 +263,14 @@ func EncodeUDPPacket(request *protocol.RequestHeader, payload *buf.Buffer) (*buf
|
||||
return nil, errors.New("Shadowsocks|UDP: Unsupported address type: ", request.Address.Family())
|
||||
}
|
||||
|
||||
buffer.AppendFunc(serial.WriteUint16(uint16(request.Port)))
|
||||
buffer.AppendSupplier(serial.WriteUint16(uint16(request.Port)))
|
||||
buffer.Append(payload.Bytes())
|
||||
|
||||
if request.Option.Has(RequestOptionOneTimeAuth) {
|
||||
authenticator := NewAuthenticator(HeaderKeyGenerator(account.Key, iv))
|
||||
buffer.SetByte(ivLen, buffer.Byte(ivLen)|0x10)
|
||||
|
||||
buffer.AppendFunc(authenticator.Authenticate(buffer.BytesFrom(ivLen)))
|
||||
buffer.AppendSupplier(authenticator.Authenticate(buffer.BytesFrom(ivLen)))
|
||||
}
|
||||
|
||||
stream, err := account.Cipher.NewEncodingStream(account.Key, iv)
|
||||
@@ -360,8 +361,8 @@ type UDPReader struct {
|
||||
}
|
||||
|
||||
func (v *UDPReader) Read() (*buf.Buffer, error) {
|
||||
buffer := buf.NewSmallBuffer()
|
||||
_, err := buffer.FillFrom(v.Reader)
|
||||
buffer := buf.NewSmall()
|
||||
err := buffer.AppendSupplier(buf.ReadFrom(v.Reader))
|
||||
if err != nil {
|
||||
buffer.Release()
|
||||
return nil, err
|
||||
|
||||
Reference in New Issue
Block a user