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:
parent
784d810976
commit
a6293995c5
@ -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 {
|
||||
|
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user