43 lines
796 B
Go
43 lines
796 B
Go
|
package missinggo
|
||
|
|
||
|
import (
|
||
|
"net/url"
|
||
|
"path"
|
||
|
)
|
||
|
|
||
|
// Returns URL opaque as an unrooted path.
|
||
|
func URLOpaquePath(u *url.URL) string {
|
||
|
if u.Opaque != "" {
|
||
|
return u.Opaque
|
||
|
}
|
||
|
return u.Path
|
||
|
}
|
||
|
|
||
|
// Cleans the (absolute) URL path, removing unnecessary . and .. elements. See
|
||
|
// "net/http".cleanPath.
|
||
|
func CleanURLPath(p string) string {
|
||
|
if p == "" {
|
||
|
return "/"
|
||
|
}
|
||
|
if p[0] != '/' {
|
||
|
p = "/" + p
|
||
|
}
|
||
|
cp := path.Clean(p)
|
||
|
// Add the trailing slash back, as it's relevant to a URL.
|
||
|
if p[len(p)-1] == '/' && cp != "/" {
|
||
|
cp += "/"
|
||
|
}
|
||
|
return cp
|
||
|
}
|
||
|
|
||
|
func URLJoinSubPath(base, rel string) string {
|
||
|
baseURL, err := url.Parse(base)
|
||
|
if err != nil {
|
||
|
// Honey badger doesn't give a fuck.
|
||
|
panic(err)
|
||
|
}
|
||
|
rel = CleanURLPath(rel)
|
||
|
baseURL.Path = path.Join(baseURL.Path, rel)
|
||
|
return baseURL.String()
|
||
|
}
|