payload almost done
This commit is contained in:
1 parent
77bfcba5b1
commit
09d0f237d5
16 files changed
+690
-118
No files matched your search
@@ -0,0 +1,56 @@
|
||||
package payload
|
||||
|
||||
import (
|
||||
"io"
|
||||
)
|
||||
|
||||
type CopyOutput struct {
|
||||
Err error
|
||||
Written int64
|
||||
}
|
||||
|
||||
func copyAndUpdate(dst io.Writer, data []byte, copyOutput *CopyOutput) {
|
||||
if copyOutput.Err != nil {
|
||||
return
|
||||
}
|
||||
nw, ew := dst.Write(data)
|
||||
if nw > 0 {
|
||||
copyOutput.Written += int64(nw)
|
||||
}
|
||||
if ew != nil {
|
||||
copyOutput.Err = ew
|
||||
return
|
||||
}
|
||||
if len(data) != nw {
|
||||
copyOutput.Err = io.ErrShortWrite
|
||||
}
|
||||
}
|
||||
|
||||
func CopyToTwoWriters(dst1 io.Writer, dst2 io.Writer, src io.Reader) (copyOutput1 *CopyOutput, copyOutput2 *CopyOutput) {
|
||||
// TODO: if necessary, implements the speedup methods if src implements *WriterTo*
|
||||
// or if both dst implement ReaderFrom. See
|
||||
// http://golang.org/src/pkg/io/io.go for example
|
||||
copyOutput1, copyOutput2 = new(CopyOutput), new(CopyOutput)
|
||||
var nr int
|
||||
var er error
|
||||
buf := make([]byte, 32*1024)
|
||||
for {
|
||||
nr, er = src.Read(buf)
|
||||
if nr > 0 {
|
||||
copyAndUpdate(dst1, buf[0:nr], copyOutput1)
|
||||
copyAndUpdate(dst2, buf[0:nr], copyOutput2)
|
||||
}
|
||||
if copyOutput1.Err != nil && copyOutput2.Err != nil {
|
||||
break
|
||||
}
|
||||
if er == io.EOF {
|
||||
break
|
||||
}
|
||||
if er != nil {
|
||||
copyOutput1.Err = er
|
||||
copyOutput2.Err = er
|
||||
break
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
Reference in new issue
Block a user