reader.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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. leftOver int
  11. }
  12. func NewReader(reader buf.Reader) *Reader {
  13. return &Reader{
  14. reader: buf.ToBytesReader(reader),
  15. buffer: buf.NewLocal(1024),
  16. leftOver: -1,
  17. }
  18. }
  19. func (r *Reader) ReadMetadata() (*FrameMetadata, error) {
  20. r.leftOver = -1
  21. b := r.buffer
  22. b.Clear()
  23. if err := b.AppendSupplier(buf.ReadFullFrom(r.reader, 2)); err != nil {
  24. return nil, err
  25. }
  26. metaLen := serial.BytesToUint16(b.Bytes())
  27. if metaLen > 512 {
  28. return nil, newError("invalid metalen ", metaLen).AtWarning()
  29. }
  30. b.Clear()
  31. if err := b.AppendSupplier(buf.ReadFullFrom(r.reader, int(metaLen))); err != nil {
  32. return nil, err
  33. }
  34. return ReadFrameFrom(b.Bytes())
  35. }
  36. func (r *Reader) readSize() error {
  37. if err := r.buffer.Reset(buf.ReadFullFrom(r.reader, 2)); err != nil {
  38. return err
  39. }
  40. r.leftOver = int(serial.BytesToUint16(r.buffer.Bytes()))
  41. return nil
  42. }
  43. func (r *Reader) Read() (buf.MultiBuffer, error) {
  44. if r.leftOver == 0 {
  45. r.leftOver = -1
  46. return nil, io.EOF
  47. }
  48. if r.leftOver == -1 {
  49. if err := r.readSize(); err != nil {
  50. return nil, err
  51. }
  52. }
  53. mb := buf.NewMultiBuffer()
  54. for r.leftOver > 0 {
  55. readLen := buf.Size
  56. if r.leftOver < readLen {
  57. readLen = r.leftOver
  58. }
  59. b := buf.New()
  60. if err := b.AppendSupplier(func(bb []byte) (int, error) {
  61. return r.reader.Read(bb[:readLen])
  62. }); err != nil {
  63. mb.Release()
  64. return nil, err
  65. }
  66. r.leftOver -= b.Len()
  67. mb.Append(b)
  68. if b.Len() < readLen {
  69. break
  70. }
  71. }
  72. return mb, nil
  73. }