From 41a2b21f2606ea9568f375beb9c5d517107e6dfa Mon Sep 17 00:00:00 2001 From: Bill Neubauer Date: Sat, 3 Oct 2009 11:09:01 -0700 Subject: [PATCH] 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 --- src/pkg/http/request.go | 2 +- 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); + } + } +} -- 2.48.1