diff --git a/client/influxdb.go b/client/influxdb.go index 13901334fc..9e0d727171 100644 --- a/client/influxdb.go +++ b/client/influxdb.go @@ -38,22 +38,21 @@ func ParseConnectionString(path string, ssl bool) (url.URL, error) { var host string var port int - if strings.Contains(path, ":") { - h := strings.Split(path, ":") - i, e := strconv.Atoi(h[1]) - if e != nil { - return url.URL{}, fmt.Errorf("invalid port number %q: %s\n", path, e) - } - port = i - if h[0] == "" { + h, p, err := net.SplitHostPort(path) + if err != nil { + if path == "" { host = DefaultHost } else { - host = h[0] + host = path } - } else { - host = path // If they didn't specify a port, always use the default port port = DefaultPort + } else { + host = h + port, err = strconv.Atoi(p) + if err != nil { + return url.URL{}, fmt.Errorf("invalid port number %q: %s\n", path, err) + } } u := url.URL{ @@ -62,6 +61,7 @@ func ParseConnectionString(path string, ssl bool) (url.URL, error) { if ssl { u.Scheme = "https" } + u.Host = net.JoinHostPort(host, strconv.Itoa(port)) return u, nil diff --git a/client/influxdb_test.go b/client/influxdb_test.go index 34cedc446d..0a1981c831 100644 --- a/client/influxdb_test.go +++ b/client/influxdb_test.go @@ -547,3 +547,14 @@ func TestClient_NoTimeout(t *testing.T) { t.Fatalf("unexpected error. expected %v, actual %v", nil, err) } } + +func TestClient_ParseConnectionString_IPv6(t *testing.T) { + path := "[fdf5:9ede:1875:0:a9ee:a600:8fe3:d495]:8086" + u, err := client.ParseConnectionString(path, false) + if err != nil { + t.Fatalf("unexpected error, expected %v, actual %v", nil, err) + } + if u.Host != path { + t.Fatalf("ipv6 parse failed, expected %s, actual %s", path, u.Host) + } +}