]> Cypherpunks repositories - gostls13.git/commitdiff
undo CL 95760043 / b2131d729e52
authorBrad Fitzpatrick <bradfitz@golang.org>
Tue, 5 Aug 2014 18:36:44 +0000 (11:36 -0700)
committerBrad Fitzpatrick <bradfitz@golang.org>
Tue, 5 Aug 2014 18:36:44 +0000 (11:36 -0700)
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

index 6b5f4a6b316c955faaf6b7f87c0e99e45ae79f03..e13a956afeed0c12a6029520d663eab50f549cf5 100644 (file)
@@ -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
 }