diff options
| author | Bill Neubauer <wcn@golang.org> | 2009-10-03 11:09:01 -0700 |
|---|---|---|
| committer | Bill Neubauer <wcn@golang.org> | 2009-10-03 11:09:01 -0700 |
| commit | 41a2b21f2606ea9568f375beb9c5d517107e6dfa (patch) | |
| tree | a53cea1fe1767a3e6a168356f55f742aec9a5725 /src | |
| parent | 11d380557949c454fcda1f4b7909d4de2556d0e2 (diff) | |
| download | go-41a2b21f2606ea9568f375beb9c5d517107e6dfa.tar.xz | |
Fixing HTTP POST handling to work with Chrome and Safari.
request.go does not handle Content-Type correctly for the definition of
Media Types.
http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7
R=rsc
APPROVED=rsc
DELTA=44 (42 added, 0 deleted, 2 changed)
OCL=35274
CL=35306
Diffstat (limited to 'src')
| -rw-r--r-- | src/pkg/http/request.go | 2 | ||||
| -rw-r--r-- | src/pkg/http/request_test.go | 44 |
2 files changed, 44 insertions, 2 deletions
diff --git a/src/pkg/http/request.go b/src/pkg/http/request.go index 2b425b7322..7ca7f0dc6c 100644 --- a/src/pkg/http/request.go +++ b/src/pkg/http/request.go @@ -627,7 +627,7 @@ func (r *Request) ParseForm() (err os.Error) { return os.ErrorString("missing form body") } ct, _ := r.Header["Content-Type"]; - switch ct { + switch strings.Split(ct, ";", 2)[0] { case "text/plain", "application/x-www-form-urlencoded", "": var b []byte; if b, err = io.ReadAll(r.Body); err != nil { diff --git a/src/pkg/http/request_test.go b/src/pkg/http/request_test.go index c5762ab296..d45e0ed6b5 100644 --- a/src/pkg/http/request_test.go +++ b/src/pkg/http/request_test.go @@ -4,7 +4,10 @@ package http -import "testing" +import ( + "bytes"; + "testing"; +) type stringMultimap map[string] []string @@ -64,3 +67,42 @@ func TestQuery(t *testing.T) { t.Errorf(`req.FormValue("q") = %q, want "foo"`, q); } } + +type stringMap map[string]string +type parseContentTypeTest struct { + contentType stringMap; + error bool; +} + +var parseContentTypeTests = []parseContentTypeTest{ + parseContentTypeTest{ + contentType: stringMap{ "Content-Type": "text/plain" }, + }, + parseContentTypeTest{ + contentType: stringMap{ "Content-Type": "" }, + }, + parseContentTypeTest{ + contentType: stringMap{ "Content-Type": "text/plain; boundary=" }, + }, + parseContentTypeTest{ + contentType: stringMap{ "Content-Type": "application/unknown" }, + error: true, + }, +} + +func TestPostContentTypeParsing(t *testing.T) { + for i, test := range parseContentTypeTests { + req := &Request{ + Method: "POST", + Header: test.contentType, + Body: bytes.NewBufferString("body") + }; + err := req.ParseForm(); + if !test.error && err != nil { + t.Errorf("test %d: Unexpected error: %v", i, err); + } + if test.error && err == nil { + t.Errorf("test %d should have returned error", i); + } + } +} |
