Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 13 additions & 2 deletions state/endpoint_resolver.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,19 @@ func newEndpointResolver(dns dnsLookup) *EndpointResolver {
}
}

func (r *EndpointResolver) Resolve(endpoint string, expiry time.Duration) (netip.AddrPort, error) {
// literalEndpoint parses ip:port or a bare ip on the default port
func literalEndpoint(endpoint string) (netip.AddrPort, bool) {
if addr, err := netip.ParseAddrPort(endpoint); err == nil {
return addr, true
}
if addr, err := netip.ParseAddr(endpoint); err == nil {
return netip.AddrPortFrom(addr, uint16(DefaultPort)), true
}
return netip.AddrPort{}, false
}

func (r *EndpointResolver) Resolve(endpoint string, expiry time.Duration) (netip.AddrPort, error) {
if addr, ok := literalEndpoint(endpoint); ok {
return addr, nil
}

Expand Down Expand Up @@ -106,7 +117,7 @@ func (r *EndpointResolver) Resolve(endpoint string, expiry time.Duration) (netip
}

func (r *EndpointResolver) Get(endpoint string) (netip.AddrPort, error) {
if addr, err := netip.ParseAddrPort(endpoint); err == nil {
if addr, ok := literalEndpoint(endpoint); ok {
return addr, nil
}

Expand Down
29 changes: 29 additions & 0 deletions state/endpoint_resolver_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -166,3 +166,32 @@ func (r *blockingDNSResolver) ResolveName(context.Context, string) ([]netip.Addr
func (*blockingDNSResolver) ResolveSRV(context.Context, string, string, string) (string, uint16, error) {
return "", 0, errors.New("no SRV record")
}

// a bare ip endpoint is a literal and must not wait on dns
func TestEndpointResolverBareIPSkipsDNS(t *testing.T) {
resolver := newEndpointResolver(noDNSResolver{t})
for endpoint, want := range map[string]netip.AddrPort{
"192.0.2.1": netip.MustParseAddrPort("192.0.2.1:57175"),
"2001:db8::1": netip.MustParseAddrPort("[2001:db8::1]:57175"),
"192.0.2.1:1234": netip.MustParseAddrPort("192.0.2.1:1234"),
} {
got, err := resolver.Resolve(endpoint, time.Hour)
require.NoError(t, err)
assert.Equal(t, want, got)
got, err = resolver.Get(endpoint)
require.NoError(t, err)
assert.Equal(t, want, got)
}
}

type noDNSResolver struct{ t *testing.T }

func (r noDNSResolver) ResolveName(_ context.Context, host string) ([]netip.Addr, error) {
r.t.Errorf("unexpected name lookup for %s", host)
return nil, errors.New("no dns")
}

func (r noDNSResolver) ResolveSRV(_ context.Context, _, _, name string) (string, uint16, error) {
r.t.Errorf("unexpected SRV lookup for %s", name)
return "", 0, errors.New("no dns")
}
Loading