-
Notifications
You must be signed in to change notification settings - Fork 0
/
addr.go
65 lines (57 loc) · 1.16 KB
/
addr.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package addr
import (
"errors"
"net/netip"
"strings"
)
type ID []byte
type Addr struct {
relay netip.AddrPort
id ID
}
func New(relay netip.AddrPort, id ID) *Addr {
return &Addr{id: id, relay: relay}
}
func (id ID) Encode() []byte {
return append([]byte{byte(len(id))}, id...)
}
var ErrInvalidAddr = errors.New("forwarder: invalid addr")
func Resolve(addr string) (*Addr, error) {
if len(addr) < 2 {
return nil, ErrInvalidAddr
}
last := strings.LastIndex(addr, "-")
if last < 0 || last == len(addr)-1 {
return nil, ErrInvalidAddr
}
addrPort, err := netip.ParseAddrPort(addr[:last])
if err != nil {
return nil, ErrInvalidAddr
}
id, err := ParseID(addr[last+1:])
if err != nil {
return nil, ErrInvalidAddr
}
if !id.Valid() {
return nil, ErrInvalidAddr
}
return &Addr{addrPort, id}, nil
}
func (a *Addr) ID() ID {
return a.id
}
func (a *Addr) Relay() netip.AddrPort {
return a.relay
}
func (a *Addr) String() string {
return a.relay.String() + "-" + a.ID().String()
}
func (a *Addr) Network() string {
if a.relay.Addr().Is4() {
return "forwarder+udp4"
}
if a.relay.Addr().Is4In6() {
return "forwarder+udp"
}
return "forwarder+udp6"
}