42 lines
1.1 KiB
Go
42 lines
1.1 KiB
Go
package evcli
|
|
|
|
import (
|
|
"bytes"
|
|
"net/url"
|
|
)
|
|
|
|
// The url package has an extremely confusing interface. One could believe
|
|
// setting RawPath is enough for it to be used during encoding, but this is
|
|
// not the case. Instead, *both* must be set, and (*url.URL).EscapedPath will
|
|
// check that RawPath is a valid encoding of RawPath. If this is not the case,
|
|
// RawPath will be ignored.
|
|
//
|
|
// In most cases, the problem is not apparent. But if the path contains
|
|
// segments with slash or space characters, it is almost guaranteed to misuse
|
|
// Path and RawPath and double-encode these characters.
|
|
//
|
|
// The problem was signaled years ago on
|
|
// https://github.com/golang/go/issues/17340 but was of course ignored and
|
|
// buried.
|
|
//
|
|
// As usual with standard library issues, the only thing we can do is add
|
|
// utils to work around it.
|
|
|
|
func NewURL(pathSegments ...string) *url.URL {
|
|
var buf bytes.Buffer
|
|
buf.WriteByte('/')
|
|
for i, s := range pathSegments {
|
|
if i > 0 {
|
|
buf.WriteByte('/')
|
|
}
|
|
buf.WriteString(url.PathEscape(s))
|
|
}
|
|
rawPath := buf.String()
|
|
|
|
path, _ := url.PathUnescape(rawPath)
|
|
|
|
return &url.URL{
|
|
Path: path,
|
|
RawPath: rawPath,
|
|
}
|
|
}
|