multi_buffer.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. package buf
  2. import (
  3. "io"
  4. "v2ray.com/core/common"
  5. "v2ray.com/core/common/errors"
  6. "v2ray.com/core/common/serial"
  7. )
  8. // ReadAllToBytes reads all content from the reader into a byte array, until EOF.
  9. func ReadAllToBytes(reader io.Reader) ([]byte, error) {
  10. mb, err := ReadFrom(reader)
  11. if err != nil {
  12. return nil, err
  13. }
  14. if mb.Len() == 0 {
  15. return nil, nil
  16. }
  17. b := make([]byte, mb.Len())
  18. mb, _ = SplitBytes(mb, b)
  19. ReleaseMulti(mb)
  20. return b, nil
  21. }
  22. // MultiBuffer is a list of Buffers. The order of Buffer matters.
  23. type MultiBuffer []*Buffer
  24. // MergeMulti merges content from src to dest, and returns the new address of dest and src
  25. func MergeMulti(dest MultiBuffer, src MultiBuffer) (MultiBuffer, MultiBuffer) {
  26. dest = append(dest, src...)
  27. for idx := range src {
  28. src[idx] = nil
  29. }
  30. return dest, src[:0]
  31. }
  32. func MergeBytes(dest MultiBuffer, src []byte) MultiBuffer {
  33. n := len(dest)
  34. if n > 0 && !(dest)[n-1].IsFull() {
  35. nBytes, _ := (dest)[n-1].Write(src)
  36. src = src[nBytes:]
  37. }
  38. for len(src) > 0 {
  39. b := New()
  40. nBytes, _ := b.Write(src)
  41. src = src[nBytes:]
  42. dest = append(dest, b)
  43. }
  44. return dest
  45. }
  46. // ReleaseMulti release all content of the MultiBuffer, and returns an empty MultiBuffer.
  47. func ReleaseMulti(mb MultiBuffer) MultiBuffer {
  48. for i := range mb {
  49. mb[i].Release()
  50. mb[i] = nil
  51. }
  52. return mb[:0]
  53. }
  54. // Copy copied the beginning part of the MultiBuffer into the given byte array.
  55. func (mb MultiBuffer) Copy(b []byte) int {
  56. total := 0
  57. for _, bb := range mb {
  58. nBytes := copy(b[total:], bb.Bytes())
  59. total += nBytes
  60. if int32(nBytes) < bb.Len() {
  61. break
  62. }
  63. }
  64. return total
  65. }
  66. // ReadFrom reads all content from reader until EOF.
  67. func ReadFrom(reader io.Reader) (MultiBuffer, error) {
  68. mb := make(MultiBuffer, 0, 16)
  69. for {
  70. b := New()
  71. _, err := b.ReadFullFrom(reader, Size)
  72. if b.IsEmpty() {
  73. b.Release()
  74. } else {
  75. mb = append(mb, b)
  76. }
  77. if err != nil {
  78. if errors.Cause(err) == io.EOF || errors.Cause(err) == io.ErrUnexpectedEOF {
  79. return mb, nil
  80. }
  81. return mb, err
  82. }
  83. }
  84. }
  85. func SplitBytes(mb MultiBuffer, b []byte) (MultiBuffer, int) {
  86. totalBytes := 0
  87. for len(mb) > 0 {
  88. bb := mb[0]
  89. nBytes, _ := bb.Read(b)
  90. totalBytes += nBytes
  91. b = b[nBytes:]
  92. if !bb.IsEmpty() {
  93. break
  94. }
  95. bb.Release()
  96. mb = mb[1:]
  97. }
  98. return mb, totalBytes
  99. }
  100. // Len returns the total number of bytes in the MultiBuffer.
  101. func (mb MultiBuffer) Len() int32 {
  102. if mb == nil {
  103. return 0
  104. }
  105. size := int32(0)
  106. for _, b := range mb {
  107. size += b.Len()
  108. }
  109. return size
  110. }
  111. // IsEmpty return true if the MultiBuffer has no content.
  112. func (mb MultiBuffer) IsEmpty() bool {
  113. for _, b := range mb {
  114. if !b.IsEmpty() {
  115. return false
  116. }
  117. }
  118. return true
  119. }
  120. // String returns the content of the MultiBuffer in string.
  121. func (mb MultiBuffer) String() string {
  122. v := make([]interface{}, len(mb))
  123. for i, b := range mb {
  124. v[i] = b
  125. }
  126. return serial.Concat(v...)
  127. }
  128. // SliceBySize splits the beginning of this MultiBuffer into another one, for at most size bytes.
  129. func (mb *MultiBuffer) SliceBySize(size int32) MultiBuffer {
  130. slice := make(MultiBuffer, 0, 10)
  131. sliceSize := int32(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(slice, b)
  140. (*mb)[i] = nil
  141. }
  142. *mb = (*mb)[endIndex:]
  143. if endIndex == 0 && len(*mb) > 0 {
  144. b := New()
  145. common.Must2(b.ReadFullFrom((*mb)[0], size))
  146. return MultiBuffer{b}
  147. }
  148. return slice
  149. }
  150. // SplitFirst splits out the first Buffer in this MultiBuffer.
  151. func (mb *MultiBuffer) SplitFirst() *Buffer {
  152. if len(*mb) == 0 {
  153. return nil
  154. }
  155. b := (*mb)[0]
  156. (*mb)[0] = nil
  157. *mb = (*mb)[1:]
  158. return b
  159. }
  160. type MultiBufferContainer struct {
  161. MultiBuffer
  162. }
  163. func (c *MultiBufferContainer) Read(b []byte) (int, error) {
  164. if c.MultiBuffer.IsEmpty() {
  165. return 0, io.EOF
  166. }
  167. mb, nBytes := SplitBytes(c.MultiBuffer, b)
  168. c.MultiBuffer = mb
  169. return nBytes, nil
  170. }
  171. func (c *MultiBufferContainer) ReadMultiBuffer() (MultiBuffer, error) {
  172. mb := c.MultiBuffer
  173. c.MultiBuffer = nil
  174. return mb, nil
  175. }
  176. func (c *MultiBufferContainer) Write(b []byte) (int, error) {
  177. c.MultiBuffer = MergeBytes(c.MultiBuffer, b)
  178. return len(b), nil
  179. }
  180. func (c *MultiBufferContainer) WriteMultiBuffer(b MultiBuffer) error {
  181. mb, _ := MergeMulti(c.MultiBuffer, b)
  182. c.MultiBuffer = mb
  183. return nil
  184. }
  185. func (c *MultiBufferContainer) Close() error {
  186. c.MultiBuffer = ReleaseMulti(c.MultiBuffer)
  187. return nil
  188. }