reader.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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. // Read implements Reader.Read().
  12. func (r *BytesToBufferReader) Read() (MultiBuffer, error) {
  13. nBytes, err := r.reader.Read(r.buffer)
  14. if err != nil {
  15. return nil, err
  16. }
  17. mb := NewMultiBuffer()
  18. p := r.buffer[:nBytes]
  19. for len(p) > 0 {
  20. b := New()
  21. nBytes, _ := b.Write(p)
  22. mb.Append(b)
  23. p = p[nBytes:]
  24. }
  25. return mb, nil
  26. }
  27. type readerAdpater struct {
  28. MultiBufferReader
  29. }
  30. func (r *readerAdpater) Read() (MultiBuffer, error) {
  31. return r.ReadMultiBuffer()
  32. }
  33. type bufferToBytesReader struct {
  34. stream Reader
  35. leftOver MultiBuffer
  36. }
  37. func (r *bufferToBytesReader) Read(b []byte) (int, error) {
  38. if r.leftOver != nil {
  39. nBytes, _ := r.leftOver.Read(b)
  40. if r.leftOver.IsEmpty() {
  41. r.leftOver.Release()
  42. r.leftOver = nil
  43. }
  44. return nBytes, nil
  45. }
  46. mb, err := r.stream.Read()
  47. if err != nil {
  48. return 0, err
  49. }
  50. nBytes, _ := mb.Read(b)
  51. if !mb.IsEmpty() {
  52. r.leftOver = mb
  53. }
  54. return nBytes, nil
  55. }
  56. func (r *bufferToBytesReader) ReadMultiBuffer() (MultiBuffer, error) {
  57. if r.leftOver != nil {
  58. mb := r.leftOver
  59. r.leftOver = nil
  60. return mb, nil
  61. }
  62. return r.stream.Read()
  63. }
  64. func (r *bufferToBytesReader) writeToInternal(writer io.Writer) (int64, error) {
  65. mbWriter := NewWriter(writer)
  66. totalBytes := int64(0)
  67. if r.leftOver != nil {
  68. if err := mbWriter.Write(r.leftOver); err != nil {
  69. return 0, err
  70. }
  71. totalBytes += int64(r.leftOver.Len())
  72. }
  73. for {
  74. mb, err := r.stream.Read()
  75. if err != nil {
  76. return totalBytes, err
  77. }
  78. totalBytes += int64(mb.Len())
  79. if err := mbWriter.Write(mb); err != nil {
  80. return totalBytes, err
  81. }
  82. }
  83. }
  84. func (r *bufferToBytesReader) WriteTo(writer io.Writer) (int64, error) {
  85. nBytes, err := r.writeToInternal(writer)
  86. if errors.Cause(err) == io.EOF {
  87. return nBytes, nil
  88. }
  89. return nBytes, err
  90. }