|
@@ -68,12 +68,19 @@ type ChunkStreamReader struct {
|
|
|
|
|
|
|
|
buffer []byte
|
|
buffer []byte
|
|
|
leftOverSize int32
|
|
leftOverSize int32
|
|
|
|
|
+ maxNumChunk uint32
|
|
|
|
|
+ numChunk uint32
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func NewChunkStreamReader(sizeDecoder ChunkSizeDecoder, reader io.Reader) *ChunkStreamReader {
|
|
func NewChunkStreamReader(sizeDecoder ChunkSizeDecoder, reader io.Reader) *ChunkStreamReader {
|
|
|
|
|
+ return NewChunkStreamReaderWithChunkCount(sizeDecoder, reader, 0)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func NewChunkStreamReaderWithChunkCount(sizeDecoder ChunkSizeDecoder, reader io.Reader, maxNumChunk uint32) *ChunkStreamReader {
|
|
|
r := &ChunkStreamReader{
|
|
r := &ChunkStreamReader{
|
|
|
sizeDecoder: sizeDecoder,
|
|
sizeDecoder: sizeDecoder,
|
|
|
buffer: make([]byte, sizeDecoder.SizeBytes()),
|
|
buffer: make([]byte, sizeDecoder.SizeBytes()),
|
|
|
|
|
+ maxNumChunk: maxNumChunk,
|
|
|
}
|
|
}
|
|
|
if breader, ok := reader.(*buf.BufferedReader); ok {
|
|
if breader, ok := reader.(*buf.BufferedReader); ok {
|
|
|
r.reader = breader
|
|
r.reader = breader
|
|
@@ -94,6 +101,10 @@ func (r *ChunkStreamReader) readSize() (uint16, error) {
|
|
|
func (r *ChunkStreamReader) ReadMultiBuffer() (buf.MultiBuffer, error) {
|
|
func (r *ChunkStreamReader) ReadMultiBuffer() (buf.MultiBuffer, error) {
|
|
|
size := r.leftOverSize
|
|
size := r.leftOverSize
|
|
|
if size == 0 {
|
|
if size == 0 {
|
|
|
|
|
+ r.numChunk++
|
|
|
|
|
+ if r.maxNumChunk > 0 && r.numChunk > r.maxNumChunk {
|
|
|
|
|
+ return nil, io.EOF
|
|
|
|
|
+ }
|
|
|
nextSize, err := r.readSize()
|
|
nextSize, err := r.readSize()
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
return nil, err
|
|
return nil, err
|