1
0
mirror of https://github.com/golang/go synced 2024-11-12 03:40:21 -07:00

mime/multipart: quote boundary in Content-Type if necessary

Fixes #26532

Change-Id: Ic086c90503c7b24982f947c828c7ccf016ddbf69
Reviewed-on: https://go-review.googlesource.com/c/154120
Run-TryBot: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
Ian Lance Taylor 2018-12-13 15:23:35 -08:00
parent 784d810976
commit a6293995c5
2 changed files with 20 additions and 1 deletions

View File

@ -72,7 +72,13 @@ func (w *Writer) SetBoundary(boundary string) error {
// FormDataContentType returns the Content-Type for an HTTP
// multipart/form-data with this Writer's Boundary.
func (w *Writer) FormDataContentType() string {
return "multipart/form-data; boundary=" + w.boundary
b := w.boundary
// We must quote the boundary if it contains any of the
// tspecials characters defined by RFC 2045, or space.
if strings.ContainsAny(b, `()<>@,;:\"/[]?= `) {
b = `"` + b + `"`
}
return "multipart/form-data; boundary=" + b
}
func randomBoundary() string {

View File

@ -7,6 +7,7 @@ package multipart
import (
"bytes"
"io/ioutil"
"mime"
"net/textproto"
"strings"
"testing"
@ -94,6 +95,7 @@ func TestWriterSetBoundary(t *testing.T) {
{"my-separator", true},
{"with space", true},
{"badspace ", false},
{"(boundary)", true},
}
for i, tt := range tests {
var b bytes.Buffer
@ -107,6 +109,17 @@ func TestWriterSetBoundary(t *testing.T) {
if got != tt.b {
t.Errorf("boundary = %q; want %q", got, tt.b)
}
ct := w.FormDataContentType()
mt, params, err := mime.ParseMediaType(ct)
if err != nil {
t.Errorf("could not parse Content-Type %q: %v", ct, err)
} else if mt != "multipart/form-data" {
t.Errorf("unexpected media type %q; want %q", mt, "multipart/form-data")
} else if b := params["boundary"]; b != tt.b {
t.Errorf("unexpected boundary parameter %q; want %q", b, tt.b)
}
w.Close()
wantSub := "\r\n--" + tt.b + "--\r\n"
if got := b.String(); !strings.Contains(got, wantSub) {