Skip to content

Commit 318b352

Browse files
committed
chore: better handwritten addons parsing
1 parent 1d09ed8 commit 318b352

1 file changed

Lines changed: 39 additions & 18 deletions

File tree

transport/vless/addons.go

Lines changed: 39 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,35 +11,48 @@ func ReadAddons(data []byte) (*Addons, error) {
1111
reader := bytes.NewReader(data)
1212
var addons Addons
1313
for reader.Len() > 0 {
14-
protoHeader, err := reader.ReadByte()
14+
tag, err := binary.ReadUvarint(reader)
1515
if err != nil {
1616
return nil, err
1717
}
18-
switch protoHeader {
19-
case (1 << 3) | 2:
20-
flowLen, err := binary.ReadUvarint(reader)
18+
number, typ := int32(tag>>3), int8(tag&7)
19+
switch typ {
20+
case 0: // VARINT
21+
_, err = binary.ReadUvarint(reader)
2122
if err != nil {
2223
return nil, err
2324
}
24-
flowBytes := make([]byte, flowLen)
25-
_, err = io.ReadFull(reader, flowBytes)
25+
case 5: // I32
26+
var i32 [4]byte
27+
_, err = io.ReadFull(reader, i32[:])
2628
if err != nil {
2729
return nil, err
2830
}
29-
addons.Flow = string(flowBytes)
30-
case (2 << 3) | 2:
31-
seedLen, err := binary.ReadUvarint(reader)
31+
case 1: // I64
32+
var i64 [8]byte
33+
_, err = io.ReadFull(reader, i64[:])
3234
if err != nil {
3335
return nil, err
3436
}
35-
seedBytes := make([]byte, seedLen)
36-
_, err = io.ReadFull(reader, seedBytes)
37+
case 2: // LEN
38+
var bytesLen uint64
39+
bytesLen, err = binary.ReadUvarint(reader)
3740
if err != nil {
3841
return nil, err
3942
}
40-
addons.Seed = seedBytes
41-
default:
42-
return nil, fmt.Errorf("unknown protobuf message header: %v", protoHeader)
43+
bytesData := make([]byte, bytesLen)
44+
_, err = io.ReadFull(reader, bytesData)
45+
if err != nil {
46+
return nil, err
47+
}
48+
switch number {
49+
case 1:
50+
addons.Flow = string(bytesData)
51+
case 2:
52+
addons.Seed = bytesData
53+
}
54+
default: // group (3,4) has been deprecated we unneeded support
55+
return nil, fmt.Errorf("unknown protobuf message tag: %v", tag)
4356
}
4457
}
4558
return &addons, nil
@@ -48,14 +61,22 @@ func ReadAddons(data []byte) (*Addons, error) {
4861
func WriteAddons(addons *Addons) []byte {
4962
var writer bytes.Buffer
5063
if len(addons.Flow) > 0 {
51-
writer.WriteByte((1 << 3) | 2)
52-
writer.Write(binary.AppendUvarint(nil, uint64(len(addons.Flow))))
64+
WriteUvarint(&writer, (1<<3)|2) // (field << 3) bit-or wire_type encoded as uint32 varint
65+
WriteUvarint(&writer, uint64(len(addons.Flow)))
5366
writer.WriteString(addons.Flow)
5467
}
5568
if len(addons.Seed) > 0 {
56-
writer.WriteByte((2 << 3) | 2)
57-
writer.Write(binary.AppendUvarint(nil, uint64(len(addons.Seed))))
69+
WriteUvarint(&writer, (2<<3)|2) // (field << 3) bit-or wire_type encoded as uint32 varint
70+
WriteUvarint(&writer, uint64(len(addons.Seed)))
5871
writer.Write(addons.Seed)
5972
}
6073
return writer.Bytes()
6174
}
75+
76+
func WriteUvarint(writer *bytes.Buffer, x uint64) {
77+
for x >= 0x80 {
78+
writer.WriteByte(byte(x) | 0x80)
79+
x >>= 7
80+
}
81+
writer.WriteByte(byte(x))
82+
}

0 commit comments

Comments
 (0)