Browse Source

simplify chunk stream reader

Darien Raymond 8 years ago
parent
commit
0481e6fa42
1 changed files with 9 additions and 47 deletions
  1. 9 47
      common/crypto/chunk.go

+ 9 - 47
common/crypto/chunk.go

@@ -59,45 +59,24 @@ func (p *AEADChunkSizeParser) Decode(b []byte) (uint16, error) {
 
 type ChunkStreamReader struct {
 	sizeDecoder ChunkSizeDecoder
-	reader      buf.Reader
+	reader      *buf.BufferedReader
 
 	buffer       []byte
-	leftOver     buf.MultiBuffer
 	leftOverSize int
 }
 
 func NewChunkStreamReader(sizeDecoder ChunkSizeDecoder, reader io.Reader) *ChunkStreamReader {
 	return &ChunkStreamReader{
 		sizeDecoder: sizeDecoder,
-		reader:      buf.NewReader(reader),
+		reader:      buf.NewBufferedReader(buf.NewReader(reader)),
 		buffer:      make([]byte, sizeDecoder.SizeBytes()),
-		leftOver:    buf.NewMultiBufferCap(16),
 	}
 }
 
-func (r *ChunkStreamReader) readAtLeast(size int) error {
-	mb := r.leftOver
-	r.leftOver = nil
-	for mb.Len() < size {
-		extra, err := r.reader.ReadMultiBuffer()
-		if err != nil {
-			mb.Release()
-			return err
-		}
-		mb.AppendMulti(extra)
-	}
-	r.leftOver = mb
-
-	return nil
-}
-
 func (r *ChunkStreamReader) readSize() (uint16, error) {
-	if r.sizeDecoder.SizeBytes() > r.leftOver.Len() {
-		if err := r.readAtLeast(r.sizeDecoder.SizeBytes() - r.leftOver.Len()); err != nil {
-			return 0, err
-		}
+	if _, err := io.ReadFull(r.reader, r.buffer); err != nil {
+		return 0, err
 	}
-	common.Must2(io.ReadFull(&r.leftOver, r.buffer))
 	return r.sizeDecoder.Decode(r.buffer)
 }
 
@@ -113,31 +92,14 @@ func (r *ChunkStreamReader) ReadMultiBuffer() (buf.MultiBuffer, error) {
 		}
 		size = int(nextSize)
 	}
+	r.leftOverSize = size
 
-	if r.leftOver.IsEmpty() {
-		if err := r.readAtLeast(1); err != nil {
-			return nil, err
-		}
-	}
-
-	leftOverLen := r.leftOver.Len()
-	if size >= leftOverLen {
-		mb := r.leftOver
-		r.leftOverSize = size - leftOverLen
-		r.leftOver = nil
+	mb, err := r.reader.ReadAtMost(size)
+	if !mb.IsEmpty() {
+		r.leftOverSize -= mb.Len()
 		return mb, nil
 	}
-
-	mb := r.leftOver.SliceBySize(size)
-	mbLen := mb.Len()
-	if mbLen != size {
-		b := buf.New()
-		common.Must(b.Reset(buf.ReadFullFrom(&r.leftOver, size-mbLen)))
-		mb.Append(b)
-	}
-	r.leftOverSize = 0
-
-	return mb, nil
+	return nil, err
 }
 
 type ChunkStreamWriter struct {