multi_buffer.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. package buf
  2. import (
  3. "io"
  4. "net"
  5. "v2ray.com/core/common/errors"
  6. )
  7. type MultiBufferWriter interface {
  8. WriteMultiBuffer(MultiBuffer) error
  9. }
  10. type MultiBufferReader interface {
  11. ReadMultiBuffer() (MultiBuffer, error)
  12. }
  13. func ReadAllToMultiBuffer(reader io.Reader) (MultiBuffer, error) {
  14. mb := NewMultiBuffer()
  15. for {
  16. b := New()
  17. err := b.AppendSupplier(ReadFrom(reader))
  18. if !b.IsEmpty() {
  19. mb.Append(b)
  20. }
  21. if err != nil {
  22. if errors.Cause(err) == io.EOF {
  23. return mb, nil
  24. }
  25. mb.Release()
  26. return nil, err
  27. }
  28. }
  29. }
  30. func ReadAllToBytes(reader io.Reader) ([]byte, error) {
  31. mb, err := ReadAllToMultiBuffer(reader)
  32. if err != nil {
  33. return nil, err
  34. }
  35. b := make([]byte, mb.Len())
  36. mb.Read(b)
  37. mb.Release()
  38. return b, nil
  39. }
  40. // MultiBuffer is a list of Buffers. The order of Buffer matters.
  41. type MultiBuffer []*Buffer
  42. // NewMultiBuffer creates a new MultiBuffer instance.
  43. func NewMultiBuffer() MultiBuffer {
  44. return MultiBuffer(make([]*Buffer, 0, 128))
  45. }
  46. // NewMultiBufferValue wraps a list of Buffers into MultiBuffer.
  47. func NewMultiBufferValue(b ...*Buffer) MultiBuffer {
  48. return MultiBuffer(b)
  49. }
  50. func (mb *MultiBuffer) Append(buf *Buffer) {
  51. *mb = append(*mb, buf)
  52. }
  53. func (mb *MultiBuffer) AppendMulti(buf MultiBuffer) {
  54. *mb = append(*mb, buf...)
  55. }
  56. func (mb MultiBuffer) Copy(b []byte) int {
  57. total := 0
  58. for _, bb := range mb {
  59. nBytes := copy(b[total:], bb.Bytes())
  60. total += nBytes
  61. if nBytes < bb.Len() {
  62. break
  63. }
  64. }
  65. return total
  66. }
  67. func (mb *MultiBuffer) Read(b []byte) (int, error) {
  68. endIndex := len(*mb)
  69. totalBytes := 0
  70. for i, bb := range *mb {
  71. nBytes, _ := bb.Read(b)
  72. totalBytes += nBytes
  73. b = b[nBytes:]
  74. if bb.IsEmpty() {
  75. bb.Release()
  76. } else {
  77. endIndex = i
  78. break
  79. }
  80. }
  81. *mb = (*mb)[endIndex:]
  82. return totalBytes, nil
  83. }
  84. func (mb *MultiBuffer) Write(b []byte) {
  85. n := len(*mb)
  86. if n > 0 && !(*mb)[n-1].IsFull() {
  87. nBytes, _ := (*mb)[n-1].Write(b)
  88. b = b[nBytes:]
  89. }
  90. for len(b) > 0 {
  91. bb := New()
  92. nBytes, _ := bb.Write(b)
  93. b = b[nBytes:]
  94. mb.Append(bb)
  95. }
  96. }
  97. // Len returns the total number of bytes in the MultiBuffer.
  98. func (mb MultiBuffer) Len() int {
  99. size := 0
  100. for _, b := range mb {
  101. size += b.Len()
  102. }
  103. return size
  104. }
  105. // IsEmpty return true if the MultiBuffer has no content.
  106. func (mb MultiBuffer) IsEmpty() bool {
  107. for _, b := range mb {
  108. if !b.IsEmpty() {
  109. return false
  110. }
  111. }
  112. return true
  113. }
  114. // Release releases all Buffers in the MultiBuffer.
  115. func (mb MultiBuffer) Release() {
  116. for i, b := range mb {
  117. b.Release()
  118. mb[i] = nil
  119. }
  120. }
  121. // ToNetBuffers converts this MultiBuffer to net.Buffers. The return net.Buffers points to the same content of the MultiBuffer.
  122. func (mb MultiBuffer) ToNetBuffers() net.Buffers {
  123. bs := make([][]byte, len(mb))
  124. for i, b := range mb {
  125. bs[i] = b.Bytes()
  126. }
  127. return bs
  128. }
  129. func (mb *MultiBuffer) SliceBySize(size int) MultiBuffer {
  130. slice := NewMultiBuffer()
  131. sliceSize := 0
  132. endIndex := len(*mb)
  133. for i, b := range *mb {
  134. if b.Len()+sliceSize > size {
  135. endIndex = i
  136. break
  137. }
  138. sliceSize += b.Len()
  139. slice.Append(b)
  140. }
  141. *mb = (*mb)[endIndex:]
  142. return slice
  143. }
  144. func (mb *MultiBuffer) SplitFirst() *Buffer {
  145. if len(*mb) == 0 {
  146. return nil
  147. }
  148. b := (*mb)[0]
  149. *mb = (*mb)[1:]
  150. return b
  151. }