aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBill Neubauer <wcn@golang.org>2009-10-03 11:09:01 -0700
committerBill Neubauer <wcn@golang.org>2009-10-03 11:09:01 -0700
commit41a2b21f2606ea9568f375beb9c5d517107e6dfa (patch)
treea53cea1fe1767a3e6a168356f55f742aec9a5725 /src
parent11d380557949c454fcda1f4b7909d4de2556d0e2 (diff)
downloadgo-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.go2
-rw-r--r--src/pkg/http/request_test.go44
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);
+ }
+ }
+}