reader.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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. type readerAdpater struct {
  25. MultiBufferReader
  26. }
  27. func (r *readerAdpater) Read() (MultiBuffer, error) {
  28. return r.ReadMultiBuffer()
  29. }
  30. type bufferToBytesReader struct {
  31. stream Reader
  32. current MultiBuffer
  33. err error
  34. }
  35. // fill fills in the internal buffer.
  36. func (r *bufferToBytesReader) fill() {
  37. b, err := r.stream.Read()
  38. if err != nil {
  39. r.err = err
  40. return
  41. }
  42. r.current = b
  43. }
  44. func (r *bufferToBytesReader) Read(b []byte) (int, error) {
  45. if r.err != nil {
  46. return 0, r.err
  47. }
  48. if r.current == nil {
  49. r.fill()
  50. if r.err != nil {
  51. return 0, r.err
  52. }
  53. }
  54. nBytes, err := r.current.Read(b)
  55. if r.current.IsEmpty() {
  56. r.current.Release()
  57. r.current = nil
  58. }
  59. return nBytes, err
  60. }
  61. func (r *bufferToBytesReader) ReadMultiBuffer() (MultiBuffer, error) {
  62. if r.err != nil {
  63. return nil, r.err
  64. }
  65. if r.current == nil {
  66. r.fill()
  67. if r.err != nil {
  68. return nil, r.err
  69. }
  70. }
  71. b := r.current
  72. r.current = nil
  73. return b, nil
  74. }
  75. func (r *bufferToBytesReader) writeToInternal(writer io.Writer) (int64, error) {
  76. if r.err != nil {
  77. return 0, r.err
  78. }
  79. mbWriter := NewWriter(writer)
  80. totalBytes := int64(0)
  81. for {
  82. if r.current == nil {
  83. r.fill()
  84. if r.err != nil {
  85. return totalBytes, r.err
  86. }
  87. }
  88. totalBytes += int64(r.current.Len())
  89. if err := mbWriter.Write(r.current); err != nil {
  90. return totalBytes, err
  91. }
  92. r.current = nil
  93. }
  94. }
  95. func (r *bufferToBytesReader) WriteTo(writer io.Writer) (int64, error) {
  96. nBytes, err := r.writeToInternal(writer)
  97. if errors.Cause(err) == io.EOF {
  98. return nBytes, nil
  99. }
  100. return nBytes, err
  101. }