Skip to content

Commit 139798c

Browse files
authored
Fill buffer, even on short reads (#16)
Delay EOF manually.
1 parent 2c89e53 commit 139798c

File tree

1 file changed

+26
-1
lines changed

1 file changed

+26
-1
lines changed

reader.go

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -312,10 +312,25 @@ func (a *reader) initBuffers(rd io.Reader, buffers [][]byte, size int) {
312312
// Ensure that when we exit this is signalled.
313313
defer close(a.exited)
314314
defer close(a.ready)
315+
var atEOF bool
315316
for {
316317
select {
317318
case b := <-a.reuse:
319+
if atEOF {
320+
// Return delay
321+
b.err = io.EOF
322+
b.buf = b.buf[:0]
323+
b.offset = 0
324+
a.ready <- b
325+
return
326+
}
318327
err := b.read(a.in)
328+
// Delay EOF if we have content.
329+
if err == io.EOF && len(b.buf) > 0 {
330+
atEOF = true
331+
err = nil
332+
b.err = nil
333+
}
319334
a.ready <- b
320335
if err != nil {
321336
return
@@ -488,8 +503,18 @@ func (b *buffer) read(rd io.Reader) (err error) {
488503
b.err = err
489504
}
490505
}()
506+
491507
var n int
492-
n, b.err = rd.Read(b.buf[0:b.size])
508+
buf := b.buf[0:b.size]
509+
for n < b.size {
510+
n2, err := rd.Read(buf)
511+
n += n2
512+
if err != nil {
513+
b.err = err
514+
break
515+
}
516+
buf = buf[n2:]
517+
}
493518
b.buf = b.buf[0:n]
494519
b.offset = 0
495520
return b.err

0 commit comments

Comments
 (0)