summaryrefslogtreecommitdiff
path: root/src/pkg/http/request.go
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2009-11-17 14:45:10 -0800
committerRuss Cox <rsc@golang.org>2009-11-17 14:45:10 -0800
commita98bab89b88257e8dabc5454a0c36bd57ddece01 (patch)
treee39aac5a13a70c08536af5118a801d1d3d3422c6 /src/pkg/http/request.go
parent249e74bd6880845533377c147bab200ed12b8a7f (diff)
downloadgolang-a98bab89b88257e8dabc5454a0c36bd57ddece01.tar.gz
http: do not crash accessing r.Form if ParseForm fails
Fixes issue 233. R=dsymonds1 http://codereview.appspot.com/154179
Diffstat (limited to 'src/pkg/http/request.go')
-rw-r--r--src/pkg/http/request.go10
1 files changed, 4 insertions, 6 deletions
diff --git a/src/pkg/http/request.go b/src/pkg/http/request.go
index 5c6ce9099..ee8d9af0e 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.