updated multiaddr
Juan Batiz-Benet committed
Oct 10, 2014 at 20:41 UTC
726f53ff41865b7791d9f9be21d5044541baf097
5 files changed
+123
-7
Godeps/Godeps.json
+2
-2
@@ -84,8 +84,8 @@
84
},
85
{
86
"ImportPath": "github.com/jbenet/go-multiaddr",
87
- "Comment": "0.1.2-9-g1ec9436",
88
- "Rev": "1ec9436b1d642f4f04c0d9e21a0719cda3d659ee"
87
+ "Comment": "0.1.2-11-g2a572df",
88
+ "Rev": "2a572df05cbbb3a0b0b3d0095a9af16757cbbf9f"
89
},
90
{
91
"ImportPath": "github.com/jbenet/go-multihash",
Godeps/_workspace/src/github.com/jbenet/go-multiaddr/codec.go
+4
@@ -9,6 +9,10 @@ import (
9
)
10
11
func stringToBytes(s string) ([]byte, error) {
12
+
13
+ // consume trailing slashes
14
+ s = strings.TrimRight(s, "/")
15
+
16
b := []byte{}
17
sp := strings.Split(s, "/")
18
Godeps/_workspace/src/github.com/jbenet/go-multiaddr/multiaddr_test.go
+9
@@ -18,6 +18,7 @@ func TestEqual(t *testing.T) {
18
m1 := newMultiaddr(t, "/ip4/127.0.0.1/udp/1234")
19
m2 := newMultiaddr(t, "/ip4/127.0.0.1/tcp/1234")
20
m3 := newMultiaddr(t, "/ip4/127.0.0.1/tcp/1234")
21
+ m4 := newMultiaddr(t, "/ip4/127.0.0.1/tcp/1234/")
22
23
if m1.Equal(m2) {
24
t.Error("should not be equal")
@@ -38,6 +39,14 @@ func TestEqual(t *testing.T) {
39
if !m1.Equal(m1) {
40
t.Error("should be equal")
41
}
42
+
43
+ if !m2.Equal(m4) {
44
+ t.Error("should be equal")
45
+ }
46
+
47
+ if !m4.Equal(m3) {
48
+ t.Error("should be equal")
49
+ }
50
}
51
52
func TestStringToBytes(t *testing.T) {
Godeps/_workspace/src/github.com/jbenet/go-multiaddr/net.go
+42
-5
@@ -65,6 +65,27 @@ func FromNetAddr(a net.Addr) (Multiaddr, error) {
65
}
66
}
67
68
+// ToNetAddr converts a Multiaddr to a net.Addr
69
+// Must be ThinWaist. acceptable protocol stacks are:
70
+// /ip{4,6}/{tcp, udp}
71
+func ToNetAddr(ma Multiaddr) (net.Addr, error) {
72
+ network, host, err := DialArgs(ma)
73
+ if err != nil {
74
+ return nil, err
75
+ }
76
+
77
+ switch network {
78
+ case "tcp":
79
+ return net.ResolveTCPAddr(network, host)
80
+ case "udp":
81
+ return net.ResolveUDPAddr(network, host)
82
+ case "ip":
83
+ return net.ResolveIPAddr(network, host)
84
+ }
85
+
86
+ return nil, fmt.Errorf("network not supported: %s", network)
87
+}
88
+
89
// FromIP converts a net.IP type to a Multiaddr.
90
func FromIP(ip net.IP) (Multiaddr, error) {
91
switch {
@@ -85,8 +106,12 @@ func DialArgs(m Multiaddr) (string, string, error) {
106
107
str := m.String()
108
parts := strings.Split(str, "/")[1:]
88
- network := parts[2]
109
110
+ if len(parts) == 2 { // only IP
111
+ return parts[0], parts[1], nil
112
+ }
113
+
114
+ network := parts[2]
115
var host string
116
switch parts[0] {
117
case "ip4":
@@ -98,16 +123,28 @@ func DialArgs(m Multiaddr) (string, string, error) {
123
}
124
125
// IsThinWaist returns whether a Multiaddr starts with "Thin Waist" Protocols.
101
-// This means: /{IP4, IP6}/{TCP, UDP}
126
+// This means: /{IP4, IP6}[/{TCP, UDP}]
127
func IsThinWaist(m Multiaddr) bool {
128
p := m.Protocols()
104
- if p[0].Code != P_IP4 && p[0].Code != P_IP6 {
129
+
130
+ // nothing? not even a waist.
131
+ if len(p) == 0 {
132
return false
133
}
134
108
- if p[1].Code != P_TCP && p[1].Code != P_UDP {
135
+ if p[0].Code != P_IP4 && p[0].Code != P_IP6 {
136
return false
137
}
138
112
- return true
139
+ // only IP? still counts.
140
+ if len(p) == 1 {
141
+ return true
142
+ }
143
+
144
+ switch p[1].Code {
145
+ case P_TCP, P_UDP, P_IP4, P_IP6:
146
+ return true
147
+ default:
148
+ return false
149
+ }
150
}
Godeps/_workspace/src/github.com/jbenet/go-multiaddr/net_test.go
+66
@@ -18,6 +18,44 @@ func testConvert(t *testing.T, s string, gen GenFunc) {
18
}
19
}
20
21
+func testToNetAddr(t *testing.T, maddr, ntwk, addr string) {
22
+ m, err := NewMultiaddr(maddr)
23
+ if err != nil {
24
+ t.Fatal("failed to generate.")
25
+ }
26
+
27
+ naddr, err := ToNetAddr(m)
28
+ if addr == "" { // should fail
29
+ if err == nil {
30
+ t.Fatalf("failed to error: %s", m)
31
+ }
32
+ return
33
+ }
34
+
35
+ // shouldn't fail
36
+ if err != nil {
37
+ t.Fatalf("failed to convert to net addr: %s", m)
38
+ }
39
+
40
+ if naddr.String() != addr {
41
+ t.Fatalf("naddr.Address() == %s != %s", naddr, addr)
42
+ }
43
+
44
+ if naddr.Network() != ntwk {
45
+ t.Fatalf("naddr.Network() == %s != %s", naddr.Network(), ntwk)
46
+ }
47
+
48
+ // should convert properly
49
+ switch ntwk {
50
+ case "tcp":
51
+ _ = naddr.(*net.TCPAddr)
52
+ case "udp":
53
+ _ = naddr.(*net.UDPAddr)
54
+ case "ip":
55
+ _ = naddr.(*net.IPAddr)
56
+ }
57
+}
58
+
59
func TestFromIP4(t *testing.T) {
60
testConvert(t, "/ip4/10.20.30.40", func() (Multiaddr, error) {
61
return FromIP(net.ParseIP("10.20.30.40"))
@@ -48,6 +86,34 @@ func TestFromUDP(t *testing.T) {
86
})
87
}
88
89
+func TestThinWaist(t *testing.T) {
90
+ addrs := map[string]bool{
91
+ "/ip4/127.0.0.1/udp/1234": true,
92
+ "/ip4/127.0.0.1/tcp/1234": true,
93
+ "/ip4/127.0.0.1/udp/1234/tcp/1234": true,
94
+ "/ip4/127.0.0.1/tcp/12345/ip4/1.2.3.4": true,
95
+ "/ip6/::1/tcp/80": true,
96
+ "/ip6/::1/udp/80": true,
97
+ "/ip6/::1": true,
98
+ "/tcp/1234/ip4/1.2.3.4": false,
99
+ "/tcp/1234": false,
100
+ "/tcp/1234/udp/1234": false,
101
+ "/ip4/1.2.3.4/ip4/2.3.4.5": true,
102
+ "/ip6/::1/ip4/2.3.4.5": true,
103
+ }
104
+
105
+ for a, res := range addrs {
106
+ ma, err := NewMultiaddr(a)
107
+ if err != nil {
108
+ t.Fatalf("failed to construct Multiaddr: %s", a)
109
+ }
110
+
111
+ if IsThinWaist(ma) != res {
112
+ t.Fatalf("IsThinWaist(%s) != %v", a, res)
113
+ }
114
+ }
115
+}
116
+
117
func TestDialArgs(t *testing.T) {
118
m, err := NewMultiaddr("/ip4/127.0.0.1/udp/1234")
119
if err != nil {