reader.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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. buffer *buf.Buffer
  10. }
  11. func NewReader(reader buf.Reader) *Reader {
  12. return &Reader{
  13. reader: buf.ToBytesReader(reader),
  14. buffer: buf.NewLocal(1024),
  15. }
  16. }
  17. func (r *Reader) ReadMetadata() (*FrameMetadata, error) {
  18. b := r.buffer
  19. b.Clear()
  20. if err := b.AppendSupplier(buf.ReadFullFrom(r.reader, 2)); err != nil {
  21. return nil, err
  22. }
  23. metaLen := serial.BytesToUint16(b.Bytes())
  24. if metaLen > 512 {
  25. return nil, newError("invalid metalen ", metaLen).AtWarning()
  26. }
  27. b.Clear()
  28. if err := b.AppendSupplier(buf.ReadFullFrom(r.reader, int(metaLen))); err != nil {
  29. return nil, err
  30. }
  31. return ReadFrameFrom(b.Bytes())
  32. }
  33. func (r *Reader) Read() (buf.MultiBuffer, error) {
  34. if err := r.buffer.Reset(buf.ReadFullFrom(r.reader, 2)); err != nil {
  35. return nil, err
  36. }
  37. dataLen := int(serial.BytesToUint16(r.buffer.Bytes()))
  38. mb := buf.NewMultiBuffer()
  39. for dataLen > 0 {
  40. readLen := buf.Size
  41. if dataLen < readLen {
  42. readLen = dataLen
  43. }
  44. b := buf.New()
  45. if err := b.AppendSupplier(buf.ReadFullFrom(r.reader, readLen)); err != nil {
  46. mb.Release()
  47. return nil, err
  48. }
  49. dataLen -= readLen
  50. mb.Append(b)
  51. }
  52. return mb, nil
  53. }