reader.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. package mux
  2. import (
  3. "io"
  4. "v2ray.com/core/common/buf"
  5. "v2ray.com/core/common/serial"
  6. )
  7. type MetadataReader struct {
  8. reader io.Reader
  9. buffer []byte
  10. }
  11. func NewMetadataReader(reader io.Reader) *MetadataReader {
  12. return &MetadataReader{
  13. reader: reader,
  14. buffer: make([]byte, 1024),
  15. }
  16. }
  17. func (r *MetadataReader) Read() (*FrameMetadata, error) {
  18. metaLen, err := serial.ReadUint16(r.reader)
  19. if err != nil {
  20. return nil, err
  21. }
  22. if metaLen > 512 {
  23. return nil, newError("invalid metalen ", metaLen).AtWarning()
  24. }
  25. if _, err := io.ReadFull(r.reader, r.buffer[:metaLen]); err != nil {
  26. return nil, err
  27. }
  28. return ReadFrameFrom(r.buffer)
  29. }
  30. type PacketReader struct {
  31. reader io.Reader
  32. eof bool
  33. }
  34. func NewPacketReader(reader io.Reader) *PacketReader {
  35. return &PacketReader{
  36. reader: reader,
  37. eof: false,
  38. }
  39. }
  40. func (r *PacketReader) Read() (buf.MultiBuffer, error) {
  41. if r.eof {
  42. return nil, io.EOF
  43. }
  44. size, err := serial.ReadUint16(r.reader)
  45. if err != nil {
  46. return nil, err
  47. }
  48. var b *buf.Buffer
  49. if size <= buf.Size {
  50. b = buf.New()
  51. } else {
  52. b = buf.NewLocal(int(size))
  53. }
  54. if err := b.AppendSupplier(buf.ReadFullFrom(r.reader, int(size))); err != nil {
  55. b.Release()
  56. return nil, err
  57. }
  58. r.eof = true
  59. return buf.NewMultiBufferValue(b), nil
  60. }
  61. type StreamReader struct {
  62. reader io.Reader
  63. leftOver int
  64. }
  65. func NewStreamReader(reader io.Reader) *StreamReader {
  66. return &StreamReader{
  67. reader: reader,
  68. leftOver: -1,
  69. }
  70. }
  71. func (r *StreamReader) Read() (buf.MultiBuffer, error) {
  72. if r.leftOver == 0 {
  73. r.leftOver = -1
  74. return nil, io.EOF
  75. }
  76. if r.leftOver == -1 {
  77. size, err := serial.ReadUint16(r.reader)
  78. if err != nil {
  79. return nil, err
  80. }
  81. r.leftOver = int(size)
  82. }
  83. mb := buf.NewMultiBuffer()
  84. for r.leftOver > 0 {
  85. readLen := buf.Size
  86. if r.leftOver < readLen {
  87. readLen = r.leftOver
  88. }
  89. b := buf.New()
  90. if err := b.AppendSupplier(func(bb []byte) (int, error) {
  91. return r.reader.Read(bb[:readLen])
  92. }); err != nil {
  93. mb.Release()
  94. return nil, err
  95. }
  96. r.leftOver -= b.Len()
  97. mb.Append(b)
  98. if b.Len() < readLen {
  99. break
  100. }
  101. }
  102. return mb, nil
  103. }