Handle POST object upload without filename param (#6221)

POST mime/multipart upload style can have filename value optional
which leads to implementation issues in Go releases in their
standard mime/multipart library.

When `filename` doesn't exist Go doesn't update `form.File` which
we rely on to extract the incoming file data, strangely when `filename`
is not specified this data is buffered in memory and is now part of
`form.Value` instead of `form.File` which creates an inconsistent
behavior.

This PR tries to fix this in our code for the time being, but ideal PR
would be to fix the upstream mime/multipart library to handle the
above situation consistently.
master
Harshavardhana 6 years ago committed by kannappanr
parent 76c423392a
commit e17e09ea3c
  1. 16
      cmd/handler-utils.go

@ -17,8 +17,10 @@
package cmd package cmd
import ( import (
"bytes"
"context" "context"
"io" "io"
"io/ioutil"
"mime/multipart" "mime/multipart"
"net" "net"
"net/http" "net/http"
@ -235,6 +237,19 @@ func extractPostPolicyFormValues(ctx context.Context, form *multipart.Form) (fil
return nil, "", 0, nil, err return nil, "", 0, nil, err
} }
// this means that filename="" was not specified for file key and Go has
// an ugly way of handling this situation. Refer here
// https://golang.org/src/mime/multipart/formdata.go#L61
if len(form.File) == 0 {
var b = &bytes.Buffer{}
for _, v := range formValues["File"] {
b.WriteString(v)
}
fileSize = int64(b.Len())
filePart = ioutil.NopCloser(b)
return filePart, fileName, fileSize, formValues, nil
}
// Iterator until we find a valid File field and break // Iterator until we find a valid File field and break
for k, v := range form.File { for k, v := range form.File {
canonicalFormName := http.CanonicalHeaderKey(k) canonicalFormName := http.CanonicalHeaderKey(k)
@ -269,7 +284,6 @@ func extractPostPolicyFormValues(ctx context.Context, form *multipart.Form) (fil
break break
} }
} }
return filePart, fileName, fileSize, formValues, nil return filePart, fileName, fileSize, formValues, nil
} }

Loading…
Cancel
Save