|  | @@ -4,7 +4,6 @@ import (
 | 
	
		
			
				|  |  |  	"io"
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	"v2ray.com/core/common"
 | 
	
		
			
				|  |  | -	"v2ray.com/core/common/bytespool"
 | 
	
		
			
				|  |  |  	"v2ray.com/core/common/errors"
 | 
	
		
			
				|  |  |  )
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -24,66 +23,6 @@ func readOne(r io.Reader) (*Buffer, error) {
 | 
	
		
			
				|  |  |  	return nil, newError("Reader returns too many empty payloads.")
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -const largeSize = 128 * 1024
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -// BytesToBufferReader is a Reader that adjusts its reading speed automatically.
 | 
	
		
			
				|  |  | -type BytesToBufferReader struct {
 | 
	
		
			
				|  |  | -	io.Reader
 | 
	
		
			
				|  |  | -	buffer []byte
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -// NewBytesToBufferReader returns a new BytesToBufferReader.
 | 
	
		
			
				|  |  | -func NewBytesToBufferReader(reader io.Reader) Reader {
 | 
	
		
			
				|  |  | -	return &BytesToBufferReader{
 | 
	
		
			
				|  |  | -		Reader: reader,
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -func (r *BytesToBufferReader) readSmall() (MultiBuffer, error) {
 | 
	
		
			
				|  |  | -	b, err := readOne(r.Reader)
 | 
	
		
			
				|  |  | -	if err != nil {
 | 
	
		
			
				|  |  | -		return nil, err
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	if b.IsFull() && largeSize > Size {
 | 
	
		
			
				|  |  | -		r.buffer = bytespool.Alloc(Size + 100)
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	return NewMultiBufferValue(b), nil
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -func (r *BytesToBufferReader) freeBuffer() {
 | 
	
		
			
				|  |  | -	bytespool.Free(r.buffer)
 | 
	
		
			
				|  |  | -	r.buffer = nil
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -// ReadMultiBuffer implements Reader.
 | 
	
		
			
				|  |  | -func (r *BytesToBufferReader) ReadMultiBuffer() (MultiBuffer, error) {
 | 
	
		
			
				|  |  | -	if r.buffer == nil || largeSize == Size {
 | 
	
		
			
				|  |  | -		return r.readSmall()
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	nBytes, err := r.Reader.Read(r.buffer)
 | 
	
		
			
				|  |  | -	if nBytes > 0 {
 | 
	
		
			
				|  |  | -		mb := NewMultiBufferCap(int32(nBytes/Size) + 1)
 | 
	
		
			
				|  |  | -		common.Must2(mb.Write(r.buffer[:nBytes]))
 | 
	
		
			
				|  |  | -		if nBytes == len(r.buffer) && nBytes < int(largeSize) {
 | 
	
		
			
				|  |  | -			bytespool.Free(r.buffer)
 | 
	
		
			
				|  |  | -			r.buffer = bytespool.Alloc(int32(nBytes) + 100)
 | 
	
		
			
				|  |  | -		} else if nBytes < Size {
 | 
	
		
			
				|  |  | -			r.freeBuffer()
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -		return mb, nil
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	r.freeBuffer()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	if err != nil {
 | 
	
		
			
				|  |  | -		return nil, err
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	// Read() returns empty payload and nil err. We don't expect this to happen, but just in case.
 | 
	
		
			
				|  |  | -	return r.readSmall()
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  // BufferedReader is a Reader that keeps its internal buffer.
 | 
	
		
			
				|  |  |  type BufferedReader struct {
 | 
	
		
			
				|  |  |  	// Reader is the underlying reader to be read from
 |