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.
69 lines
1.7 KiB
Go
69 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 information
|
|
// removed.
|
|
func RemoveBasicAuth(u string) string {
|
|
uu, err := url.Parse(u)
|
|
if err != nil {
|
|
return u
|
|
}
|
|
uu.User = nil
|
|
return uu.String()
|
|
}
|