reader.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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. leftOver MultiBuffer
  33. }
  34. func (r *bufferToBytesReader) Read(b []byte) (int, error) {
  35. if r.leftOver != nil {
  36. nBytes, _ := r.leftOver.Read(b)
  37. if r.leftOver.IsEmpty() {
  38. r.leftOver.Release()
  39. r.leftOver = nil
  40. }
  41. return nBytes, nil
  42. }
  43. mb, err := r.stream.Read()
  44. if err != nil {
  45. return 0, err
  46. }
  47. nBytes, _ := mb.Read(b)
  48. if !mb.IsEmpty() {
  49. r.leftOver = mb
  50. }
  51. return nBytes, nil
  52. }
  53. func (r *bufferToBytesReader) ReadMultiBuffer() (MultiBuffer, error) {
  54. if r.leftOver != nil {
  55. mb := r.leftOver
  56. r.leftOver = nil
  57. return mb, nil
  58. }
  59. return r.stream.Read()
  60. }
  61. func (r *bufferToBytesReader) writeToInternal(writer io.Writer) (int64, error) {
  62. mbWriter := NewWriter(writer)
  63. totalBytes := int64(0)
  64. if r.leftOver != nil {
  65. if err := mbWriter.Write(r.leftOver); err != nil {
  66. return 0, err
  67. }
  68. totalBytes += int64(r.leftOver.Len())
  69. }
  70. for {
  71. mb, err := r.stream.Read()
  72. if err != nil {
  73. return totalBytes, err
  74. }
  75. totalBytes += int64(mb.Len())
  76. if err := mbWriter.Write(mb); err != nil {
  77. return totalBytes, err
  78. }
  79. }
  80. }
  81. func (r *bufferToBytesReader) WriteTo(writer io.Writer) (int64, error) {
  82. nBytes, err := r.writeToInternal(writer)
  83. if errors.Cause(err) == io.EOF {
  84. return nBytes, nil
  85. }
  86. return nBytes, err
  87. }