Skip to content

Commit ceed2dc

Browse files
authored
Merge pull request #44 from multiformats/fix/parse-ip-addr
fix converting net.IPAddr to a multiaddr
2 parents cba4f9f + bd10f58 commit ceed2dc

File tree

2 files changed

+30
-42
lines changed

2 files changed

+30
-42
lines changed

convert_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,13 +60,13 @@ func testToNetAddr(t *testing.T, maddr, ntwk, addr string) {
6060

6161
func TestFromIP4(t *testing.T) {
6262
testConvert(t, "/ip4/10.20.30.40", func() (ma.Multiaddr, error) {
63-
return FromIP(net.ParseIP("10.20.30.40"))
63+
return FromNetAddr(&net.IPAddr{IP: net.ParseIP("10.20.30.40")})
6464
})
6565
}
6666

6767
func TestFromIP6(t *testing.T) {
6868
testConvert(t, "/ip6/2001:4860:0:2001::68", func() (ma.Multiaddr, error) {
69-
return FromIP(net.ParseIP("2001:4860:0:2001::68"))
69+
return FromNetAddr(&net.IPAddr{IP: net.ParseIP("2001:4860:0:2001::68")})
7070
})
7171
}
7272

registry.go

Lines changed: 28 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,15 @@ type FromNetAddrFunc func(a net.Addr) (ma.Multiaddr, error)
1414
// ToNetAddrFunc is a generic function which converts a Multiaddress to net.Addr
1515
type ToNetAddrFunc func(ma ma.Multiaddr) (net.Addr, error)
1616

17-
var defaultCodecs *CodecMap
17+
var defaultCodecs = NewCodecMap()
1818

1919
func init() {
20-
defaultCodecs = NewCodecMap()
21-
defaultCodecs.RegisterNetCodec(tcpAddrSpec)
22-
defaultCodecs.RegisterNetCodec(udpAddrSpec)
23-
defaultCodecs.RegisterNetCodec(ip4AddrSpec)
24-
defaultCodecs.RegisterNetCodec(ip6AddrSpec)
25-
defaultCodecs.RegisterNetCodec(ipnetAddrSpec)
20+
defaultCodecs.RegisterFromNetAddr(parseTCPNetAddr, "tcp", "tcp4", "tcp6")
21+
defaultCodecs.RegisterFromNetAddr(parseUDPNetAddr, "udp", "udp4", "udp6")
22+
defaultCodecs.RegisterFromNetAddr(parseIPNetAddr, "ip", "ip4", "ip6")
23+
defaultCodecs.RegisterFromNetAddr(parseIPPlusNetAddr, "ip+net")
24+
25+
defaultCodecs.RegisterToNetAddr(parseBasicNetMaddr, "tcp", "udp", "ip6", "ip4")
2626
}
2727

2828
// CodecMap holds a map of NetCodecs indexed by their Protocol ID
@@ -39,7 +39,6 @@ type CodecMap struct {
3939
// NewCodecMap initializes and returns a CodecMap object.
4040
func NewCodecMap() *CodecMap {
4141
return &CodecMap{
42-
codecs: make(map[string]*NetCodec),
4342
addrParsers: make(map[string]FromNetAddrFunc),
4443
maddrParsers: make(map[string]ToNetAddrFunc),
4544
}
@@ -48,6 +47,13 @@ func NewCodecMap() *CodecMap {
4847
// NetCodec is used to identify a network codec, that is, a network type for
4948
// which we are able to translate multiaddresses into standard Go net.Addr
5049
// and back.
50+
//
51+
// Deprecated: Unfortunately, these mappings aren't one to one. This abstraction
52+
// assumes that multiple "networks" can map to a single multiaddr protocol but
53+
// not the reverse. For example, this abstraction supports `tcp6, tcp4, tcp ->
54+
// /tcp/` really well but doesn't support `ip -> {/ip4/, /ip6/}`.
55+
//
56+
// Please use `RegisterFromNetAddr` and `RegisterToNetAddr` directly.
5157
type NetCodec struct {
5258
// NetAddrNetworks is an array of strings that may be returned
5359
// by net.Addr.Network() calls on addresses belonging to this type
@@ -76,49 +82,31 @@ func RegisterNetCodec(a *NetCodec) {
7682
func (cm *CodecMap) RegisterNetCodec(a *NetCodec) {
7783
cm.lk.Lock()
7884
defer cm.lk.Unlock()
79-
cm.codecs[a.ProtocolName] = a
8085
for _, n := range a.NetAddrNetworks {
8186
cm.addrParsers[n] = a.ParseNetAddr
8287
}
8388

8489
cm.maddrParsers[a.ProtocolName] = a.ConvertMultiaddr
8590
}
8691

87-
var tcpAddrSpec = &NetCodec{
88-
ProtocolName: "tcp",
89-
NetAddrNetworks: []string{"tcp", "tcp4", "tcp6"},
90-
ParseNetAddr: parseTCPNetAddr,
91-
ConvertMultiaddr: parseBasicNetMaddr,
92-
}
93-
94-
var udpAddrSpec = &NetCodec{
95-
ProtocolName: "udp",
96-
NetAddrNetworks: []string{"udp", "udp4", "udp6"},
97-
ParseNetAddr: parseUDPNetAddr,
98-
ConvertMultiaddr: parseBasicNetMaddr,
99-
}
92+
// RegisterFromNetAddr registers a conversion from net.Addr instances to multiaddrs
93+
func (cm *CodecMap) RegisterFromNetAddr(from FromNetAddrFunc, networks ...string) {
94+
cm.lk.Lock()
95+
defer cm.lk.Unlock()
10096

101-
var ip4AddrSpec = &NetCodec{
102-
ProtocolName: "ip4",
103-
NetAddrNetworks: []string{"ip4"},
104-
ParseNetAddr: parseIPNetAddr,
105-
ConvertMultiaddr: parseBasicNetMaddr,
97+
for _, n := range networks {
98+
cm.addrParsers[n] = from
99+
}
106100
}
107101

108-
var ip6AddrSpec = &NetCodec{
109-
ProtocolName: "ip6",
110-
NetAddrNetworks: []string{"ip6"},
111-
ParseNetAddr: parseIPNetAddr,
112-
ConvertMultiaddr: parseBasicNetMaddr,
113-
}
102+
// RegisterToNetAddr registers a conversion from multiaddrs to net.Addr instances
103+
func (cm *CodecMap) RegisterToNetAddr(to ToNetAddrFunc, protocols ...string) {
104+
cm.lk.Lock()
105+
defer cm.lk.Unlock()
114106

115-
var ipnetAddrSpec = &NetCodec{
116-
ProtocolName: "ip+net",
117-
NetAddrNetworks: []string{"ip+net"},
118-
ParseNetAddr: parseIPPlusNetAddr,
119-
ConvertMultiaddr: func(ma.Multiaddr) (net.Addr, error) {
120-
return nil, fmt.Errorf("converting ip+net multiaddr not supported")
121-
},
107+
for _, p := range protocols {
108+
cm.maddrParsers[p] = to
109+
}
122110
}
123111

124112
func (cm *CodecMap) getAddrParser(net string) (FromNetAddrFunc, error) {

0 commit comments

Comments
 (0)