Commit e02d6bb6 authored by OneOfOne's avatar OneOfOne Committed by Brad Fitzpatrick

net/http: support multipart/mixed in Request.MultipartReader

Fixes #23959

GitHub-Last-Rev: 08ce026f52f9fd65b49d99745dffed46a3951585
GitHub-Pull-Request: golang/go#24012
Change-Id: I7e71c41330346dbc4dad6ba813cabfa8a54e2f66
Reviewed-on: https://go-review.googlesource.com/95975
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
parent 669676b7
...@@ -411,7 +411,7 @@ var multipartByReader = &multipart.Form{ ...@@ -411,7 +411,7 @@ var multipartByReader = &multipart.Form{
} }
// MultipartReader returns a MIME multipart reader if this is a // MultipartReader returns a MIME multipart reader if this is a
// multipart/form-data POST request, else returns nil and an error. // multipart/form-data or a multipart/mixed POST request, else returns nil and an error.
// Use this function instead of ParseMultipartForm to // Use this function instead of ParseMultipartForm to
// process the request body as a stream. // process the request body as a stream.
func (r *Request) MultipartReader() (*multipart.Reader, error) { func (r *Request) MultipartReader() (*multipart.Reader, error) {
...@@ -422,16 +422,16 @@ func (r *Request) MultipartReader() (*multipart.Reader, error) { ...@@ -422,16 +422,16 @@ func (r *Request) MultipartReader() (*multipart.Reader, error) {
return nil, errors.New("http: multipart handled by ParseMultipartForm") return nil, errors.New("http: multipart handled by ParseMultipartForm")
} }
r.MultipartForm = multipartByReader r.MultipartForm = multipartByReader
return r.multipartReader() return r.multipartReader(true)
} }
func (r *Request) multipartReader() (*multipart.Reader, error) { func (r *Request) multipartReader(allowMixed bool) (*multipart.Reader, error) {
v := r.Header.Get("Content-Type") v := r.Header.Get("Content-Type")
if v == "" { if v == "" {
return nil, ErrNotMultipart return nil, ErrNotMultipart
} }
d, params, err := mime.ParseMediaType(v) d, params, err := mime.ParseMediaType(v)
if err != nil || d != "multipart/form-data" { if err != nil || !(d == "multipart/form-data" || allowMixed && d == "multipart/mixed") {
return nil, ErrNotMultipart return nil, ErrNotMultipart
} }
boundary, ok := params["boundary"] boundary, ok := params["boundary"]
...@@ -1207,7 +1207,7 @@ func (r *Request) ParseMultipartForm(maxMemory int64) error { ...@@ -1207,7 +1207,7 @@ func (r *Request) ParseMultipartForm(maxMemory int64) error {
return nil return nil
} }
mr, err := r.multipartReader() mr, err := r.multipartReader(false)
if err != nil { if err != nil {
return err return err
} }
......
...@@ -143,6 +143,16 @@ func TestMultipartReader(t *testing.T) { ...@@ -143,6 +143,16 @@ func TestMultipartReader(t *testing.T) {
t.Errorf("expected multipart; error: %v", err) t.Errorf("expected multipart; error: %v", err)
} }
req = &Request{
Method: "POST",
Header: Header{"Content-Type": {`multipart/mixed; boundary="foo123"`}},
Body: ioutil.NopCloser(new(bytes.Buffer)),
}
multipart, err = req.MultipartReader()
if multipart == nil {
t.Errorf("expected multipart; error: %v", err)
}
req.Header = Header{"Content-Type": {"text/plain"}} req.Header = Header{"Content-Type": {"text/plain"}}
multipart, err = req.MultipartReader() multipart, err = req.MultipartReader()
if multipart != nil { if multipart != nil {
......
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