multi_buffer.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. package buf
  2. import (
  3. "io"
  4. "v2ray.com/core/common/errors"
  5. "v2ray.com/core/common/serial"
  6. )
  7. // ReadAllToBytes reads all content from the reader into a byte array, until EOF.
  8. func ReadAllToBytes(reader io.Reader) ([]byte, error) {
  9. mb, err := ReadFrom(reader)
  10. if err != nil {
  11. return nil, err
  12. }
  13. if mb.Len() == 0 {
  14. return nil, nil
  15. }
  16. b := make([]byte, mb.Len())
  17. mb, _ = SplitBytes(mb, b)
  18. ReleaseMulti(mb)
  19. return b, nil
  20. }
  21. // MultiBuffer is a list of Buffers. The order of Buffer matters.
  22. type MultiBuffer []*Buffer
  23. // MergeMulti merges content from src to dest, and returns the new address of dest and src
  24. func MergeMulti(dest MultiBuffer, src MultiBuffer) (MultiBuffer, MultiBuffer) {
  25. dest = append(dest, src...)
  26. for idx := range src {
  27. src[idx] = nil
  28. }
  29. return dest, src[:0]
  30. }
  31. // MergeBytes merges the given bytes into MultiBuffer and return the new address of the merged MultiBuffer.
  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. // SplitBytes splits the given amount of bytes from the beginning of the MultiBuffer.
  86. // It returns the new address of MultiBuffer leftover, and number of bytes written into the input byte slice.
  87. func SplitBytes(mb MultiBuffer, b []byte) (MultiBuffer, int) {
  88. totalBytes := 0
  89. for len(mb) > 0 {
  90. bb := mb[0]
  91. nBytes, _ := bb.Read(b)
  92. totalBytes += nBytes
  93. b = b[nBytes:]
  94. if !bb.IsEmpty() {
  95. break
  96. }
  97. bb.Release()
  98. mb = mb[1:]
  99. }
  100. return mb, totalBytes
  101. }
  102. // SplitFirst splits the first Buffer from the beginning of the MultiBuffer.
  103. func SplitFirst(mb MultiBuffer) (MultiBuffer, *Buffer) {
  104. if len(mb) == 0 {
  105. return mb, nil
  106. }
  107. b := mb[0]
  108. mb[0] = nil
  109. mb = mb[1:]
  110. return mb, b
  111. }
  112. // SplitSize splits the beginning of the MultiBuffer into another one, for at most size bytes.
  113. func SplitSize(mb MultiBuffer, size int32) (MultiBuffer, MultiBuffer) {
  114. if len(mb) == 0 {
  115. return mb, nil
  116. }
  117. if mb[0].Len() > size {
  118. b := New()
  119. copy(b.Extend(size), mb[0].BytesTo(size))
  120. mb[0].Advance(size)
  121. return mb, MultiBuffer{b}
  122. }
  123. totalBytes := int32(0)
  124. var r MultiBuffer
  125. endIndex := -1
  126. for i := range mb {
  127. if totalBytes+mb[i].Len() > size {
  128. endIndex = i
  129. break
  130. }
  131. totalBytes += mb[i].Len()
  132. r = append(r, mb[i])
  133. mb[i] = nil
  134. }
  135. if endIndex == -1 {
  136. // To reuse mb array
  137. mb = mb[:0]
  138. } else {
  139. mb = mb[endIndex:]
  140. }
  141. return mb, r
  142. }
  143. // Len returns the total number of bytes in the MultiBuffer.
  144. func (mb MultiBuffer) Len() int32 {
  145. if mb == nil {
  146. return 0
  147. }
  148. size := int32(0)
  149. for _, b := range mb {
  150. size += b.Len()
  151. }
  152. return size
  153. }
  154. // IsEmpty return true if the MultiBuffer has no content.
  155. func (mb MultiBuffer) IsEmpty() bool {
  156. for _, b := range mb {
  157. if !b.IsEmpty() {
  158. return false
  159. }
  160. }
  161. return true
  162. }
  163. // String returns the content of the MultiBuffer in string.
  164. func (mb MultiBuffer) String() string {
  165. v := make([]interface{}, len(mb))
  166. for i, b := range mb {
  167. v[i] = b
  168. }
  169. return serial.Concat(v...)
  170. }
  171. // MultiBufferContainer is a ReadWriteCloser wrapper over MultiBuffer.
  172. type MultiBufferContainer struct {
  173. MultiBuffer
  174. }
  175. // Read implements io.Reader.
  176. func (c *MultiBufferContainer) Read(b []byte) (int, error) {
  177. if c.MultiBuffer.IsEmpty() {
  178. return 0, io.EOF
  179. }
  180. mb, nBytes := SplitBytes(c.MultiBuffer, b)
  181. c.MultiBuffer = mb
  182. return nBytes, nil
  183. }
  184. // ReadMultiBuffer implements Reader.
  185. func (c *MultiBufferContainer) ReadMultiBuffer() (MultiBuffer, error) {
  186. mb := c.MultiBuffer
  187. c.MultiBuffer = nil
  188. return mb, nil
  189. }
  190. // Write implements io.Writer.
  191. func (c *MultiBufferContainer) Write(b []byte) (int, error) {
  192. c.MultiBuffer = MergeBytes(c.MultiBuffer, b)
  193. return len(b), nil
  194. }
  195. // WriteMultiBuffer implement Writer.
  196. func (c *MultiBufferContainer) WriteMultiBuffer(b MultiBuffer) error {
  197. mb, _ := MergeMulti(c.MultiBuffer, b)
  198. c.MultiBuffer = mb
  199. return nil
  200. }
  201. // Close implement io.Closer.
  202. func (c *MultiBufferContainer) Close() error {
  203. c.MultiBuffer = ReleaseMulti(c.MultiBuffer)
  204. return nil
  205. }