Skip to content

Commit a755de3

Browse files
committed
Improve serializer
1 parent c6a69b4 commit a755de3

2 files changed

Lines changed: 37 additions & 25 deletions

File tree

common/metadata/family.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ package metadata
33
type Family = byte
44

55
const (
6-
AddressFamilyIPv4 Family = 0x01
7-
AddressFamilyIPv6 Family = 0x04
8-
AddressFamilyFqdn Family = 0x03
6+
AddressFamilyIPv4 Family = 0x01
7+
AddressFamilyIPv6 Family = 0x04
8+
AddressFamilyFqdn Family = 0x03
9+
AddressFamilyEmpty Family = 0xff
910
)

common/metadata/serializer.go

Lines changed: 33 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,20 @@ func NewSerializer(options ...SerializerOption) *Serializer {
5050

5151
func (s *Serializer) WriteAddress(buffer *buf.Buffer, addr Socksaddr) error {
5252
var af Family
53-
if addr.IsIPv4() {
53+
if !addr.IsValid() {
54+
af = AddressFamilyFqdn
55+
} else if addr.IsIPv4() {
5456
af = AddressFamilyIPv4
5557
} else if addr.IsIPv6() {
5658
af = AddressFamilyIPv6
5759
} else {
5860
af = AddressFamilyFqdn
5961
}
60-
err := buffer.WriteByte(s.familyByteMap[af])
62+
afByte, loaded := s.familyByteMap[af]
63+
if !loaded {
64+
return E.New("unsupported address")
65+
}
66+
err := buffer.WriteByte(afByte)
6167
if err != nil {
6268
return err
6369
}
@@ -70,7 +76,14 @@ func (s *Serializer) WriteAddress(buffer *buf.Buffer, addr Socksaddr) error {
7076
}
7177

7278
func (s *Serializer) AddressLen(addr Socksaddr) int {
73-
if addr.IsIPv4() {
79+
if !addr.IsValid() {
80+
_, supportEmpty := s.familyByteMap[AddressFamilyEmpty]
81+
if supportEmpty {
82+
return 1
83+
} else {
84+
return 2
85+
}
86+
} else if addr.IsIPv4() {
7487
return 5
7588
} else if addr.IsIPv6() {
7689
return 17
@@ -129,26 +142,24 @@ func (s *Serializer) ReadAddress(reader io.Reader) (Socksaddr, error) {
129142
return Socksaddr{}, E.Cause(err, "read fqdn")
130143
}
131144
return ParseSocksaddrHostPort(fqdn, 0), nil
132-
default:
133-
switch family {
134-
case AddressFamilyIPv4:
135-
var addr [4]byte
136-
err = common.Error(reader.Read(addr[:]))
137-
if err != nil {
138-
return Socksaddr{}, E.Cause(err, "read ipv4 address")
139-
}
140-
return Socksaddr{Addr: netip.AddrFrom4(addr)}, nil
141-
case AddressFamilyIPv6:
142-
var addr [16]byte
143-
err = common.Error(reader.Read(addr[:]))
144-
if err != nil {
145-
return Socksaddr{}, E.Cause(err, "read ipv6 address")
146-
}
147-
148-
return Socksaddr{Addr: netip.AddrFrom16(addr)}.Unwrap(), nil
149-
default:
150-
return Socksaddr{}, E.New("unknown address family: ", af)
145+
case AddressFamilyIPv4:
146+
var addr [4]byte
147+
_, err = io.ReadFull(reader, addr[:])
148+
if err != nil {
149+
return Socksaddr{}, E.Cause(err, "read ipv4 address")
150+
}
151+
return Socksaddr{Addr: netip.AddrFrom4(addr)}, nil
152+
case AddressFamilyIPv6:
153+
var addr [16]byte
154+
_, err = io.ReadFull(reader, addr[:])
155+
if err != nil {
156+
return Socksaddr{}, E.Cause(err, "read ipv6 address")
151157
}
158+
return Socksaddr{Addr: netip.AddrFrom16(addr)}.Unwrap(), nil
159+
case AddressFamilyEmpty:
160+
return Socksaddr{}, nil
161+
default:
162+
return Socksaddr{}, E.New("unknown address family: ", af)
152163
}
153164
}
154165

0 commit comments

Comments
 (0)