]> Cypherpunks repositories - gostls13.git/commitdiff
net/http: make ParseMultipartForm also populate Request.PostForm
authorEmmanuel Odeke <emm.odeke@gmail.com>
Sat, 27 Feb 2016 10:14:06 +0000 (03:14 -0700)
committerBrad Fitzpatrick <bradfitz@golang.org>
Sat, 12 Mar 2016 19:01:47 +0000 (19:01 +0000)
Ensures that after request.ParseMultipartForm has been invoked,
Request.PostForm and Request.Form are both populated with the
same formValues read in, instead of only populating Request.Form.

Fixes #9305

Change-Id: I3d4a11b006fc7dffaa35360014fe15b8c74d00a3
Reviewed-on: https://go-review.googlesource.com/19986
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/net/http/request.go
src/net/http/request_test.go

index 76fb8fe6d1c553add26a333c6e6ace1fcecb2978..9dba0c33b55323f38cd71d991ade8429d79541c7 100644 (file)
@@ -997,9 +997,16 @@ func (r *Request) ParseMultipartForm(maxMemory int64) error {
        if err != nil {
                return err
        }
+
+       if r.PostForm == nil {
+               r.PostForm = make(url.Values)
+       }
        for k, v := range f.Value {
                r.Form[k] = append(r.Form[k], v...)
+               // r.PostForm should also be populated. See Issue 9305.
+               r.PostForm[k] = append(r.PostForm[k], v...)
        }
+
        r.MultipartForm = f
 
        return nil
index 3d215ff5380bf499e1883594620dd84cc4b105c5..ff4837f2faadde59ba158f3903559314a2eaed84 100644 (file)
@@ -158,6 +158,68 @@ func TestMultipartReader(t *testing.T) {
        }
 }
 
+// Issue 9305: ParseMultipartForm should populate PostForm too
+func TestParseMultipartFormPopulatesPostForm(t *testing.T) {
+       postData :=
+               `--xxx
+Content-Disposition: form-data; name="field1"
+
+value1
+--xxx
+Content-Disposition: form-data; name="field2"
+
+value2
+--xxx
+Content-Disposition: form-data; name="file"; filename="file"
+Content-Type: application/octet-stream
+Content-Transfer-Encoding: binary
+
+binary data
+--xxx--
+`
+       req := &Request{
+               Method: "POST",
+               Header: Header{"Content-Type": {`multipart/form-data; boundary=xxx`}},
+               Body:   ioutil.NopCloser(strings.NewReader(postData)),
+       }
+
+       initialFormItems := map[string]string{
+               "language": "Go",
+               "name":     "gopher",
+               "skill":    "go-ing",
+               "field2":   "initial-value2",
+       }
+
+       req.Form = make(url.Values)
+       for k, v := range initialFormItems {
+               req.Form.Add(k, v)
+       }
+
+       err := req.ParseMultipartForm(10000)
+       if err != nil {
+               t.Fatalf("unexpected multipart error %v", err)
+       }
+
+       wantForm := url.Values{
+               "language": []string{"Go"},
+               "name":     []string{"gopher"},
+               "skill":    []string{"go-ing"},
+               "field1":   []string{"value1"},
+               "field2":   []string{"initial-value2", "value2"},
+       }
+       if !reflect.DeepEqual(req.Form, wantForm) {
+               t.Fatalf("req.Form = %v, want %v", req.Form, wantForm)
+       }
+
+       wantPostForm := url.Values{
+               "field1": []string{"value1"},
+               "field2": []string{"value2"},
+       }
+       if !reflect.DeepEqual(req.PostForm, wantPostForm) {
+               t.Fatalf("req.PostForm = %v, want %v", req.PostForm, wantPostForm)
+       }
+}
+
 func TestParseMultipartForm(t *testing.T) {
        req := &Request{
                Method: "POST",