1 package internal
2 3 import (
4 "net/url"
5 "sort"
6 "strings"
7 )
8 9 // EncodeQuery is a copy-paste of url.Values.Encode, except it uses %20 instead
10 // of + to encode spaces. This is necessary to correctly render spaces in some
11 // authenticator apps, like Google Authenticator.
12 func EncodeQuery(v url.Values) string {
13 if v == nil {
14 return ""
15 }
16 var buf strings.Builder
17 keys := make([]string, 0, len(v))
18 for k := range v {
19 keys = append(keys, k)
20 }
21 sort.Strings(keys)
22 for _, k := range keys {
23 vs := v[k]
24 keyEscaped := url.PathEscape(k) // changed from url.QueryEscape
25 for _, v := range vs {
26 if buf.Len() > 0 {
27 buf.WriteByte('&')
28 }
29 buf.WriteString(keyEscaped)
30 buf.WriteByte('=')
31 buf.WriteString(url.PathEscape(v)) // changed from url.QueryEscape
32 }
33 }
34 return buf.String()
35 }
36