package client import ( "context" "errors" "io" ) func Copy(ctx context.Context, writer io.Writer, reader io.Reader) (int64, error) { var err error var size int64 var halt bool buffer := make([]byte, 1024*4) for { select { case <-ctx.Done(): err = errors.New("Break copy by context") break default: } rsize, err := reader.Read(buffer) if err == io.EOF { err = nil halt = true } if err != nil { return size, err } wsize, err := writer.Write(buffer[0:rsize]) size += int64(wsize) if err != nil { return size, err } if halt { break } } return size, err }