diff --git a/src/core/link.go b/src/core/link.go index 87504079..d3779701 100644 --- a/src/core/link.go +++ b/src/core/link.go @@ -158,6 +158,9 @@ const ErrLinkNoSuitableIPs = linkError("peer has no suitable addresses") const ErrLinkToSelf = linkError("node cannot connect to self") func (l *links) add(u *url.URL, sintf string, linkType linkType) error { + if _, err := l.dialerFor(u); err != nil { + return err + } var retErr error phony.Block(l, func() { // Generate the link info and see whether we think we already @@ -591,6 +594,14 @@ func (l *links) listen(u *url.URL, sintf string, local bool) (*Listener, error) } func (l *links) connect(ctx context.Context, u *url.URL, info linkInfo, options linkOptions) (net.Conn, error) { + dialer, err := l.dialerFor(u) + if err != nil { + return nil, err + } + return dialer.dial(ctx, u, info, options) +} + +func (l *links) dialerFor(u *url.URL) (linkProtocol, error) { var dialer linkProtocol switch strings.ToLower(u.Scheme) { case "tcp": @@ -610,7 +621,7 @@ func (l *links) connect(ctx context.Context, u *url.URL, info linkInfo, options default: return nil, ErrLinkUnrecognisedSchema } - return dialer.dial(ctx, u, info, options) + return dialer, nil } func (l *links) handler(linkType linkType, options linkOptions, conn net.Conn, success func(), local bool) error { diff --git a/src/core/options_test.go b/src/core/options_test.go index bab22fb1..9bff0fc1 100644 --- a/src/core/options_test.go +++ b/src/core/options_test.go @@ -39,3 +39,15 @@ func TestDuplicatePeerFromAPI(t *testing.T) { t.Fatalf("Adding peer should have failed on second attempt") } } + +func TestAddEmptyPeer(t *testing.T) { + cfg := config.GenerateConfig() + c, err := New(cfg.Certificate, nil) + if err != nil { + t.Fatal(err) + } + u, _ := url.Parse("") + if err := c.AddPeer(u, ""); err == nil { + t.Fatalf("Expected error on empty URL: %s", err) + } +}