Browse Source

add WriteMultiBuffer for interConn

Darien Raymond 7 years ago
parent
commit
3a1cf06dc1
1 changed files with 34 additions and 1 deletions
  1. 34 1
      transport/internet/quic/conn.go

+ 34 - 1
transport/internet/quic/conn.go

@@ -7,8 +7,9 @@ import (
 	"time"
 	"time"
 
 
 	quic "github.com/lucas-clemente/quic-go"
 	quic "github.com/lucas-clemente/quic-go"
-
 	"v2ray.com/core/common"
 	"v2ray.com/core/common"
+	"v2ray.com/core/common/buf"
+	"v2ray.com/core/common/bytespool"
 	"v2ray.com/core/common/net"
 	"v2ray.com/core/common/net"
 	"v2ray.com/core/transport/internet"
 	"v2ray.com/core/transport/internet"
 )
 )
@@ -142,6 +143,38 @@ func (c *interConn) Read(b []byte) (int, error) {
 	return c.stream.Read(b)
 	return c.stream.Read(b)
 }
 }
 
 
+func (c *interConn) WriteMultiBuffer(mb buf.MultiBuffer) error {
+	if mb.IsEmpty() {
+		return nil
+	}
+
+	if len(mb) == 1 {
+		_, err := c.Write(mb[0].Bytes())
+		buf.ReleaseMulti(mb)
+		return err
+	}
+
+	b := bytespool.Alloc(32 * 1024)
+	defer bytespool.Free(b)
+
+	reader := buf.MultiBufferContainer{
+		MultiBuffer: mb,
+	}
+	defer reader.Close()
+
+	for {
+		nBytes, err := reader.Read(b)
+		if err != nil {
+			break
+		}
+		if _, err := c.Write(b[:nBytes]); err != nil {
+			return err
+		}
+	}
+
+	return nil
+}
+
 func (c *interConn) Write(b []byte) (int, error) {
 func (c *interConn) Write(b []byte) (int, error) {
 	return c.stream.Write(b)
 	return c.stream.Write(b)
 }
 }