diff --git a/peerinfo.go b/peerinfo.go index 1ce2eaa..2225cf5 100644 --- a/peerinfo.go +++ b/peerinfo.go @@ -31,12 +31,13 @@ func InfoFromP2pAddr(m ma.Multiaddr) (*PeerInfo, error) { return nil, ErrInvalidAddr } - ipfspart := parts[len(parts)-1] // last part + // TODO(lgierth): we shouldn't assume /ipfs is the last part + ipfspart := parts[len(parts)-1] if ipfspart.Protocols()[0].Code != ma.P_IPFS { return nil, ErrInvalidAddr } - // make sure 'ipfs id' parses as a peer.ID + // make sure the /ipfs value parses as a peer.ID peerIdParts := strings.Split(ipfspart.String(), "/") peerIdStr := peerIdParts[len(peerIdParts)-1] id, err := peer.IDB58Decode(peerIdStr) @@ -44,9 +45,15 @@ func InfoFromP2pAddr(m ma.Multiaddr) (*PeerInfo, error) { return nil, err } + // we might have received just an /ipfs part, which means there's no addr. + var addrs []ma.Multiaddr + if len(parts) > 1 { + addrs = append(addrs, ma.Join(parts[:len(parts)-1]...)) + } + return &PeerInfo{ ID: id, - Addrs: []ma.Multiaddr{ma.Join(parts[:len(parts)-1]...)}, + Addrs: addrs, }, nil } diff --git a/peerinfo_test.go b/peerinfo_test.go index 199fed2..5122129 100644 --- a/peerinfo_test.go +++ b/peerinfo_test.go @@ -58,29 +58,54 @@ func TestPeerInfoMarshal(t *testing.T) { } func TestP2pAddrParsing(t *testing.T) { - a := mustAddr(t, "/ip4/1.2.3.4/tcp/4536") id, err := peer.IDB58Decode("QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ") if err != nil { - t.Fatal(err) + t.Error(err) } + addr := ma.StringCast("/ip4/1.2.3.4/tcp/4536") + p2paddr := ma.Join(addr, ma.StringCast("/ipfs/"+peer.IDB58Encode(id))) - p2pa := a.String() + "/ipfs/" + id.Pretty() - p2pma, err := ma.NewMultiaddr(p2pa) + pinfo, err := InfoFromP2pAddr(p2paddr) if err != nil { - t.Fatal(err) - } - - pinfo, err := InfoFromP2pAddr(p2pma) - if err != nil { - t.Fatal(err) + t.Error(err) } if pinfo.ID != id { - t.Fatal("didnt get expected peerID") + t.Fatalf("expected PeerID [%s], got [%s]", id, pinfo.ID) } - if !a.Equal(pinfo.Addrs[0]) { - t.Fatal("didnt get expected address") + if len(pinfo.Addrs) != 1 { + t.Fatalf("expected 1 addr, got %d", len(pinfo.Addrs)) + } + + if !addr.Equal(pinfo.Addrs[0]) { + t.Fatalf("expected addr [%s], got [%s]", addr, pinfo.Addrs[0]) + } + + addr = ma.StringCast("/ipfs/" + peer.IDB58Encode(id)) + pinfo, err = InfoFromP2pAddr(addr) + if err != nil { + t.Error(err) + } + + if pinfo.ID != id { + t.Fatalf("expected PeerID [%s], got [%s]", id, pinfo.ID) + } + + if len(pinfo.Addrs) > 0 { + t.Fatalf("expected 0 addrs, got %d", len(pinfo.Addrs)) + } + + addr = ma.StringCast("/ip4/1.2.3.4/tcp/4536") + pinfo, err = InfoFromP2pAddr(addr) + if err == nil { + t.Fatalf("expected error, got none") + } + + addr = ma.StringCast("/ip4/1.2.3.4/tcp/4536/http") + pinfo, err = InfoFromP2pAddr(addr) + if err == nil { + t.Fatalf("expected error, got none") } }