/
io.go
76 lines (61 loc) · 1.97 KB
/
io.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package util
import (
"net"
"github.com/cyverse/go-irodsclient/irods/common"
"golang.org/x/xerrors"
)
// ReadBytes reads data from socket in a particular size
func ReadBytes(socket net.Conn, buffer []byte, size int) (int, error) {
readLen, err := ReadBytesWithTrackerCallBack(socket, buffer, size, nil)
if err != nil {
return readLen, xerrors.Errorf("failed to read bytes from socket: %w", err)
}
return readLen, nil
}
// ReadBytesWithTrackerCallBack reads data from socket in a particular size
func ReadBytesWithTrackerCallBack(socket net.Conn, buffer []byte, size int, callback common.TrackerCallBack) (int, error) {
totalSizeToRead := size
sizeLeft := size
actualRead := 0
for sizeLeft > 0 {
sizeRead, err := socket.Read(buffer[actualRead:size])
if err != nil {
return actualRead, xerrors.Errorf("failed to read from socket: %w", err)
}
sizeLeft -= sizeRead
actualRead += sizeRead
if callback != nil {
callback(int64(actualRead), int64(totalSizeToRead))
}
}
if sizeLeft < 0 {
return actualRead, xerrors.Errorf("received more bytes than requested, %d requested, but %d read", size, actualRead)
}
return actualRead, nil
}
// WriteBytes writes data to socket
func WriteBytes(socket net.Conn, buffer []byte, size int) error {
err := WriteBytesWithTrackerCallBack(socket, buffer, size, nil)
if err != nil {
return xerrors.Errorf("failed to write bytes to socket: %w", err)
}
return nil
}
// WriteBytesWithTrackerCallBack writes data to socket
func WriteBytesWithTrackerCallBack(socket net.Conn, buffer []byte, size int, callback common.TrackerCallBack) error {
totalSizeToSend := len(buffer)
sizeLeft := totalSizeToSend
actualWrite := 0
for sizeLeft > 0 {
sizeWrite, err := socket.Write(buffer[actualWrite:size])
if err != nil {
return xerrors.Errorf("failed to write to socket: %w", err)
}
sizeLeft -= sizeWrite
actualWrite += sizeWrite
if callback != nil {
callback(int64(actualWrite), int64(totalSizeToSend))
}
}
return nil
}