lib/rest: add URLPathEscapeAll to URL escape as many chars as possible

This commit is contained in:
Nick Craig-Wood
2025-09-02 16:13:28 +01:00
parent dd75af6a18
commit 1f14b6aa35
2 changed files with 46 additions and 0 deletions

View File

@@ -3,6 +3,7 @@ package rest
import (
"fmt"
"net/url"
"strings"
)
// URLJoin joins a URL and a path returning a new URL
@@ -24,3 +25,24 @@ func URLPathEscape(in string) string {
u.Path = in
return u.String()
}
// URLPathEscapeAll escapes URL path the in string using URL escaping rules
//
// It escapes every character except [A-Za-z0-9] and /
func URLPathEscapeAll(in string) string {
var b strings.Builder
b.Grow(len(in) * 3) // worst case: every byte escaped
const hex = "0123456789ABCDEF"
for i := range len(in) {
c := in[i]
if (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') ||
(c >= '0' && c <= '9') || c == '/' {
b.WriteByte(c)
} else {
b.WriteByte('%')
b.WriteByte(hex[c>>4])
b.WriteByte(hex[c&0x0F])
}
}
return b.String()
}