multi_buffer.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. package buf
  2. import (
  3. "io"
  4. "net"
  5. "v2ray.com/core/common"
  6. "v2ray.com/core/common/errors"
  7. "v2ray.com/core/common/serial"
  8. )
  9. // ReadAllToMultiBuffer reads all content from the reader into a MultiBuffer, until EOF.
  10. func ReadAllToMultiBuffer(reader io.Reader) (MultiBuffer, error) {
  11. mb := NewMultiBufferCap(128)
  12. if _, err := mb.ReadFrom(reader); err != nil {
  13. mb.Release()
  14. return nil, err
  15. }
  16. return mb, nil
  17. }
  18. // ReadSizeToMultiBuffer reads specific number of bytes from reader into a MultiBuffer.
  19. func ReadSizeToMultiBuffer(reader io.Reader, size int32) (MultiBuffer, error) {
  20. mb := NewMultiBufferCap(32)
  21. for size > 0 {
  22. bSize := size
  23. if bSize > Size {
  24. bSize = Size
  25. }
  26. b := NewSize(bSize)
  27. if err := b.Reset(ReadFullFrom(reader, bSize)); err != nil {
  28. mb.Release()
  29. return nil, err
  30. }
  31. size -= bSize
  32. mb.Append(b)
  33. }
  34. return mb, nil
  35. }
  36. // ReadAllToBytes reads all content from the reader into a byte array, until EOF.
  37. func ReadAllToBytes(reader io.Reader) ([]byte, error) {
  38. mb, err := ReadAllToMultiBuffer(reader)
  39. if err != nil {
  40. return nil, err
  41. }
  42. if mb.Len() == 0 {
  43. return nil, nil
  44. }
  45. b := make([]byte, mb.Len())
  46. common.Must2(mb.Read(b))
  47. mb.Release()
  48. return b, nil
  49. }
  50. // MultiBuffer is a list of Buffers. The order of Buffer matters.
  51. type MultiBuffer []*Buffer
  52. // NewMultiBufferCap creates a new MultiBuffer instance.
  53. func NewMultiBufferCap(capacity int32) MultiBuffer {
  54. return MultiBuffer(make([]*Buffer, 0, capacity))
  55. }
  56. // NewMultiBufferValue wraps a list of Buffers into MultiBuffer.
  57. func NewMultiBufferValue(b ...*Buffer) MultiBuffer {
  58. return MultiBuffer(b)
  59. }
  60. // Append appends buffer to the end of this MultiBuffer
  61. func (mb *MultiBuffer) Append(buf *Buffer) {
  62. if buf != nil {
  63. *mb = append(*mb, buf)
  64. }
  65. }
  66. // AppendMulti appends a MultiBuffer to the end of this one.
  67. func (mb *MultiBuffer) AppendMulti(buf MultiBuffer) {
  68. *mb = append(*mb, buf...)
  69. }
  70. // Copy copied the beginning part of the MultiBuffer into the given byte array.
  71. func (mb MultiBuffer) Copy(b []byte) int {
  72. total := 0
  73. for _, bb := range mb {
  74. nBytes := copy(b[total:], bb.Bytes())
  75. total += nBytes
  76. if int32(nBytes) < bb.Len() {
  77. break
  78. }
  79. }
  80. return total
  81. }
  82. // ReadFrom implements io.ReaderFrom.
  83. func (mb *MultiBuffer) ReadFrom(reader io.Reader) (int64, error) {
  84. totalBytes := int64(0)
  85. for {
  86. b := New()
  87. err := b.Reset(ReadFrom(reader))
  88. if b.IsEmpty() {
  89. b.Release()
  90. } else {
  91. mb.Append(b)
  92. }
  93. totalBytes += int64(b.Len())
  94. if err != nil {
  95. if errors.Cause(err) == io.EOF {
  96. return totalBytes, nil
  97. }
  98. return totalBytes, err
  99. }
  100. }
  101. }
  102. // Read implements io.Reader.
  103. func (mb *MultiBuffer) Read(b []byte) (int, error) {
  104. if mb.IsEmpty() {
  105. return 0, io.EOF
  106. }
  107. endIndex := len(*mb)
  108. totalBytes := 0
  109. for i, bb := range *mb {
  110. nBytes, _ := bb.Read(b)
  111. totalBytes += nBytes
  112. b = b[nBytes:]
  113. if bb.IsEmpty() {
  114. bb.Release()
  115. (*mb)[i] = nil
  116. } else {
  117. endIndex = i
  118. break
  119. }
  120. }
  121. *mb = (*mb)[endIndex:]
  122. return totalBytes, nil
  123. }
  124. // WriteTo implements io.WriterTo.
  125. func (mb *MultiBuffer) WriteTo(writer io.Writer) (int64, error) {
  126. defer mb.Release()
  127. totalBytes := int64(0)
  128. for _, b := range *mb {
  129. nBytes, err := writer.Write(b.Bytes())
  130. totalBytes += int64(nBytes)
  131. if err != nil {
  132. return totalBytes, err
  133. }
  134. }
  135. return totalBytes, nil
  136. }
  137. // Write implements io.Writer.
  138. func (mb *MultiBuffer) Write(b []byte) (int, error) {
  139. totalBytes := len(b)
  140. n := len(*mb)
  141. if n > 0 && !(*mb)[n-1].IsFull() {
  142. nBytes, _ := (*mb)[n-1].Write(b)
  143. b = b[nBytes:]
  144. }
  145. for len(b) > 0 {
  146. bb := New()
  147. nBytes, _ := bb.Write(b)
  148. b = b[nBytes:]
  149. mb.Append(bb)
  150. }
  151. return totalBytes, nil
  152. }
  153. // WriteMultiBuffer implements Writer.
  154. func (mb *MultiBuffer) WriteMultiBuffer(b MultiBuffer) error {
  155. *mb = append(*mb, b...)
  156. return nil
  157. }
  158. // Len returns the total number of bytes in the MultiBuffer.
  159. func (mb *MultiBuffer) Len() int32 {
  160. if mb == nil {
  161. return 0
  162. }
  163. size := int32(0)
  164. for _, b := range *mb {
  165. size += b.Len()
  166. }
  167. return size
  168. }
  169. // IsEmpty return true if the MultiBuffer has no content.
  170. func (mb MultiBuffer) IsEmpty() bool {
  171. for _, b := range mb {
  172. if !b.IsEmpty() {
  173. return false
  174. }
  175. }
  176. return true
  177. }
  178. // Release releases all Buffers in the MultiBuffer.
  179. func (mb *MultiBuffer) Release() {
  180. for i, b := range *mb {
  181. b.Release()
  182. (*mb)[i] = nil
  183. }
  184. *mb = nil
  185. }
  186. func (mb MultiBuffer) String() string {
  187. v := make([]interface{}, len(mb))
  188. for i, b := range mb {
  189. v[i] = b
  190. }
  191. return serial.Concat(v...)
  192. }
  193. // ToNetBuffers converts this MultiBuffer to net.Buffers. The return net.Buffers points to the same content of the MultiBuffer.
  194. func (mb MultiBuffer) ToNetBuffers() net.Buffers {
  195. bs := make([][]byte, len(mb))
  196. for i, b := range mb {
  197. bs[i] = b.Bytes()
  198. }
  199. return bs
  200. }
  201. // SliceBySize splits the beginning of this MultiBuffer into another one, for at most size bytes.
  202. func (mb *MultiBuffer) SliceBySize(size int32) MultiBuffer {
  203. slice := NewMultiBufferCap(10)
  204. sliceSize := int32(0)
  205. endIndex := len(*mb)
  206. for i, b := range *mb {
  207. if b.Len()+sliceSize > size {
  208. endIndex = i
  209. break
  210. }
  211. sliceSize += b.Len()
  212. slice.Append(b)
  213. (*mb)[i] = nil
  214. }
  215. *mb = (*mb)[endIndex:]
  216. if endIndex == 0 && len(*mb) > 0 {
  217. b := NewSize(size)
  218. common.Must(b.Reset(ReadFullFrom((*mb)[0], size)))
  219. return NewMultiBufferValue(b)
  220. }
  221. return slice
  222. }
  223. // SplitFirst splits out the first Buffer in this MultiBuffer.
  224. func (mb *MultiBuffer) SplitFirst() *Buffer {
  225. if len(*mb) == 0 {
  226. return nil
  227. }
  228. b := (*mb)[0]
  229. (*mb)[0] = nil
  230. *mb = (*mb)[1:]
  231. return b
  232. }