From: Bill Neubauer Date: Sat, 3 Oct 2009 18:09:01 +0000 (-0700) Subject: Fixing HTTP POST handling to work with Chrome and Safari. X-Git-Tag: weekly.2009-11-06~420 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=41a2b21f2606ea9568f375beb9c5d517107e6dfa;p=gostls13.git 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 --- 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); + } + } +}