reader.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. package mux
  2. import "io"
  3. import "v2ray.com/core/common/buf"
  4. import "v2ray.com/core/common/serial"
  5. type muxReader struct {
  6. reader io.Reader
  7. remainingLength int
  8. buffer *buf.Buffer
  9. }
  10. func NewReader(reader buf.Reader) *muxReader {
  11. return &muxReader{
  12. reader: buf.NewBytesReader(reader),
  13. buffer: buf.NewLocal(1024),
  14. }
  15. }
  16. func (r *muxReader) ReadMetadata() (*FrameMetadata, error) {
  17. b := r.buffer
  18. b.Clear()
  19. if err := b.AppendSupplier(buf.ReadFullFrom(r.reader, 2)); err != nil {
  20. return nil, err
  21. }
  22. metaLen := serial.BytesToUint16(b.Bytes())
  23. b.Clear()
  24. if err := b.AppendSupplier(buf.ReadFullFrom(r.reader, int(metaLen))); err != nil {
  25. return nil, err
  26. }
  27. return ReadFrameFrom(b.Bytes())
  28. }
  29. func (r *muxReader) Read() (*buf.Buffer, bool, error) {
  30. b := buf.New()
  31. var dataLen int
  32. if r.remainingLength > 0 {
  33. dataLen = r.remainingLength
  34. r.remainingLength = 0
  35. } else {
  36. if err := b.AppendSupplier(buf.ReadFullFrom(r.reader, 2)); err != nil {
  37. return nil, false, err
  38. }
  39. dataLen = int(serial.BytesToUint16(b.Bytes()))
  40. b.Clear()
  41. }
  42. if dataLen > buf.Size {
  43. r.remainingLength = dataLen - buf.Size
  44. dataLen = buf.Size
  45. }
  46. if err := b.AppendSupplier(buf.ReadFullFrom(r.reader, dataLen)); err != nil {
  47. return nil, false, err
  48. }
  49. return b, (r.remainingLength > 0), nil
  50. }