@@ -15,6 +15,7 @@ type ReadBuffer struct {
15
15
index int
16
16
len int
17
17
src io.Reader
18
+ finished bool
18
19
}
19
20
20
21
func New (stream io.Reader ) ReadBuffer {
@@ -24,30 +25,44 @@ func New(stream io.Reader) ReadBuffer {
24
25
}
25
26
}
26
27
27
- func (r * ReadBuffer ) Get (n int ) ([]byte , error ) {
28
- if r .len - r .index >= n {
29
- res := r .buf [r .index : r .index + n ]
30
- r .index += n
31
- return res , nil
28
+ func (r * ReadBuffer ) Get (n int ) (res []byte , err error ) {
29
+ n , res = r .appendFromBuffer (n , res )
30
+ if n == 0 {
31
+ return
32
32
}
33
- res := make ([]byte , r .len - r .index )
34
- copy (res , r .buf [r .index :r .len ])
35
- r .index = r .len
36
- n -= len (res )
37
- var err error
38
33
for err = r .load (); err == nil ; err = r .load () {
39
- if r .len - r .index >= n {
40
- res = append (res , r .buf [r .index :r .index + n ]... )
41
- r .index += n
42
- return res , nil
34
+ n , res = r .appendFromBuffer (n , res )
35
+ if n == 0 {
36
+ return
43
37
}
44
-
45
- res = append (res , r .buf [r .index :r .len ]... )
46
- n -= r .len - r .index
47
- r .index = r .len
48
38
time .Sleep (readTimeout )
49
39
}
50
- return res , err
40
+ if n == 0 {
41
+ return
42
+ }
43
+ if err == io .EOF {
44
+ r .finished = true
45
+ err = nil
46
+ } else {
47
+ return nil , err
48
+ }
49
+ n , res = r .appendFromBuffer (n , res )
50
+ if n > 0 && r .finished {
51
+ return res , io .EOF
52
+ }
53
+ return
54
+ }
55
+
56
+ func (r * ReadBuffer ) appendFromBuffer (n int , dst []byte ) (int , []byte ) {
57
+ length := r .len - r .index
58
+ if length >= n {
59
+ res := append (dst , r .buf [r .index :r .index + n ]... )
60
+ r .index += n
61
+ return 0 , res
62
+ }
63
+ res := append (dst , r .buf [r .index :r .len ]... )
64
+ r .index = r .len
65
+ return n - length , res
51
66
}
52
67
53
68
func (r * ReadBuffer ) load () error {
0 commit comments