reader.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. package buf
  2. import (
  3. "io"
  4. "v2ray.com/core/common/errors"
  5. )
  6. // BytesToBufferReader is a Reader that adjusts its reading speed automatically.
  7. type BytesToBufferReader struct {
  8. reader io.Reader
  9. buffer []byte
  10. }
  11. func NewBytesToBufferReader(reader io.Reader) Reader {
  12. return &BytesToBufferReader{
  13. reader: reader,
  14. }
  15. }
  16. func (r *BytesToBufferReader) readSmall() (MultiBuffer, error) {
  17. b := New()
  18. if err := b.Reset(ReadFrom(r.reader)); err != nil {
  19. b.Release()
  20. return nil, err
  21. }
  22. if b.IsFull() {
  23. r.buffer = make([]byte, 32*1024)
  24. }
  25. return NewMultiBufferValue(b), nil
  26. }
  27. // Read implements Reader.Read().
  28. func (r *BytesToBufferReader) Read() (MultiBuffer, error) {
  29. if r.buffer == nil {
  30. return r.readSmall()
  31. }
  32. nBytes, err := r.reader.Read(r.buffer)
  33. if err != nil {
  34. return nil, err
  35. }
  36. mb := NewMultiBufferCap(nBytes/Size + 1)
  37. mb.Write(r.buffer[:nBytes])
  38. return mb, nil
  39. }
  40. type readerAdpater struct {
  41. MultiBufferReader
  42. }
  43. func (r *readerAdpater) Read() (MultiBuffer, error) {
  44. return r.ReadMultiBuffer()
  45. }
  46. type bufferToBytesReader struct {
  47. stream Reader
  48. leftOver MultiBuffer
  49. }
  50. func (r *bufferToBytesReader) Read(b []byte) (int, error) {
  51. if r.leftOver != nil {
  52. nBytes, _ := r.leftOver.Read(b)
  53. if r.leftOver.IsEmpty() {
  54. r.leftOver.Release()
  55. r.leftOver = nil
  56. }
  57. return nBytes, nil
  58. }
  59. mb, err := r.stream.Read()
  60. if err != nil {
  61. return 0, err
  62. }
  63. nBytes, _ := mb.Read(b)
  64. if !mb.IsEmpty() {
  65. r.leftOver = mb
  66. }
  67. return nBytes, nil
  68. }
  69. func (r *bufferToBytesReader) ReadMultiBuffer() (MultiBuffer, error) {
  70. if r.leftOver != nil {
  71. mb := r.leftOver
  72. r.leftOver = nil
  73. return mb, nil
  74. }
  75. return r.stream.Read()
  76. }
  77. func (r *bufferToBytesReader) writeToInternal(writer io.Writer) (int64, error) {
  78. mbWriter := NewWriter(writer)
  79. totalBytes := int64(0)
  80. if r.leftOver != nil {
  81. totalBytes += int64(r.leftOver.Len())
  82. if err := mbWriter.Write(r.leftOver); err != nil {
  83. return 0, err
  84. }
  85. }
  86. for {
  87. mb, err := r.stream.Read()
  88. if err != nil {
  89. return totalBytes, err
  90. }
  91. totalBytes += int64(mb.Len())
  92. if err := mbWriter.Write(mb); err != nil {
  93. return totalBytes, err
  94. }
  95. }
  96. }
  97. func (r *bufferToBytesReader) WriteTo(writer io.Writer) (int64, error) {
  98. nBytes, err := r.writeToInternal(writer)
  99. if errors.Cause(err) == io.EOF {
  100. return nBytes, nil
  101. }
  102. return nBytes, err
  103. }