提交 57c48adf 作者: Matt Bell

commands/http: Made MultiFileReader thread safe

上级 6681c503
...@@ -6,13 +6,13 @@ import ( ...@@ -6,13 +6,13 @@ import (
"io" "io"
"mime/multipart" "mime/multipart"
"net/textproto" "net/textproto"
"sync"
cmds "github.com/jbenet/go-ipfs/commands" cmds "github.com/jbenet/go-ipfs/commands"
) )
// MultiFileReader reads from a `commands.File` (which can be a directory of files // MultiFileReader reads from a `commands.File` (which can be a directory of files
// or a regular file) as HTTP multipart encoded data. // or a regular file) as HTTP multipart encoded data.
// WARNING: Not thread-safe!
type MultiFileReader struct { type MultiFileReader struct {
io.Reader io.Reader
...@@ -21,6 +21,7 @@ type MultiFileReader struct { ...@@ -21,6 +21,7 @@ type MultiFileReader struct {
buf bytes.Buffer buf bytes.Buffer
mpWriter *multipart.Writer mpWriter *multipart.Writer
closed bool closed bool
mutex *sync.Mutex
// if true, the data will be type 'multipart/form-data' // if true, the data will be type 'multipart/form-data'
// if false, the data will be type 'multipart/mixed' // if false, the data will be type 'multipart/mixed'
...@@ -34,6 +35,7 @@ func NewMultiFileReader(file cmds.File, form bool) *MultiFileReader { ...@@ -34,6 +35,7 @@ func NewMultiFileReader(file cmds.File, form bool) *MultiFileReader {
mfr := &MultiFileReader{ mfr := &MultiFileReader{
files: file, files: file,
form: form, form: form,
mutex: &sync.Mutex{},
} }
mfr.mpWriter = multipart.NewWriter(&mfr.buf) mfr.mpWriter = multipart.NewWriter(&mfr.buf)
...@@ -41,6 +43,9 @@ func NewMultiFileReader(file cmds.File, form bool) *MultiFileReader { ...@@ -41,6 +43,9 @@ func NewMultiFileReader(file cmds.File, form bool) *MultiFileReader {
} }
func (mfr *MultiFileReader) Read(buf []byte) (written int, err error) { func (mfr *MultiFileReader) Read(buf []byte) (written int, err error) {
mfr.mutex.Lock()
defer mfr.mutex.Unlock()
// if we are closed and the buffer is flushed, end reading // if we are closed and the buffer is flushed, end reading
if mfr.closed && mfr.buf.Len() == 0 { if mfr.closed && mfr.buf.Len() == 0 {
return 0, io.EOF return 0, io.EOF
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论