github.com/weaveworks/common@v0.0.0-20230728070032-dd9e68f319d5/sanitize/sanitize.go (about)

     1  package sanitize
     2  
     3  import (
     4  	"fmt"
     5  	"net"
     6  	"net/url"
     7  	"strings"
     8  
     9  	log "github.com/sirupsen/logrus"
    10  )
    11  
    12  // URL returns a function that sanitizes a URL string. It lets underspecified
    13  // strings to be converted to usable URLs via some default arguments.
    14  func URL(defaultScheme string, defaultPort int, defaultPath string) func(string) string {
    15  	if defaultScheme == "" {
    16  		defaultScheme = "http://"
    17  	}
    18  	return func(s string) string {
    19  		if s == "" {
    20  			return s // can't do much here
    21  		}
    22  		if !strings.Contains(s, "://") {
    23  			s = defaultScheme + s
    24  		}
    25  		u, err := url.Parse(s)
    26  		if err != nil {
    27  			log.Errorf("%q: %v", s, err)
    28  			return s // oh well
    29  		}
    30  		if _, port, err := net.SplitHostPort(u.Host); err != nil && defaultPort > 0 {
    31  			u.Host += fmt.Sprintf(":%d", defaultPort)
    32  		} else if port == "443" {
    33  			if u.Scheme == "ws" {
    34  				u.Scheme = "wss"
    35  			} else {
    36  				u.Scheme = "https"
    37  			}
    38  		}
    39  		if defaultPath != "" && u.Path != defaultPath {
    40  			u.Path = defaultPath
    41  		}
    42  		return u.String()
    43  	}
    44  }