From ba94fb83865c09af05d038aecc25a1309afa56f2 Mon Sep 17 00:00:00 2001 From: Rob Best Date: Fri, 22 Mar 2019 12:00:28 +0000 Subject: [PATCH] Maintain backwards compatibility by parsing URL scheme into default port values --- ssl_exporter.go | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/ssl_exporter.go b/ssl_exporter.go index f84d09d..a1fbb87 100644 --- a/ssl_exporter.go +++ b/ssl_exporter.go @@ -7,6 +7,7 @@ import ( "io/ioutil" "net" "net/http" + "net/url" "strconv" "strings" "time" @@ -194,8 +195,14 @@ func probeHandler(w http.ResponseWriter, r *http.Request, tlsConfig *tls.Config) timeout := time.Duration((timeoutSeconds) * 1e9) + t, err := parseTarget(target) + if err != nil { + log.Errorln(err) + return + } + exporter := &Exporter{ - target: target, + target: t, timeout: timeout, tlsConfig: tlsConfig, } @@ -229,6 +236,35 @@ func contains(certs []*x509.Certificate, cert *x509.Certificate) bool { return false } +// parseTarget makes an attempt at converting URLs of the form scheme://host +// into host:port +func parseTarget(target string) (parsedTarget string, err error) { + if !strings.Contains(target, "://") { + target = "//" + target + } + + u, err := url.Parse(target) + if err != nil { + log.Errorln(err) + return + } + + if u.Port() == "" { + switch scheme := u.Scheme; scheme { + case "https": + parsedTarget = u.Host + ":443" + case "ldaps": + parsedTarget = u.Host + ":636" + default: + parsedTarget = u.Host + ":443" + } + } else { + parsedTarget = u.Host + } + + return parsedTarget, nil +} + func init() { prometheus.MustRegister(version.NewCollector(namespace + "_exporter")) }