reader.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  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. r.buffer.Clear()
  35. if err := r.buffer.AppendSupplier(buf.ReadFullFrom(r.reader, 2)); err != nil {
  36. return nil, err
  37. }
  38. dataLen := int(serial.BytesToUint16(r.buffer.Bytes()))
  39. mb := buf.NewMultiBuffer()
  40. for dataLen > 0 {
  41. b := buf.New()
  42. readLen := buf.Size
  43. if dataLen < readLen {
  44. readLen = dataLen
  45. }
  46. if err := b.AppendSupplier(buf.ReadFullFrom(r.reader, readLen)); err != nil {
  47. mb.Release()
  48. return nil, err
  49. }
  50. dataLen -= readLen
  51. mb.Append(b)
  52. }
  53. return mb, nil
  54. }