reader.go 1.9 KB

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