diff options
author | Russ Cox <rsc@golang.org> | 2009-11-17 14:45:10 -0800 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2009-11-17 14:45:10 -0800 |
commit | 849e6f99b85eca65e6b6c9bd96aa568b4a4905f9 (patch) | |
tree | c6c0f0774d5799d89c0ec0a92b2fbdec5352a430 | |
parent | 4dfd7fdde5957e4f3ba1a0285333f7c807c28f03 (diff) | |
download | go-849e6f99b85eca65e6b6c9bd96aa568b4a4905f9.tar.gz go-849e6f99b85eca65e6b6c9bd96aa568b4a4905f9.zip |
http: do not crash accessing r.Form if ParseForm fails
Fixes #233.
R=dsymonds1
https://golang.org/cl/154179
-rw-r--r-- | src/pkg/http/request.go | 10 | ||||
-rw-r--r-- | src/pkg/http/request_test.go | 3 |
2 files changed, 6 insertions, 7 deletions
diff --git a/src/pkg/http/request.go b/src/pkg/http/request.go index 5c6ce9099b..ee8d9af0ee 100644 --- a/src/pkg/http/request.go +++ b/src/pkg/http/request.go @@ -576,7 +576,7 @@ func ReadRequest(b *bufio.Reader) (req *Request, err os.Error) { return req, nil; } -func parseForm(query string) (m map[string][]string, err os.Error) { +func parseForm(m map[string][]string, query string) (err os.Error) { data := make(map[string]*vector.StringVector); for _, kv := range strings.Split(query, "&", 0) { kvPair := strings.Split(kv, "=", 2); @@ -599,7 +599,6 @@ func parseForm(query string) (m map[string][]string, err os.Error) { vec.Push(value); } - m = make(map[string][]string); for k, vec := range data { m[k] = vec.Data() } @@ -613,9 +612,9 @@ func (r *Request) ParseForm() (err os.Error) { if r.Form != nil { return } + r.Form = make(map[string][]string); var query string; - switch r.Method { case "GET": query = r.URL.RawQuery @@ -628,7 +627,7 @@ func (r *Request) ParseForm() (err os.Error) { case "text/plain", "application/x-www-form-urlencoded", "": var b []byte; if b, err = io.ReadAll(r.Body); err != nil { - return + return err } query = string(b); // TODO(dsymonds): Handle multipart/form-data @@ -636,8 +635,7 @@ func (r *Request) ParseForm() (err os.Error) { return &badStringError{"unknown Content-Type", ct} } } - r.Form, err = parseForm(query); - return; + return parseForm(r.Form, query); } // FormValue returns the first value for the named component of the query. diff --git a/src/pkg/http/request_test.go b/src/pkg/http/request_test.go index 200aa14e9f..f2ef041bb0 100644 --- a/src/pkg/http/request_test.go +++ b/src/pkg/http/request_test.go @@ -33,7 +33,8 @@ var parseTests = []parseTest{ func TestParseForm(t *testing.T) { for i, test := range parseTests { - form, err := parseForm(test.query); + form := make(map[string][]string); + err := parseForm(form, test.query); if err != nil { t.Errorf("test %d: Unexpected error: %v", i, err); continue; |