@@ -59,7 +59,7 @@ type VisionConn struct {
5959 remainingPadding int
6060 currentCommand byte
6161 directRead bool
62- remainingReader io. Reader
62+ remainingBuffers [] * buf. Buffer
6363}
6464
6565func NewVisionConn (conn net.Conn , tlsConn net.Conn , userUUID [16 ]byte , logger logger.Logger ) (* VisionConn , error ) {
@@ -101,16 +101,20 @@ func NewVisionConn(conn net.Conn, tlsConn net.Conn, userUUID [16]byte, logger lo
101101}
102102
103103func (c * VisionConn ) Read (p []byte ) (n int , err error ) {
104- if c . remainingReader != nil {
105- n , err = c .remainingReader .Read (p )
106- if err == io . EOF {
107- err = nil
108- c .remainingReader = nil
104+ for len ( c . remainingBuffers ) > 0 {
105+ newN , _ : = c .remainingBuffers [ 0 ] .Read (p [ n :] )
106+ if c . remainingBuffers [ 0 ]. IsEmpty () {
107+ c . remainingBuffers [ 0 ]. Release ()
108+ c .remainingBuffers = c . remainingBuffers [ 1 :]
109109 }
110- if n > 0 {
111- return
110+ n += newN
111+ if n == len (p ) {
112+ break
112113 }
113114 }
115+ if n > 0 {
116+ return
117+ }
114118 if c .directRead {
115119 return c .netConn .Read (p )
116120 }
@@ -132,9 +136,6 @@ func (c *VisionConn) Read(p []byte) (n int, err error) {
132136 if c .withinPaddingBuffers || c .numberOfPacketToFilter > 0 {
133137 buffers := c .unPadding (bufferBytes )
134138 if chunkBuffer != nil {
135- buffers = common .Map (buffers , func (it * buf.Buffer ) * buf.Buffer {
136- return it .ToOwned ()
137- })
138139 chunkBuffer .Reset ()
139140 }
140141 if c .remainingContent == 0 && c .remainingPadding == 0 {
@@ -173,14 +174,15 @@ func (c *VisionConn) Read(p []byte) (n int, err error) {
173174 if c .numberOfPacketToFilter > 0 {
174175 c .filterTLS (buf .ToSliceMulti (buffers ))
175176 }
176- c .remainingReader = io . MultiReader ( common . Map ( buffers , func ( it * buf. Buffer ) io. Reader { return it }) ... )
177+ c .remainingBuffers = buffers
177178 return c .Read (p )
178179 } else {
179180 if c .numberOfPacketToFilter > 0 {
180181 c .filterTLS ([][]byte {bufferBytes })
181182 }
182183 if chunkBuffer != nil {
183- c .remainingReader = chunkBuffer
184+ c .remainingBuffers = append (c .remainingBuffers , buf .As (chunkBuffer .Bytes ()))
185+ chunkBuffer .Reset ()
184186 return c .Read (p )
185187 }
186188 return
@@ -339,13 +341,13 @@ func (c *VisionConn) unPadding(buffer []byte) []*buf.Buffer {
339341 }
340342 }
341343 if c .remainingContent == - 1 && c .remainingPadding == - 1 {
342- return []* buf.Buffer {buf .As (buffer )}
344+ return []* buf.Buffer {buf .As (buffer ). ToOwned () }
343345 }
344346 var buffers []* buf.Buffer
345347 for bufferIndex < len (buffer ) {
346348 if c .remainingContent <= 0 && c .remainingPadding <= 0 {
347349 if c .currentCommand == 1 {
348- buffers = append (buffers , buf .As (buffer [bufferIndex :]))
350+ buffers = append (buffers , buf .As (buffer [bufferIndex :]). ToOwned () )
349351 break
350352 } else {
351353 paddingInfo := buffer [bufferIndex : bufferIndex + 5 ]
@@ -360,7 +362,7 @@ func (c *VisionConn) unPadding(buffer []byte) []*buf.Buffer {
360362 if end > len (buffer )- bufferIndex {
361363 end = len (buffer ) - bufferIndex
362364 }
363- buffers = append (buffers , buf .As (buffer [bufferIndex :bufferIndex + end ]))
365+ buffers = append (buffers , buf .As (buffer [bufferIndex :bufferIndex + end ]). ToOwned () )
364366 c .remainingContent -= end
365367 bufferIndex += end
366368 } else {
0 commit comments