aboutsummaryrefslogtreecommitdiff
path: root/external/evcli/url.go
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--external/evcli/url.go42
1 files changed, 42 insertions, 0 deletions
diff --git a/external/evcli/url.go b/external/evcli/url.go
new file mode 100644
index 0000000..e1e99a8
--- /dev/null
+++ b/external/evcli/url.go
@@ -0,0 +1,42 @@
+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,
+ }
+}