From 1e79033a77adf395cef6537e74787ad00817d152 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 8 Mar 2018 08:40:19 -0800 Subject: [PATCH 1/3] turn NetListener() method on listener interface into a helper method This method made implementing the manet.Listener interface annoying. Also, this lets us drop the "use with caution" warning as we're now *wrapping* the listener instead of exposing internal state. --- net.go | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/net.go b/net.go index 9ee4ade..104a767 100644 --- a/net.go +++ b/net.go @@ -153,10 +153,6 @@ func Dial(remote ma.Multiaddr) (Conn, error) { // it uses an embedded net.Listener, overriding net.Listener.Accept to // return a Conn and providing Multiaddr. type Listener interface { - - // NetListener returns the embedded net.Listener. Use with caution. - NetListener() net.Listener - // Accept waits for and returns the next connection to the listener. // Returns a Multiaddr friendly Conn Accept() (Conn, error) @@ -172,17 +168,29 @@ type Listener interface { Addr() net.Addr } +type netListenerAdapter struct { + Listener +} + +func (nla *netListenerAdapter) Accept() (net.Conn, error) { + return nla.Listener.Accept() +} + +// NetListener turns this Listener into a net.Listener. +// +// * Connections returned from Accept implement multiaddr-net Conn. +// * Calling WrapNetListener on the net.Listener returned by this function will +// return the original (underlying) multiaddr-net Listener. +func NetListener(l Listener) net.Listener { + return &netListenerAdapter{l} +} + // maListener implements Listener type maListener struct { net.Listener laddr ma.Multiaddr } -// NetListener returns the embedded net.Listener. Use with caution. -func (l *maListener) NetListener() net.Listener { - return l.Listener -} - // Accept waits for and returns the next connection to the listener. // Returns a Multiaddr friendly Conn func (l *maListener) Accept() (Conn, error) { @@ -237,6 +245,10 @@ func Listen(laddr ma.Multiaddr) (Listener, error) { // WrapNetListener wraps a net.Listener with a manet.Listener. func WrapNetListener(nl net.Listener) (Listener, error) { + if nla, ok := nl.(*netListenerAdapter); ok { + return nla.Listener, nil + } + laddr, err := FromNetAddr(nl.Addr()) if err != nil { return nil, err From fad8780c0cdc891902993f172f099f56f79e6d1a Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 8 Mar 2018 09:00:00 -0800 Subject: [PATCH 2/3] add test for netlistener wrapper/unwrapper --- net_test.go | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/net_test.go b/net_test.go index e7299b2..a073e3b 100644 --- a/net_test.go +++ b/net_test.go @@ -514,3 +514,57 @@ func TestInterfaceAddressesWorks(t *testing.T) { t.Fatal(err) } } + +func TestNetListener(t *testing.T) { + listener, err := net.Listen("tcp", "127.0.0.1:1234") + if err != nil { + t.Fatal(err) + } + defer listener.Close() + malist, err := WrapNetListener(listener) + if err != nil { + t.Fatal(err) + } + if !malist.Multiaddr().Equal(newMultiaddr(t, "/ip4/127.0.0.1/tcp/1234")) { + t.Fatal("unexpected multiaddr") + } + + go func() { + c, err := Dial(malist.Multiaddr()) + if err != nil { + t.Fatal("failed to dial") + } + if !c.RemoteMultiaddr().Equal(malist.Multiaddr()) { + t.Fatal("dialed wrong target") + } + c.Close() + + c, err = Dial(malist.Multiaddr()) + if err != nil { + t.Fatal("failed to dial") + } + c.Close() + }() + + c, err := malist.Accept() + if err != nil { + t.Fatal(err) + } + c.Close() + netList := NetListener(malist) + malist2, err := WrapNetListener(netList) + if err != nil { + t.Fatal(err) + } + if malist2 != malist { + t.Fatal("expected WrapNetListener(NetListener(malist)) == malist") + } + nc, err := netList.Accept() + if err != nil { + t.Fatal(err) + } + if !nc.(Conn).LocalMultiaddr().Equal(malist.Multiaddr()) { + t.Fatal("wrong multiaddr on conn") + } + nc.Close() +} From 2f3005bbc1360664b08724d4fae47d7a0ce6ba78 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sat, 10 Mar 2018 13:04:48 -0800 Subject: [PATCH 3/3] gx publish 1.6.0 --- .gx/lastpubver | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gx/lastpubver b/.gx/lastpubver index fdda16f..cf0d634 100644 --- a/.gx/lastpubver +++ b/.gx/lastpubver @@ -1 +1 @@ -1.5.7: QmRK2LxanhK2gZq6k6R7vk5ZoYZk8ULSSTB7FzDsMUX6CB +1.6.0: QmcGXGdw9BWDysPJQHxJinjGHha3eEg4vzFETre4woNwcX diff --git a/package.json b/package.json index a68dbc9..4d11e2a 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,6 @@ "license": "", "name": "go-multiaddr-net", "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "1.5.7" + "version": "1.6.0" }