reader.go 1.3 KB

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