From 03dc4e63faa07410c923ce0b6e7910c0f708cb6a Mon Sep 17 00:00:00 2001
From: Ed <edward.welch@grafana.com>
Date: Thu, 18 Jul 2019 14:16:30 -0400
Subject: [PATCH] Parse the addr into a URL so we can extract the Host name for
 use in the TLSConfig (#778)

---
 cmd/logcli/client.go | 10 ++++++----
 cmd/logcli/main.go   | 29 ++++++++++++++++++++---------
 2 files changed, 26 insertions(+), 13 deletions(-)

diff --git a/cmd/logcli/client.go b/cmd/logcli/client.go
index ed4bd3d9..257fd027 100644
--- a/cmd/logcli/client.go
+++ b/cmd/logcli/client.go
@@ -54,7 +54,8 @@ func listLabelValues(name string) (*logproto.LabelResponse, error) {
 }
 
 func doRequest(path string, out interface{}) error {
-	url := *addr + path
+	addrURL.Path = path
+	url := addrURL.String()
 	if !*quiet {
 		log.Print(url)
 	}
@@ -71,7 +72,7 @@ func doRequest(path string, out interface{}) error {
 			CAFile:             *tlsCACertPath,
 			CertFile:           *tlsClientCertPath,
 			KeyFile:            *tlsClientCertKeyPath,
-			ServerName:         url,
+			ServerName:         addrURL.Host,
 			InsecureSkipVerify: *tlsSkipVerify,
 		},
 	}
@@ -110,14 +111,15 @@ func wsConnect(path string) (*websocket.Conn, error) {
 		CAFile:             *tlsCACertPath,
 		CertFile:           *tlsClientCertPath,
 		KeyFile:            *tlsClientCertKeyPath,
-		ServerName:         *addr,
+		ServerName:         addrURL.Host,
 		InsecureSkipVerify: *tlsSkipVerify,
 	})
 	if err != nil {
 		return nil, err
 	}
 
-	url := *addr + path
+	addrURL.Path = path
+	url := addrURL.String()
 	if strings.HasPrefix(url, "https") {
 		url = strings.Replace(url, "https", "wss", 1)
 	} else if strings.HasPrefix(url, "http") {
diff --git a/cmd/logcli/main.go b/cmd/logcli/main.go
index 10eff49b..86cb8bcf 100644
--- a/cmd/logcli/main.go
+++ b/cmd/logcli/main.go
@@ -2,9 +2,10 @@ package main
 
 import (
 	"log"
+	"net/url"
 	"os"
 
-	kingpin "gopkg.in/alecthomas/kingpin.v2"
+	"gopkg.in/alecthomas/kingpin.v2"
 )
 
 var (
@@ -12,7 +13,9 @@ var (
 	quiet      = app.Flag("quiet", "suppress everything but log lines").Default("false").Short('q').Bool()
 	outputMode = app.Flag("output", "specify output mode [default, raw, jsonl]").Default("default").Short('o').Enum("default", "raw", "jsonl")
 
-	addr     = app.Flag("addr", "Server address.").Default("https://logs-us-west1.grafana.net").Envar("GRAFANA_ADDR").String()
+	addr    = app.Flag("addr", "Server address.").Default("https://logs-us-west1.grafana.net").Envar("GRAFANA_ADDR").String()
+	addrURL url.URL
+
 	username = app.Flag("username", "Username for HTTP basic auth.").Default("").Envar("GRAFANA_USERNAME").String()
 	password = app.Flag("password", "Password for HTTP basic auth.").Default("").Envar("GRAFANA_PASSWORD").String()
 
@@ -35,19 +38,27 @@ var (
 	ignoreLabelsKey = queryCmd.Flag("exclude-label", "Exclude labels given the provided key during output.").Strings()
 	showLabelsKey   = queryCmd.Flag("include-label", "Include labels given the provided key during output.").Strings()
 	fixedLabelsLen  = queryCmd.Flag("labels-length", "Set a fixed padding to labels").Default("0").Int()
-
-	labelsCmd = app.Command("labels", "Find values for a given label.")
-	labelName = labelsCmd.Arg("label", "The name of the label.").HintAction(listLabels).String()
+	labelsCmd       = app.Command("labels", "Find values for a given label.")
+	labelName       = labelsCmd.Arg("label", "The name of the label.").HintAction(listLabels).String()
 )
 
 func main() {
 	log.SetOutput(os.Stderr)
 
-	switch kingpin.MustParse(app.Parse(os.Args[1:])) {
+	cmd := kingpin.MustParse(app.Parse(os.Args[1:]))
+
+	if *addr == "" {
+		log.Fatalln("Server address cannot be empty")
+	}
+
+	u, err := url.Parse(*addr)
+	if err != nil {
+		log.Fatalf("Failed to parse addr into URL: %v", err)
+	}
+	addrURL = *u
+
+	switch cmd {
 	case queryCmd.FullCommand():
-		if *addr == "" {
-			log.Fatalln("Server address cannot be empty")
-		}
 		doQuery()
 	case labelsCmd.FullCommand():
 		doLabels()
-- 
GitLab