diff --git a/convert.go b/convert.go index d6069b3..ac05f2e 100644 --- a/convert.go +++ b/convert.go @@ -112,13 +112,13 @@ func ToNetAddr(maddr ma.Multiaddr) (net.Addr, error) { } switch network { - case "tcp": + case "tcp", "tcp4", "tcp6": return net.ResolveTCPAddr(network, host) - case "udp": + case "udp", "udp4", "udp6": return net.ResolveUDPAddr(network, host) - case "utp": + case "utp", "utp4", "utp6": return utp.ResolveUTPAddr(network, host) - case "ip": + case "ip", "ip4", "ip6": return net.ResolveIPAddr(network, host) } @@ -158,8 +158,10 @@ func DialArgs(m ma.Multiaddr) (string, string, error) { var host string switch parts[0] { case "ip4": + network = network + "4" host = strings.Join([]string{parts[1], parts[3]}, ":") case "ip6": + network = network + "6" host = fmt.Sprintf("[%s]:%s", parts[1], parts[3]) } return network, host, nil diff --git a/convert_test.go b/convert_test.go index 1775983..f9aaac3 100644 --- a/convert_test.go +++ b/convert_test.go @@ -152,7 +152,10 @@ func TestDialArgs(t *testing.T) { } } - test("/ip4/127.0.0.1/udp/1234", "udp", "127.0.0.1:1234") - test("/ip4/127.0.0.1/tcp/4321", "tcp", "127.0.0.1:4321") - test("/ip4/127.0.0.1/udp/1234/utp", "utp", "127.0.0.1:1234") + test("/ip4/127.0.0.1/udp/1234", "udp4", "127.0.0.1:1234") + test("/ip4/127.0.0.1/tcp/4321", "tcp4", "127.0.0.1:4321") + test("/ip4/127.0.0.1/udp/1234/utp", "utp4", "127.0.0.1:1234") + test("/ip6/::1/udp/1234", "udp6", "[::1]:1234") + test("/ip6/::1/tcp/4321", "tcp6", "[::1]:4321") + test("/ip6/::1/udp/1234/utp", "utp6", "[::1]:1234") } diff --git a/net.go b/net.go index 907c68e..6085a6c 100644 --- a/net.go +++ b/net.go @@ -106,12 +106,12 @@ func (d *Dialer) Dial(remote ma.Multiaddr) (Conn, error) { // ok, Dial! var nconn net.Conn switch rnet { - case "tcp": + case "tcp", "tcp4", "tcp6": nconn, err = d.Dialer.Dial(rnet, rnaddr) if err != nil { return nil, err } - case "utp": + case "udp", "udp4", "udp6": return nil, fmt.Errorf("utp is currently broken") // // construct utp dialer, with options on our net.Dialer @@ -236,6 +236,14 @@ func Listen(laddr ma.Multiaddr) (Listener, error) { return nil, err } + // we need to fetch the new multiaddr from the listener, as it + // may have resolved to some other value. + nladdr, err := FromNetAddr(nl.Addr()) + if err != nil { + return nil, err + } + laddr = nladdr + return &maListener{ Listener: nl, laddr: laddr, diff --git a/net_test.go b/net_test.go index dba4efb..d0e102e 100644 --- a/net_test.go +++ b/net_test.go @@ -141,7 +141,10 @@ func TestListen(t *testing.T) { func TestListenAddrs(t *testing.T) { - test := func(addr string, succeed bool) { + test := func(addr, resaddr string, succeed bool) { + if resaddr == "" { + resaddr = addr + } maddr := newMultiaddr(t, addr) l, err := Listen(maddr) @@ -152,10 +155,13 @@ func TestListenAddrs(t *testing.T) { return } if succeed && err != nil { - t.Fatal("failed to listen", addr, err) + t.Error("failed to listen", addr, err) } if l == nil { - t.Fatal("failed to listen", addr, succeed, err) + t.Error("failed to listen", addr, succeed, err) + } + if l.Multiaddr().String() != resaddr { + t.Error("listen addr did not resolve properly", l.Multiaddr().String(), resaddr, succeed, err) } if err = l.Close(); err != nil { @@ -163,9 +169,18 @@ func TestListenAddrs(t *testing.T) { } } - test("/ip4/127.0.0.1/tcp/4324", true) - test("/ip4/127.0.0.1/udp/4325", false) - test("/ip4/127.0.0.1/udp/4326/udt", false) + test("/ip4/127.0.0.1/tcp/4324", "", true) + test("/ip4/127.0.0.1/udp/4325", "", false) + test("/ip4/127.0.0.1/udp/4326/udt", "", false) + test("/ip4/0.0.0.0/tcp/4324", "", true) + test("/ip4/0.0.0.0/udp/4325", "", false) + test("/ip4/0.0.0.0/udp/4326/udt", "", false) + test("/ip6/::1/tcp/4324", "", true) + test("/ip6/::1/udp/4325", "", false) + test("/ip6/::1/udp/4326/udt", "", false) + test("/ip6/::/tcp/4324", "", true) + test("/ip6/::/udp/4325", "", false) + test("/ip6/::/udp/4326/udt", "", false) // test("/ip4/127.0.0.1/udp/4326/utp", true) }