reader.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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 *Buffer
  10. }
  11. // Read implements Reader.Read().
  12. func (r *BytesToBufferReader) Read() (MultiBuffer, error) {
  13. if err := r.buffer.Reset(ReadFrom(r.reader)); err != nil {
  14. return nil, err
  15. }
  16. mb := NewMultiBuffer()
  17. for !r.buffer.IsEmpty() {
  18. b := New()
  19. b.AppendSupplier(ReadFrom(r.buffer))
  20. mb.Append(b)
  21. }
  22. return mb, nil
  23. }
  24. func (r *BytesToBufferReader) WriteTo(writer io.Writer) (int64, error) {
  25. totalBytes := int64(0)
  26. eof := false
  27. for !eof {
  28. if err := r.buffer.Reset(ReadFrom(r.reader)); err != nil {
  29. if errors.Cause(err) == io.EOF {
  30. eof = true
  31. } else {
  32. return totalBytes, err
  33. }
  34. }
  35. nBytes, err := writer.Write(r.buffer.Bytes())
  36. totalBytes += int64(nBytes)
  37. if err != nil {
  38. return totalBytes, err
  39. }
  40. }
  41. return totalBytes, nil
  42. }
  43. type readerAdpater struct {
  44. MultiBufferReader
  45. }
  46. func (r *readerAdpater) Read() (MultiBuffer, error) {
  47. return r.ReadMultiBuffer()
  48. }
  49. type bufferToBytesReader struct {
  50. stream Reader
  51. current MultiBuffer
  52. err error
  53. }
  54. // fill fills in the internal buffer.
  55. func (r *bufferToBytesReader) fill() {
  56. b, err := r.stream.Read()
  57. if err != nil {
  58. r.err = err
  59. return
  60. }
  61. r.current = b
  62. }
  63. func (r *bufferToBytesReader) Read(b []byte) (int, error) {
  64. if r.err != nil {
  65. return 0, r.err
  66. }
  67. if r.current == nil {
  68. r.fill()
  69. if r.err != nil {
  70. return 0, r.err
  71. }
  72. }
  73. nBytes, err := r.current.Read(b)
  74. if r.current.IsEmpty() {
  75. r.current.Release()
  76. r.current = nil
  77. }
  78. return nBytes, err
  79. }
  80. func (r *bufferToBytesReader) ReadMultiBuffer() (MultiBuffer, error) {
  81. if r.err != nil {
  82. return nil, r.err
  83. }
  84. if r.current == nil {
  85. r.fill()
  86. if r.err != nil {
  87. return nil, r.err
  88. }
  89. }
  90. b := r.current
  91. r.current = nil
  92. return b, nil
  93. }
  94. func (r *bufferToBytesReader) writeToInternal(writer io.Writer) (int64, error) {
  95. if r.err != nil {
  96. return 0, r.err
  97. }
  98. mbWriter := NewWriter(writer)
  99. totalBytes := int64(0)
  100. for {
  101. if r.current == nil {
  102. r.fill()
  103. if r.err != nil {
  104. return totalBytes, r.err
  105. }
  106. }
  107. totalBytes := int64(r.current.Len())
  108. if err := mbWriter.Write(r.current); err != nil {
  109. return totalBytes, err
  110. }
  111. r.current = nil
  112. }
  113. }
  114. func (r *bufferToBytesReader) WriteTo(writer io.Writer) (int64, error) {
  115. nBytes, err := r.writeToInternal(writer)
  116. if errors.Cause(err) == io.EOF {
  117. return nBytes, nil
  118. }
  119. return nBytes, err
  120. }