@cryptotaxi247 / kubo / commits / 726f53ff4

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 {