| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 | package muximport (	"io"	"v2ray.com/core/common/buf"	"v2ray.com/core/common/serial")type Reader struct {	reader   io.Reader	buffer   *buf.Buffer	leftOver int}func NewReader(reader buf.Reader) *Reader {	return &Reader{		reader:   buf.ToBytesReader(reader),		buffer:   buf.NewLocal(1024),		leftOver: -1,	}}func (r *Reader) ReadMetadata() (*FrameMetadata, error) {	r.leftOver = -1	b := r.buffer	b.Clear()	if err := b.AppendSupplier(buf.ReadFullFrom(r.reader, 2)); err != nil {		return nil, err	}	metaLen := serial.BytesToUint16(b.Bytes())	if metaLen > 512 {		return nil, newError("invalid metalen ", metaLen).AtWarning()	}	b.Clear()	if err := b.AppendSupplier(buf.ReadFullFrom(r.reader, int(metaLen))); err != nil {		return nil, err	}	return ReadFrameFrom(b.Bytes())}func (r *Reader) readSize() error {	if err := r.buffer.Reset(buf.ReadFullFrom(r.reader, 2)); err != nil {		return err	}	r.leftOver = int(serial.BytesToUint16(r.buffer.Bytes()))	return nil}func (r *Reader) Read() (buf.MultiBuffer, error) {	if r.leftOver == 0 {		r.leftOver = -1		return nil, io.EOF	}	if r.leftOver == -1 {		if err := r.readSize(); err != nil {			return nil, err		}	}	mb := buf.NewMultiBuffer()	for r.leftOver > 0 {		readLen := buf.Size		if r.leftOver < readLen {			readLen = r.leftOver		}		b := buf.New()		if err := b.AppendSupplier(func(bb []byte) (int, error) {			return r.reader.Read(bb[:readLen])		}); err != nil {			mb.Release()			return nil, err		}		r.leftOver -= b.Len()		mb.Append(b)		if b.Len() < readLen {			break		}	}	return mb, nil}
 |