Commit 41a2b21f authored by Bill Neubauer's avatar Bill Neubauer

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
parent 11d38055
...@@ -627,7 +627,7 @@ func (r *Request) ParseForm() (err os.Error) { ...@@ -627,7 +627,7 @@ func (r *Request) ParseForm() (err os.Error) {
return os.ErrorString("missing form body") return os.ErrorString("missing form body")
} }
ct, _ := r.Header["Content-Type"]; ct, _ := r.Header["Content-Type"];
switch ct { switch strings.Split(ct, ";", 2)[0] {
case "text/plain", "application/x-www-form-urlencoded", "": case "text/plain", "application/x-www-form-urlencoded", "":
var b []byte; var b []byte;
if b, err = io.ReadAll(r.Body); err != nil { if b, err = io.ReadAll(r.Body); err != nil {
......
...@@ -4,7 +4,10 @@ ...@@ -4,7 +4,10 @@
package http package http
import "testing" import (
"bytes";
"testing";
)
type stringMultimap map[string] []string type stringMultimap map[string] []string
...@@ -64,3 +67,42 @@ func TestQuery(t *testing.T) { ...@@ -64,3 +67,42 @@ func TestQuery(t *testing.T) {
t.Errorf(`req.FormValue("q") = %q, want "foo"`, q); 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);
}
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment