From dab671b660b6411fb314997af29da2048eb88c46 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Tue, 5 Aug 2014 11:36:44 -0700 Subject: [PATCH] undo CL 95760043 / b2131d729e52 MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Breaks Camlistore by introducing a datarace. See comments on https://golang.org/cl/95760043/ for details. I'll add a new test to lock-in the current behavior in a subsequent CL. I don't think Camlistore is particularly unique here: it's doing the obvious thing to stream a multipart body to a server using a goroutine feeding the multipart writer. ««« original CL description mime/multipart: delay reading random source If a user sets his/her own boundary string with SetBoundary, we don't need to call randomBoundary at all. LGTM=bradfitz R=golang-codereviews, bradfitz CC=golang-codereviews https://golang.org/cl/95760043 »»» LGTM=ruiu R=ruiu CC=golang-codereviews, mathieu.lonjaret https://golang.org/cl/117600043 --- src/pkg/mime/multipart/writer.go | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/pkg/mime/multipart/writer.go b/src/pkg/mime/multipart/writer.go index 6b5f4a6b31..e13a956afe 100644 --- a/src/pkg/mime/multipart/writer.go +++ b/src/pkg/mime/multipart/writer.go @@ -25,15 +25,13 @@ type Writer struct { // writing to w. func NewWriter(w io.Writer) *Writer { return &Writer{ - w: w, + w: w, + boundary: randomBoundary(), } } // Boundary returns the Writer's boundary. func (w *Writer) Boundary() string { - if w.boundary == "" { - w.boundary = randomBoundary() - } return w.boundary } @@ -67,7 +65,7 @@ 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() + return "multipart/form-data; boundary=" + w.boundary } func randomBoundary() string { @@ -91,9 +89,9 @@ func (w *Writer) CreatePart(header textproto.MIMEHeader) (io.Writer, error) { } var b bytes.Buffer if w.lastpart != nil { - fmt.Fprintf(&b, "\r\n--%s\r\n", w.Boundary()) + fmt.Fprintf(&b, "\r\n--%s\r\n", w.boundary) } else { - fmt.Fprintf(&b, "--%s\r\n", w.Boundary()) + fmt.Fprintf(&b, "--%s\r\n", w.boundary) } // TODO(bradfitz): move this to textproto.MimeHeader.Write(w), have it sort // and clean, like http.Header.Write(w) does. @@ -159,7 +157,7 @@ func (w *Writer) Close() error { } w.lastpart = nil } - _, err := fmt.Fprintf(w.w, "\r\n--%s--\r\n", w.Boundary()) + _, err := fmt.Fprintf(w.w, "\r\n--%s--\r\n", w.boundary) return err } -- 2.48.1