logmower-shipper/vendor/github.com/jtagcat/util/std/url.go

61 lines
1.0 KiB
Go

package std
import (
"net/url"
"path"
"strings"
)
// k8s.io/helm/pkg/urlutil
// mod: supports // and /
// in case of multiple absolute paths, last is used
func URLJoin(baseURL string, paths ...string) (string, error) {
// mod:
// base is replaced by first with //
newBase := -1
for i, p := range paths {
if strings.HasPrefix(p, "//") {
newBase = i
}
}
u, err := url.Parse(baseURL)
if err != nil {
return "", err
}
if newBase > -1 {
old := u
u, err = url.Parse(paths[newBase])
if err != nil {
return "", err
}
u.Scheme = old.Scheme
if u.User == nil {
u.User = old.User
}
paths = paths[newBase+1:]
}
// mod:
// allow rooting to domain with /
absPath := -1
for i, p := range paths {
if strings.HasPrefix(p, "/") {
absPath = i
}
}
// We want path instead of filepath because path always uses /.
if absPath > -1 {
u.Path = path.Join(paths[absPath:]...)
} else {
all := []string{u.Path}
all = append(all, paths...)
u.Path = path.Join(all...)
}
return u.String(), nil
}