...
1 package rifs
2
3 import (
4 "fmt"
5 "io"
6 )
7
8 const (
9 defaultCopyBufferSize = 1024 * 1024
10 )
11
12
13
14
15
16
17
18
19 func GracefulCopy(w io.Writer, r io.Reader, buffer []byte) (copyCount int, err error) {
20 if buffer == nil {
21 buffer = make([]byte, defaultCopyBufferSize)
22 }
23
24 for {
25 readCount, err := r.Read(buffer)
26 if err != nil {
27 if err != io.EOF {
28 err = fmt.Errorf("read error: %s", err.Error())
29 return 0, err
30 }
31
32
33 if readCount == 0 {
34 break
35 }
36 }
37
38 writeBuffer := buffer[:readCount]
39
40 for len(writeBuffer) > 0 {
41 writtenCount, err := w.Write(writeBuffer)
42 if err != nil {
43 err = fmt.Errorf("write error: %s", err.Error())
44 return 0, err
45 }
46
47 writeBuffer = writeBuffer[writtenCount:]
48 }
49
50 copyCount += readCount
51 }
52
53 return copyCount, nil
54 }
55
View as plain text