-func transferFile(conn net.Conn, dst string) error {
- const buffSize = 1024
- buf := make([]byte, buffSize)
-
- // Read first chunk of bytes from conn; this will be the Flat File Object and initial chunk of file bytes
- if _, err := conn.Read(buf); err != nil {
- return err
- }
- ffo := ReadFlattenedFileObject(buf)
- payloadLen := len(ffo.BinaryMarshal())
- fileSize := int(binary.BigEndian.Uint32(ffo.FlatFileDataForkHeader.DataSize))
-
- newFile, err := os.Create(dst)
- if err != nil {
- return err
- }
- defer func() { _ = newFile.Close() }()
- if _, err := newFile.Write(buf[payloadLen:]); err != nil {
- return err
- }
- receivedBytes := buffSize - payloadLen
-
- for {
- if (fileSize - receivedBytes) < buffSize {
- _, err := io.CopyN(newFile, conn, int64(fileSize-receivedBytes))
- return err
- }
-
- // Copy N bytes from conn to upload file
- n, err := io.CopyN(newFile, conn, buffSize)
- if err != nil {
- return err
- }
- receivedBytes += int(n)
- }
-}
-