Browse Source

Merge pull request #2041 from mellow-io/fix-reader

properly propagate Reader errors
Kslr 6 years ago
parent
commit
ec9cf059e8
3 changed files with 8 additions and 14 deletions
  1. 1 1
      common/buf/buffer.go
  2. 6 9
      common/buf/reader.go
  3. 1 4
      common/buf/readv_reader.go

+ 1 - 1
common/buf/buffer.go

@@ -131,7 +131,7 @@ func (b *Buffer) IsEmpty() bool {
 
 
 // IsFull returns true if the buffer has no more room to grow.
 // IsFull returns true if the buffer has no more room to grow.
 func (b *Buffer) IsFull() bool {
 func (b *Buffer) IsFull() bool {
-	return b.end == int32(len(b.v))
+	return b != nil && b.end == int32(len(b.v))
 }
 }
 
 
 // Write implements Write method in io.Writer.
 // Write implements Write method in io.Writer.

+ 6 - 9
common/buf/reader.go

@@ -27,12 +27,12 @@ func readOneUDP(r io.Reader) (*Buffer, error) {
 // ReadBuffer reads a Buffer from the given reader.
 // ReadBuffer reads a Buffer from the given reader.
 func ReadBuffer(r io.Reader) (*Buffer, error) {
 func ReadBuffer(r io.Reader) (*Buffer, error) {
 	b := New()
 	b := New()
-	_, err := b.ReadFrom(r)
-	if err != nil {
-		b.Release()
-		return nil, err
+	n, err := b.ReadFrom(r)
+	if n > 0 {
+		return b, err
 	}
 	}
-	return b, nil
+	b.Release()
+	return nil, err
 }
 }
 
 
 // BufferedReader is a Reader that keeps its internal buffer.
 // BufferedReader is a Reader that keeps its internal buffer.
@@ -156,10 +156,7 @@ type SingleReader struct {
 // ReadMultiBuffer implements Reader.
 // ReadMultiBuffer implements Reader.
 func (r *SingleReader) ReadMultiBuffer() (MultiBuffer, error) {
 func (r *SingleReader) ReadMultiBuffer() (MultiBuffer, error) {
 	b, err := ReadBuffer(r.Reader)
 	b, err := ReadBuffer(r.Reader)
-	if err != nil {
-		return nil, err
-	}
-	return MultiBuffer{b}, nil
+	return MultiBuffer{b}, err
 }
 }
 
 
 // PacketReader is a Reader that read one Buffer every time.
 // PacketReader is a Reader that read one Buffer every time.

+ 1 - 4
common/buf/readv_reader.go

@@ -120,13 +120,10 @@ func (r *ReadVReader) readMulti() (MultiBuffer, error) {
 func (r *ReadVReader) ReadMultiBuffer() (MultiBuffer, error) {
 func (r *ReadVReader) ReadMultiBuffer() (MultiBuffer, error) {
 	if r.alloc.Current() == 1 {
 	if r.alloc.Current() == 1 {
 		b, err := ReadBuffer(r.Reader)
 		b, err := ReadBuffer(r.Reader)
-		if err != nil {
-			return nil, err
-		}
 		if b.IsFull() {
 		if b.IsFull() {
 			r.alloc.Adjust(1)
 			r.alloc.Adjust(1)
 		}
 		}
-		return MultiBuffer{b}, nil
+		return MultiBuffer{b}, err
 	}
 	}
 
 
 	mb, err := r.readMulti()
 	mb, err := r.readMulti()