reader.go 1.3 KB

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