aboutsummaryrefslogtreecommitdiff
path: root/src/mime
diff options
context:
space:
mode:
authorHenry Clifford <h.a.clifford@gmail.com>2018-03-09 22:28:55 +0000
committerAndrew Bonventre <andybons@golang.org>2018-03-10 00:33:10 +0000
commitf69ad10377b1817e3db57851226a23973caa584e (patch)
treeaf042797a9ee2f971eaa550b74fabb0dcb38f668 /src/mime
parent0eacf8cbdfaec174f29fd8c734ac2f02442af79a (diff)
downloadgo-f69ad10377b1817e3db57851226a23973caa584e.tar.gz
go-f69ad10377b1817e3db57851226a23973caa584e.zip
mime/multipart: test for presence of filename instead of content-type
Fixes #24041 Preserving the intended fix in https://go.googlesource.com/go/+/81ec7256072ed5e20b8827c583193258769aebc0 Change-Id: I600d3d7edc74ca072a066739e2ef3235877d808f GitHub-Last-Rev: 14973d7c2bf4022c28ef4b4984ec3cd352c1d4d8 GitHub-Pull-Request: golang/go#24104 Reviewed-on: https://go-review.googlesource.com/96975 Reviewed-by: Andrew Bonventre <andybons@golang.org> Run-TryBot: Andrew Bonventre <andybons@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/mime')
-rw-r--r--src/mime/multipart/formdata.go3
-rw-r--r--src/mime/multipart/formdata_test.go24
-rw-r--r--src/mime/multipart/multipart.go10
3 files changed, 35 insertions, 2 deletions
diff --git a/src/mime/multipart/formdata.go b/src/mime/multipart/formdata.go
index 2a4ebdd4a0..22e2c8d323 100644
--- a/src/mime/multipart/formdata.go
+++ b/src/mime/multipart/formdata.go
@@ -58,8 +58,7 @@ func (r *Reader) readForm(maxMemory int64) (_ *Form, err error) {
var b bytes.Buffer
- _, hasContentTypeHeader := p.Header["Content-Type"]
- if !hasContentTypeHeader && filename == "" {
+ if !p.hasFileName() {
// value, store as string in memory
n, err := io.CopyN(&b, p, maxValueBytes+1)
if err != nil && err != io.EOF {
diff --git a/src/mime/multipart/formdata_test.go b/src/mime/multipart/formdata_test.go
index 69333d3d0d..5e3c3330f3 100644
--- a/src/mime/multipart/formdata_test.go
+++ b/src/mime/multipart/formdata_test.go
@@ -55,6 +55,21 @@ func TestReadFormWithNamelessFile(t *testing.T) {
}
+func TestReadFormWithTextContentType(t *testing.T) {
+ // From https://github.com/golang/go/issues/24041
+ b := strings.NewReader(strings.Replace(messageWithTextContentType, "\n", "\r\n", -1))
+ r := NewReader(b, boundary)
+ f, err := r.ReadForm(25)
+ if err != nil {
+ t.Fatal("ReadForm:", err)
+ }
+ defer f.RemoveAll()
+
+ if g, e := f.Value["texta"][0], textaValue; g != e {
+ t.Errorf("texta value = %q, want %q", g, e)
+ }
+}
+
func testFile(t *testing.T, fh *FileHeader, efn, econtent string) File {
if fh.Filename != efn {
t.Errorf("filename = %q, want %q", fh.Filename, efn)
@@ -94,6 +109,15 @@ Content-Type: text/plain
--MyBoundary--
`
+const messageWithTextContentType = `
+--MyBoundary
+Content-Disposition: form-data; name="texta"
+Content-Type: text/plain
+
+` + textaValue + `
+--MyBoundary
+`
+
const message = `
--MyBoundary
Content-Disposition: form-data; name="filea"; filename="filea.txt"
diff --git a/src/mime/multipart/multipart.go b/src/mime/multipart/multipart.go
index 1954808176..06fa736f95 100644
--- a/src/mime/multipart/multipart.go
+++ b/src/mime/multipart/multipart.go
@@ -81,6 +81,16 @@ func (p *Part) FileName() string {
return p.dispositionParams["filename"]
}
+// hasFileName determines if a (empty or otherwise)
+// filename parameter was included in the Content-Disposition header
+func (p *Part) hasFileName() bool {
+ if p.dispositionParams == nil {
+ p.parseContentDisposition()
+ }
+ _, ok := p.dispositionParams["filename"]
+ return ok
+}
+
func (p *Part) parseContentDisposition() {
v := p.Header.Get("Content-Disposition")
var err error