reader.go 1.4 KB

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