multi_buffer.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  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. // ReadAllToBytes reads all content from the reader into a byte array, until EOF.
  19. func ReadAllToBytes(reader io.Reader) ([]byte, error) {
  20. mb, err := ReadAllToMultiBuffer(reader)
  21. if err != nil {
  22. return nil, err
  23. }
  24. if mb.Len() == 0 {
  25. return nil, nil
  26. }
  27. b := make([]byte, mb.Len())
  28. common.Must2(mb.Read(b))
  29. mb.Release()
  30. return b, nil
  31. }
  32. // MultiBuffer is a list of Buffers. The order of Buffer matters.
  33. type MultiBuffer []*Buffer
  34. // NewMultiBufferCap creates a new MultiBuffer instance.
  35. func NewMultiBufferCap(capacity int32) MultiBuffer {
  36. return MultiBuffer(make([]*Buffer, 0, capacity))
  37. }
  38. // NewMultiBufferValue wraps a list of Buffers into MultiBuffer.
  39. func NewMultiBufferValue(b ...*Buffer) MultiBuffer {
  40. return MultiBuffer(b)
  41. }
  42. // Append appends buffer to the end of this MultiBuffer
  43. func (mb *MultiBuffer) Append(buf *Buffer) {
  44. if buf != nil {
  45. *mb = append(*mb, buf)
  46. }
  47. }
  48. // AppendMulti appends a MultiBuffer to the end of this one.
  49. func (mb *MultiBuffer) AppendMulti(buf MultiBuffer) {
  50. *mb = append(*mb, buf...)
  51. }
  52. // Copy copied the beginning part of the MultiBuffer into the given byte array.
  53. func (mb MultiBuffer) Copy(b []byte) int {
  54. total := 0
  55. for _, bb := range mb {
  56. nBytes := copy(b[total:], bb.Bytes())
  57. total += nBytes
  58. if int32(nBytes) < bb.Len() {
  59. break
  60. }
  61. }
  62. return total
  63. }
  64. // ReadFrom implements io.ReaderFrom.
  65. func (mb *MultiBuffer) ReadFrom(reader io.Reader) (int64, error) {
  66. totalBytes := int64(0)
  67. for {
  68. b := New()
  69. err := b.Reset(ReadFullFrom(reader, Size))
  70. if b.IsEmpty() {
  71. b.Release()
  72. } else {
  73. mb.Append(b)
  74. }
  75. totalBytes += int64(b.Len())
  76. if err != nil {
  77. if errors.Cause(err) == io.EOF || errors.Cause(err) == io.ErrUnexpectedEOF {
  78. return totalBytes, nil
  79. }
  80. return totalBytes, err
  81. }
  82. }
  83. }
  84. // Read implements io.Reader.
  85. func (mb *MultiBuffer) Read(b []byte) (int, error) {
  86. if mb.IsEmpty() {
  87. return 0, io.EOF
  88. }
  89. endIndex := len(*mb)
  90. totalBytes := 0
  91. for i, bb := range *mb {
  92. nBytes, _ := bb.Read(b)
  93. totalBytes += nBytes
  94. b = b[nBytes:]
  95. if bb.IsEmpty() {
  96. bb.Release()
  97. (*mb)[i] = nil
  98. } else {
  99. endIndex = i
  100. break
  101. }
  102. }
  103. *mb = (*mb)[endIndex:]
  104. return totalBytes, nil
  105. }
  106. // WriteTo implements io.WriterTo.
  107. func (mb *MultiBuffer) WriteTo(writer io.Writer) (int64, error) {
  108. defer mb.Release()
  109. totalBytes := int64(0)
  110. for _, b := range *mb {
  111. nBytes, err := writer.Write(b.Bytes())
  112. totalBytes += int64(nBytes)
  113. if err != nil {
  114. return totalBytes, err
  115. }
  116. }
  117. return totalBytes, nil
  118. }
  119. // Write implements io.Writer.
  120. func (mb *MultiBuffer) Write(b []byte) (int, error) {
  121. totalBytes := len(b)
  122. n := len(*mb)
  123. if n > 0 && !(*mb)[n-1].IsFull() {
  124. nBytes, _ := (*mb)[n-1].Write(b)
  125. b = b[nBytes:]
  126. }
  127. for len(b) > 0 {
  128. bb := New()
  129. nBytes, _ := bb.Write(b)
  130. b = b[nBytes:]
  131. mb.Append(bb)
  132. }
  133. return totalBytes, nil
  134. }
  135. // WriteMultiBuffer implements Writer.
  136. func (mb *MultiBuffer) WriteMultiBuffer(b MultiBuffer) error {
  137. *mb = append(*mb, b...)
  138. for i := range b {
  139. b[i] = nil
  140. }
  141. return nil
  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. // Release releases all Buffers in the MultiBuffer.
  164. func (mb *MultiBuffer) Release() {
  165. for i, b := range *mb {
  166. b.Release()
  167. (*mb)[i] = nil
  168. }
  169. *mb = nil
  170. }
  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. // ToNetBuffers converts this MultiBuffer to net.Buffers. The return net.Buffers points to the same content of the MultiBuffer.
  179. func (mb MultiBuffer) ToNetBuffers() net.Buffers {
  180. bs := make([][]byte, len(mb))
  181. for i, b := range mb {
  182. bs[i] = b.Bytes()
  183. }
  184. return bs
  185. }
  186. // SliceBySize splits the beginning of this MultiBuffer into another one, for at most size bytes.
  187. func (mb *MultiBuffer) SliceBySize(size int32) MultiBuffer {
  188. slice := NewMultiBufferCap(10)
  189. sliceSize := int32(0)
  190. endIndex := len(*mb)
  191. for i, b := range *mb {
  192. if b.Len()+sliceSize > size {
  193. endIndex = i
  194. break
  195. }
  196. sliceSize += b.Len()
  197. slice.Append(b)
  198. (*mb)[i] = nil
  199. }
  200. *mb = (*mb)[endIndex:]
  201. if endIndex == 0 && len(*mb) > 0 {
  202. b := NewSize(size)
  203. common.Must(b.Reset(ReadFullFrom((*mb)[0], size)))
  204. return NewMultiBufferValue(b)
  205. }
  206. return slice
  207. }
  208. // SplitFirst splits out the first Buffer in this MultiBuffer.
  209. func (mb *MultiBuffer) SplitFirst() *Buffer {
  210. if len(*mb) == 0 {
  211. return nil
  212. }
  213. b := (*mb)[0]
  214. (*mb)[0] = nil
  215. *mb = (*mb)[1:]
  216. return b
  217. }