]> Cypherpunks repositories - gostls13.git/commitdiff
http: Add EncodeQuery, a handy helper function for constructing URL query strings.
authorDavid Symonds <dsymonds@golang.org>
Tue, 7 Dec 2010 20:54:04 +0000 (15:54 -0500)
committerRuss Cox <rsc@golang.org>
Tue, 7 Dec 2010 20:54:04 +0000 (15:54 -0500)
R=stephenm, rsc
CC=golang-dev
https://golang.org/cl/2985042

src/pkg/http/client.go
src/pkg/http/url.go
src/pkg/http/url_test.go

index 87f5c34d87e822e708c421455332c82aa658f50a..e902369e7c2d86976c7d9ae3cac2f38eb0ad1095 100644 (file)
@@ -199,20 +199,13 @@ func PostForm(url string, data map[string]string) (r *Response, err os.Error) {
        return send(&req)
 }
 
+// TODO: remove this function when PostForm takes a multimap.
 func urlencode(data map[string]string) (b *bytes.Buffer) {
-       b = new(bytes.Buffer)
-       first := true
+       m := make(map[string][]string, len(data))
        for k, v := range data {
-               if first {
-                       first = false
-               } else {
-                       b.WriteByte('&')
-               }
-               b.WriteString(URLEscape(k))
-               b.WriteByte('=')
-               b.WriteString(URLEscape(v))
+               m[k] = []string{v}
        }
-       return
+       return bytes.NewBuffer([]byte(EncodeQuery(m)))
 }
 
 // Head issues a HEAD to the specified URL.
index b878c009f9a1f569555dcb12bf92ad998dddd7d4..f0ac4c1dfd7a5d584469184c53f4f171b0b5454a 100644 (file)
@@ -515,3 +515,15 @@ func (url *URL) String() string {
        }
        return result
 }
+
+// EncodeQuery encodes the query represented as a multimap.
+func EncodeQuery(m map[string][]string) string {
+       parts := make([]string, 0, len(m)) // will be large enough for most uses
+       for k, vs := range m {
+               prefix := URLEscape(k) + "="
+               for _, v := range vs {
+                       parts = append(parts, prefix+URLEscape(v))
+               }
+       }
+       return strings.Join(parts, "&")
+}
index 8198e5f3e79456886f96cd45b6b426c0d9502017..59b4750aa40cdde61471af149604687e469b73bb 100644 (file)
@@ -507,3 +507,24 @@ func TestUnescapeUserinfo(t *testing.T) {
                }
        }
 }
+
+type qMap map[string][]string
+
+type EncodeQueryTest struct {
+       m        qMap
+       expected string
+}
+
+var encodeQueryTests = []EncodeQueryTest{
+       {nil, ""},
+       {qMap{"q": {"puppies"}, "oe": {"utf8"}}, "q=puppies&oe=utf8"},
+       {qMap{"q": {"dogs", "&", "7"}}, "q=dogs&q=%26&q=7"},
+}
+
+func TestEncodeQuery(t *testing.T) {
+       for _, tt := range encodeQueryTests {
+               if q := EncodeQuery(tt.m); q != tt.expected {
+                       t.Errorf(`EncodeQuery(%+v) = %q, want %q`, tt.m, q, tt.expected)
+               }
+       }
+}