|  | @@ -1,6 +1,11 @@
 | 
											
												
													
														|  |  package buf
 |  |  package buf
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -import "net"
 |  | 
 | 
											
												
													
														|  | 
 |  | +import (
 | 
											
												
													
														|  | 
 |  | +	"io"
 | 
											
												
													
														|  | 
 |  | +	"net"
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	"v2ray.com/core/common/errors"
 | 
											
												
													
														|  | 
 |  | +)
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  type MultiBufferWriter interface {
 |  |  type MultiBufferWriter interface {
 | 
											
												
													
														|  |  	WriteMultiBuffer(MultiBuffer) error
 |  |  	WriteMultiBuffer(MultiBuffer) error
 | 
											
										
											
												
													
														|  | @@ -10,6 +15,36 @@ type MultiBufferReader interface {
 | 
											
												
													
														|  |  	ReadMultiBuffer() (MultiBuffer, error)
 |  |  	ReadMultiBuffer() (MultiBuffer, error)
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +func ReadAllToMultiBuffer(reader io.Reader) (MultiBuffer, error) {
 | 
											
												
													
														|  | 
 |  | +	mb := NewMultiBuffer()
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	for {
 | 
											
												
													
														|  | 
 |  | +		b := New()
 | 
											
												
													
														|  | 
 |  | +		err := b.AppendSupplier(ReadFrom(reader))
 | 
											
												
													
														|  | 
 |  | +		if !b.IsEmpty() {
 | 
											
												
													
														|  | 
 |  | +			mb.Append(b)
 | 
											
												
													
														|  | 
 |  | +		}
 | 
											
												
													
														|  | 
 |  | +		if err != nil {
 | 
											
												
													
														|  | 
 |  | +			if errors.Cause(err) == io.EOF {
 | 
											
												
													
														|  | 
 |  | +				return mb, nil
 | 
											
												
													
														|  | 
 |  | +			}
 | 
											
												
													
														|  | 
 |  | +			mb.Release()
 | 
											
												
													
														|  | 
 |  | +			return nil, err
 | 
											
												
													
														|  | 
 |  | +		}
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +func ReadAllToBytes(reader io.Reader) ([]byte, error) {
 | 
											
												
													
														|  | 
 |  | +	mb, err := ReadAllToMultiBuffer(reader)
 | 
											
												
													
														|  | 
 |  | +	if err != nil {
 | 
											
												
													
														|  | 
 |  | +		return nil, err
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +	b := make([]byte, mb.Len())
 | 
											
												
													
														|  | 
 |  | +	mb.Read(b)
 | 
											
												
													
														|  | 
 |  | +	mb.Release()
 | 
											
												
													
														|  | 
 |  | +	return b, nil
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |  // MultiBuffer is a list of Buffers. The order of Buffer matters.
 |  |  // MultiBuffer is a list of Buffers. The order of Buffer matters.
 | 
											
												
													
														|  |  type MultiBuffer []*Buffer
 |  |  type MultiBuffer []*Buffer
 | 
											
												
													
														|  |  
 |  |  
 |