|  | @@ -1,6 +1,10 @@
 | 
											
												
													
														|  |  package buf
 |  |  package buf
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -import "io"
 |  | 
 | 
											
												
													
														|  | 
 |  | +import (
 | 
											
												
													
														|  | 
 |  | +	"io"
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	"v2ray.com/core/common/errors"
 | 
											
												
													
														|  | 
 |  | +)
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  // BytesToBufferReader is a Reader that adjusts its reading speed automatically.
 |  |  // BytesToBufferReader is a Reader that adjusts its reading speed automatically.
 | 
											
												
													
														|  |  type BytesToBufferReader struct {
 |  |  type BytesToBufferReader struct {
 | 
											
										
											
												
													
														|  | @@ -9,20 +13,40 @@ type BytesToBufferReader struct {
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  // Read implements Reader.Read().
 |  |  // Read implements Reader.Read().
 | 
											
												
													
														|  | -func (v *BytesToBufferReader) Read() (MultiBuffer, error) {
 |  | 
 | 
											
												
													
														|  | -	if err := v.buffer.Reset(ReadFrom(v.reader)); err != nil {
 |  | 
 | 
											
												
													
														|  | 
 |  | +func (r *BytesToBufferReader) Read() (MultiBuffer, error) {
 | 
											
												
													
														|  | 
 |  | +	if err := r.buffer.Reset(ReadFrom(r.reader)); err != nil {
 | 
											
												
													
														|  |  		return nil, err
 |  |  		return nil, err
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  	mb := NewMultiBuffer()
 |  |  	mb := NewMultiBuffer()
 | 
											
												
													
														|  | -	for !v.buffer.IsEmpty() {
 |  | 
 | 
											
												
													
														|  | 
 |  | +	for !r.buffer.IsEmpty() {
 | 
											
												
													
														|  |  		b := New()
 |  |  		b := New()
 | 
											
												
													
														|  | -		b.AppendSupplier(ReadFrom(v.buffer))
 |  | 
 | 
											
												
													
														|  | 
 |  | +		b.AppendSupplier(ReadFrom(r.buffer))
 | 
											
												
													
														|  |  		mb.Append(b)
 |  |  		mb.Append(b)
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
												
													
														|  |  	return mb, nil
 |  |  	return mb, nil
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +func (r *BytesToBufferReader) WriteTo(writer io.Writer) (int64, error) {
 | 
											
												
													
														|  | 
 |  | +	totalBytes := int64(0)
 | 
											
												
													
														|  | 
 |  | +	eof := false
 | 
											
												
													
														|  | 
 |  | +	for !eof {
 | 
											
												
													
														|  | 
 |  | +		if err := r.buffer.Reset(ReadFrom(r.reader)); err != nil {
 | 
											
												
													
														|  | 
 |  | +			if errors.Cause(err) == io.EOF {
 | 
											
												
													
														|  | 
 |  | +				eof = true
 | 
											
												
													
														|  | 
 |  | +			} else {
 | 
											
												
													
														|  | 
 |  | +				return totalBytes, err
 | 
											
												
													
														|  | 
 |  | +			}
 | 
											
												
													
														|  | 
 |  | +		}
 | 
											
												
													
														|  | 
 |  | +		nBytes, err := writer.Write(r.buffer.Bytes())
 | 
											
												
													
														|  | 
 |  | +		totalBytes += int64(nBytes)
 | 
											
												
													
														|  | 
 |  | +		if err != nil {
 | 
											
												
													
														|  | 
 |  | +			return totalBytes, err
 | 
											
												
													
														|  | 
 |  | +		}
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +	return totalBytes, nil
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |  type readerAdpater struct {
 |  |  type readerAdpater struct {
 | 
											
												
													
														|  |  	MultiBufferReader
 |  |  	MultiBufferReader
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
										
											
												
													
														|  | @@ -38,45 +62,75 @@ type bufferToBytesReader struct {
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  // fill fills in the internal buffer.
 |  |  // fill fills in the internal buffer.
 | 
											
												
													
														|  | -func (v *bufferToBytesReader) fill() {
 |  | 
 | 
											
												
													
														|  | -	b, err := v.stream.Read()
 |  | 
 | 
											
												
													
														|  | 
 |  | +func (r *bufferToBytesReader) fill() {
 | 
											
												
													
														|  | 
 |  | +	b, err := r.stream.Read()
 | 
											
												
													
														|  |  	if err != nil {
 |  |  	if err != nil {
 | 
											
												
													
														|  | -		v.err = err
 |  | 
 | 
											
												
													
														|  | 
 |  | +		r.err = err
 | 
											
												
													
														|  |  		return
 |  |  		return
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
												
													
														|  | -	v.current = b
 |  | 
 | 
											
												
													
														|  | 
 |  | +	r.current = b
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -func (v *bufferToBytesReader) Read(b []byte) (int, error) {
 |  | 
 | 
											
												
													
														|  | -	if v.err != nil {
 |  | 
 | 
											
												
													
														|  | -		return 0, v.err
 |  | 
 | 
											
												
													
														|  | 
 |  | +func (r *bufferToBytesReader) Read(b []byte) (int, error) {
 | 
											
												
													
														|  | 
 |  | +	if r.err != nil {
 | 
											
												
													
														|  | 
 |  | +		return 0, r.err
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -	if v.current == nil {
 |  | 
 | 
											
												
													
														|  | -		v.fill()
 |  | 
 | 
											
												
													
														|  | -		if v.err != nil {
 |  | 
 | 
											
												
													
														|  | -			return 0, v.err
 |  | 
 | 
											
												
													
														|  | 
 |  | +	if r.current == nil {
 | 
											
												
													
														|  | 
 |  | +		r.fill()
 | 
											
												
													
														|  | 
 |  | +		if r.err != nil {
 | 
											
												
													
														|  | 
 |  | +			return 0, r.err
 | 
											
												
													
														|  |  		}
 |  |  		}
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
												
													
														|  | -	nBytes, err := v.current.Read(b)
 |  | 
 | 
											
												
													
														|  | -	if v.current.IsEmpty() {
 |  | 
 | 
											
												
													
														|  | -		v.current.Release()
 |  | 
 | 
											
												
													
														|  | -		v.current = nil
 |  | 
 | 
											
												
													
														|  | 
 |  | +	nBytes, err := r.current.Read(b)
 | 
											
												
													
														|  | 
 |  | +	if r.current.IsEmpty() {
 | 
											
												
													
														|  | 
 |  | +		r.current.Release()
 | 
											
												
													
														|  | 
 |  | +		r.current = nil
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
												
													
														|  |  	return nBytes, err
 |  |  	return nBytes, err
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -func (v *bufferToBytesReader) ReadMultiBuffer() (MultiBuffer, error) {
 |  | 
 | 
											
												
													
														|  | -	if v.err != nil {
 |  | 
 | 
											
												
													
														|  | -		return nil, v.err
 |  | 
 | 
											
												
													
														|  | 
 |  | +func (r *bufferToBytesReader) ReadMultiBuffer() (MultiBuffer, error) {
 | 
											
												
													
														|  | 
 |  | +	if r.err != nil {
 | 
											
												
													
														|  | 
 |  | +		return nil, r.err
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
												
													
														|  | -	if v.current == nil {
 |  | 
 | 
											
												
													
														|  | -		v.fill()
 |  | 
 | 
											
												
													
														|  | -		if v.err != nil {
 |  | 
 | 
											
												
													
														|  | -			return nil, v.err
 |  | 
 | 
											
												
													
														|  | 
 |  | +	if r.current == nil {
 | 
											
												
													
														|  | 
 |  | +		r.fill()
 | 
											
												
													
														|  | 
 |  | +		if r.err != nil {
 | 
											
												
													
														|  | 
 |  | +			return nil, r.err
 | 
											
												
													
														|  |  		}
 |  |  		}
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
												
													
														|  | -	b := v.current
 |  | 
 | 
											
												
													
														|  | -	v.current = nil
 |  | 
 | 
											
												
													
														|  | 
 |  | +	b := r.current
 | 
											
												
													
														|  | 
 |  | +	r.current = nil
 | 
											
												
													
														|  |  	return b, nil
 |  |  	return b, nil
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +func (r *bufferToBytesReader) writeToInternal(writer io.Writer) (int64, error) {
 | 
											
												
													
														|  | 
 |  | +	if r.err != nil {
 | 
											
												
													
														|  | 
 |  | +		return 0, r.err
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	mbWriter := NewWriter(writer)
 | 
											
												
													
														|  | 
 |  | +	totalBytes := int64(0)
 | 
											
												
													
														|  | 
 |  | +	for {
 | 
											
												
													
														|  | 
 |  | +		if r.current == nil {
 | 
											
												
													
														|  | 
 |  | +			r.fill()
 | 
											
												
													
														|  | 
 |  | +			if r.err != nil {
 | 
											
												
													
														|  | 
 |  | +				return totalBytes, r.err
 | 
											
												
													
														|  | 
 |  | +			}
 | 
											
												
													
														|  | 
 |  | +		}
 | 
											
												
													
														|  | 
 |  | +		totalBytes := int64(r.current.Len())
 | 
											
												
													
														|  | 
 |  | +		if err := mbWriter.Write(r.current); err != nil {
 | 
											
												
													
														|  | 
 |  | +			return totalBytes, err
 | 
											
												
													
														|  | 
 |  | +		}
 | 
											
												
													
														|  | 
 |  | +		r.current = nil
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +func (r *bufferToBytesReader) WriteTo(writer io.Writer) (int64, error) {
 | 
											
												
													
														|  | 
 |  | +	nBytes, err := r.writeToInternal(writer)
 | 
											
												
													
														|  | 
 |  | +	if errors.Cause(err) == io.EOF {
 | 
											
												
													
														|  | 
 |  | +		return nBytes, nil
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +	return nBytes, err
 | 
											
												
													
														|  | 
 |  | +}
 |