multi_buffer.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  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. endIndex := -1
  90. for i := range mb {
  91. pBuffer := mb[i]
  92. nBytes, _ := pBuffer.Read(b)
  93. totalBytes += nBytes
  94. b = b[nBytes:]
  95. if !pBuffer.IsEmpty() {
  96. endIndex = i
  97. break
  98. }
  99. pBuffer.Release()
  100. mb[i] = nil
  101. }
  102. if endIndex == -1 {
  103. mb = mb[:0]
  104. } else {
  105. mb = mb[endIndex:]
  106. }
  107. return mb, totalBytes
  108. }
  109. // SplitFirst splits the first Buffer from the beginning of the MultiBuffer.
  110. func SplitFirst(mb MultiBuffer) (MultiBuffer, *Buffer) {
  111. if len(mb) == 0 {
  112. return mb, nil
  113. }
  114. b := mb[0]
  115. mb[0] = nil
  116. mb = mb[1:]
  117. return mb, b
  118. }
  119. // SplitSize splits the beginning of the MultiBuffer into another one, for at most size bytes.
  120. func SplitSize(mb MultiBuffer, size int32) (MultiBuffer, MultiBuffer) {
  121. if len(mb) == 0 {
  122. return mb, nil
  123. }
  124. if mb[0].Len() > size {
  125. b := New()
  126. copy(b.Extend(size), mb[0].BytesTo(size))
  127. mb[0].Advance(size)
  128. return mb, MultiBuffer{b}
  129. }
  130. totalBytes := int32(0)
  131. var r MultiBuffer
  132. endIndex := -1
  133. for i := range mb {
  134. if totalBytes+mb[i].Len() > size {
  135. endIndex = i
  136. break
  137. }
  138. totalBytes += mb[i].Len()
  139. r = append(r, mb[i])
  140. mb[i] = nil
  141. }
  142. if endIndex == -1 {
  143. // To reuse mb array
  144. mb = mb[:0]
  145. } else {
  146. mb = mb[endIndex:]
  147. }
  148. return mb, r
  149. }
  150. // Len returns the total number of bytes in the MultiBuffer.
  151. func (mb MultiBuffer) Len() int32 {
  152. if mb == nil {
  153. return 0
  154. }
  155. size := int32(0)
  156. for _, b := range mb {
  157. size += b.Len()
  158. }
  159. return size
  160. }
  161. // IsEmpty return true if the MultiBuffer has no content.
  162. func (mb MultiBuffer) IsEmpty() bool {
  163. for _, b := range mb {
  164. if !b.IsEmpty() {
  165. return false
  166. }
  167. }
  168. return true
  169. }
  170. // String returns the content of the MultiBuffer in string.
  171. func (mb MultiBuffer) String() string {
  172. v := make([]interface{}, len(mb))
  173. for i, b := range mb {
  174. v[i] = b
  175. }
  176. return serial.Concat(v...)
  177. }
  178. // MultiBufferContainer is a ReadWriteCloser wrapper over MultiBuffer.
  179. type MultiBufferContainer struct {
  180. MultiBuffer
  181. }
  182. // Read implements io.Reader.
  183. func (c *MultiBufferContainer) Read(b []byte) (int, error) {
  184. if c.MultiBuffer.IsEmpty() {
  185. return 0, io.EOF
  186. }
  187. mb, nBytes := SplitBytes(c.MultiBuffer, b)
  188. c.MultiBuffer = mb
  189. return nBytes, nil
  190. }
  191. // ReadMultiBuffer implements Reader.
  192. func (c *MultiBufferContainer) ReadMultiBuffer() (MultiBuffer, error) {
  193. mb := c.MultiBuffer
  194. c.MultiBuffer = nil
  195. return mb, nil
  196. }
  197. // Write implements io.Writer.
  198. func (c *MultiBufferContainer) Write(b []byte) (int, error) {
  199. c.MultiBuffer = MergeBytes(c.MultiBuffer, b)
  200. return len(b), nil
  201. }
  202. // WriteMultiBuffer implement Writer.
  203. func (c *MultiBufferContainer) WriteMultiBuffer(b MultiBuffer) error {
  204. mb, _ := MergeMulti(c.MultiBuffer, b)
  205. c.MultiBuffer = mb
  206. return nil
  207. }
  208. // Close implement io.Closer.
  209. func (c *MultiBufferContainer) Close() error {
  210. c.MultiBuffer = ReleaseMulti(c.MultiBuffer)
  211. return nil
  212. }