properly propagate Reader errors

pull/2041/head
ghost 2019-11-22 10:11:23 +08:00
parent e52d3fa90b
commit 8da0a53845
3 changed files with 8 additions and 14 deletions

View File

@ -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.

View File

@ -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) n, err := b.ReadFrom(r)
if err != nil { if n > 0 {
b.Release() return b, err
return nil, 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 MultiBuffer{b}, err
return nil, err
}
return MultiBuffer{b}, nil
} }
// PacketReader is a Reader that read one Buffer every time. // PacketReader is a Reader that read one Buffer every time.

View File

@ -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()