]> Cypherpunks repositories - gostls13.git/commitdiff
http: add ParseQuery
authorPetar Maymounkov <petarm@gmail.com>
Tue, 16 Mar 2010 20:57:16 +0000 (13:57 -0700)
committerRuss Cox <rsc@golang.org>
Tue, 16 Mar 2010 20:57:16 +0000 (13:57 -0700)
R=rsc
CC=golang-dev
https://golang.org/cl/238041

src/pkg/http/request.go
src/pkg/http/request_test.go

index 82701adc664fc01d2e48df78cd0a4bab3ab52ed4..33c12c024a8695a03c17a4c70e07de06c3cd84e7 100644 (file)
@@ -571,7 +571,7 @@ func ReadRequest(b *bufio.Reader) (req *Request, err os.Error) {
        return req, nil
 }
 
-func parseForm(m map[string][]string, query string) (err os.Error) {
+func ParseQuery(query string) (m map[string][]string, err os.Error) {
        data := make(map[string]*vector.StringVector)
        for _, kv := range strings.Split(query, "&", 0) {
                kvPair := strings.Split(kv, "=", 2)
@@ -594,6 +594,7 @@ func parseForm(m map[string][]string, query string) (err os.Error) {
                vec.Push(value)
        }
 
+       m = make(map[string][]string)
        for k, vec := range data {
                m[k] = vec.Data()
        }
@@ -607,7 +608,6 @@ func (r *Request) ParseForm() (err os.Error) {
        if r.Form != nil {
                return
        }
-       r.Form = make(map[string][]string)
 
        var query string
        switch r.Method {
@@ -615,6 +615,7 @@ func (r *Request) ParseForm() (err os.Error) {
                query = r.URL.RawQuery
        case "POST":
                if r.Body == nil {
+                       r.Form = make(map[string][]string)
                        return os.ErrorString("missing form body")
                }
                ct, _ := r.Header["Content-Type"]
@@ -622,15 +623,18 @@ func (r *Request) ParseForm() (err os.Error) {
                case "text/plain", "application/x-www-form-urlencoded", "":
                        var b []byte
                        if b, err = ioutil.ReadAll(r.Body); err != nil {
+                               r.Form = make(map[string][]string)
                                return err
                        }
                        query = string(b)
                // TODO(dsymonds): Handle multipart/form-data
                default:
+                       r.Form = make(map[string][]string)
                        return &badStringError{"unknown Content-Type", ct}
                }
        }
-       return parseForm(r.Form, query)
+       r.Form, err = ParseQuery(query)
+       return
 }
 
 // FormValue returns the first value for the named component of the query.
index f5b575c9575625a952950d83df051605a621130b..98d5342bbb70b217edeef7fe964f1bae7a532fd1 100644 (file)
@@ -33,8 +33,7 @@ var parseTests = []parseTest{
 
 func TestParseForm(t *testing.T) {
        for i, test := range parseTests {
-               form := make(map[string][]string)
-               err := parseForm(form, test.query)
+               form, err := ParseQuery(test.query)
                if err != nil {
                        t.Errorf("test %d: Unexpected error: %v", i, err)
                        continue