diff --git a/cmd/notify-webhook.go b/cmd/notify-webhook.go index 10904672e..95af0fcb4 100644 --- a/cmd/notify-webhook.go +++ b/cmd/notify-webhook.go @@ -37,13 +37,13 @@ type httpConn struct { Endpoint string } -// Lookup host address by dialing. -func lookupHost(addr string) error { +// Lookup endpoint address by successfully dialing. +func lookupEndpoint(u *url.URL) error { dialer := &net.Dialer{ Timeout: 300 * time.Millisecond, KeepAlive: 300 * time.Millisecond, } - nconn, err := dialer.Dial("tcp", addr) + nconn, err := dialer.Dial("tcp", canonicalAddr(u)) if err != nil { return err } @@ -63,7 +63,7 @@ func newWebhookNotify(accountID string) (*logrus.Logger, error) { return nil, err } - if err = lookupHost(u.Host); err != nil { + if err = lookupEndpoint(u); err != nil { return nil, err } diff --git a/cmd/utils.go b/cmd/utils.go index 8723e62ad..c62aed21b 100644 --- a/cmd/utils.go +++ b/cmd/utils.go @@ -102,6 +102,24 @@ func urlPath2BucketObjectName(u *url.URL) (bucketName, objectName string) { return bucketName, objectName } +var portMap = map[string]string{ + "http": "80", + "https": "443", +} + +// Given a string of the form "host", "host:port", or "[ipv6::address]:port", +// return true if the string includes a port. +func hasPort(s string) bool { return strings.LastIndex(s, ":") > strings.LastIndex(s, "]") } + +// canonicalAddr returns url.Host but always with a ":port" suffix +func canonicalAddr(u *url.URL) string { + addr := u.Host + if !hasPort(addr) { + return addr + ":" + portMap[u.Scheme] + } + return addr +} + // checkDuplicates - function to validate if there are duplicates in a slice of endPoints. func checkDuplicateEndpoints(endpoints []*url.URL) error { var strs []string