1
0
Fork 0
You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

68 lines
1.7 KiB
Go

package url
import (
"errors"
"fmt"
"net/url"
"strings"
)
var (
// ErrUserInfoExists is returned when a join address already contains
// a username and a password.
ErrUserInfoExists = errors.New("userinfo exists")
)
// NormalizeAddr ensures that the given URL has a HTTP protocol prefix.
// If none is supplied, it prefixes the URL with "http://".
func NormalizeAddr(addr string) string {
if !strings.HasPrefix(addr, "http://") && !strings.HasPrefix(addr, "https://") {
return fmt.Sprintf("http://%s", addr)
}
return addr
}
// EnsureHTTPS modifies the given URL, ensuring it is using the HTTPS protocol.
func EnsureHTTPS(addr string) string {
if !strings.HasPrefix(addr, "http://") && !strings.HasPrefix(addr, "https://") {
return fmt.Sprintf("https://%s", addr)
}
return strings.Replace(addr, "http://", "https://", 1)
}
// CheckHTTPS returns true if the given URL uses HTTPS.
func CheckHTTPS(addr string) bool {
return strings.HasPrefix(addr, "https://")
}
// AddBasicAuth adds username and password to the join address. If username is empty
// joinAddr is returned unchanged. If joinAddr already contains a username, ErrUserInfoExists
// is returned.
func AddBasicAuth(joinAddr, username, password string) (string, error) {
if username == "" {
return joinAddr, nil
}
u, err := url.Parse(joinAddr)
if err != nil {
return "", err
}
if u.User != nil && u.User.Username() != "" {
return "", ErrUserInfoExists
}
u.User = url.UserPassword(username, password)
return u.String(), nil
}
// RemoveBasicAuth returns a copy of the given URL, with any basic auth password
// redacted.
func RemoveBasicAuth(u string) string {
uu, err := url.Parse(u)
if err != nil {
return u
}
return uu.Redacted()
}