|
@@ -268,33 +268,58 @@ func newConn(conn net.Conn, isServer bool, readBufferSize, writeBufferSize int)
|
|
|
return newConnBRW(conn, isServer, readBufferSize, writeBufferSize, nil)
|
|
return newConnBRW(conn, isServer, readBufferSize, writeBufferSize, nil)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+type writeHook struct {
|
|
|
|
|
+ p []byte
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func (wh *writeHook) Write(p []byte) (int, error) {
|
|
|
|
|
+ wh.p = p
|
|
|
|
|
+ return len(p), nil
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
func newConnBRW(conn net.Conn, isServer bool, readBufferSize, writeBufferSize int, brw *bufio.ReadWriter) *Conn {
|
|
func newConnBRW(conn net.Conn, isServer bool, readBufferSize, writeBufferSize int, brw *bufio.ReadWriter) *Conn {
|
|
|
mu := make(chan bool, 1)
|
|
mu := make(chan bool, 1)
|
|
|
mu <- true
|
|
mu <- true
|
|
|
|
|
|
|
|
- if readBufferSize == 0 {
|
|
|
|
|
- readBufferSize = defaultReadBufferSize
|
|
|
|
|
- }
|
|
|
|
|
- if readBufferSize < maxControlFramePayloadSize {
|
|
|
|
|
- readBufferSize = maxControlFramePayloadSize
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- // Reuse the supplied brw.Reader if brw.Reader's buf is the requested size.
|
|
|
|
|
var br *bufio.Reader
|
|
var br *bufio.Reader
|
|
|
- if brw != nil && brw.Reader != nil {
|
|
|
|
|
- // This code assumes that peek on a reset reader returns
|
|
|
|
|
|
|
+ if readBufferSize == 0 && brw != nil && brw.Reader != nil {
|
|
|
|
|
+ // Reuse the supplied bufio.Reader if the buffer has a useful size.
|
|
|
|
|
+ // This code assumes that peek on a reader returns
|
|
|
// bufio.Reader.buf[:0].
|
|
// bufio.Reader.buf[:0].
|
|
|
brw.Reader.Reset(conn)
|
|
brw.Reader.Reset(conn)
|
|
|
- if p, err := brw.Reader.Peek(0); err == nil && cap(p) == readBufferSize {
|
|
|
|
|
|
|
+ if p, err := brw.Reader.Peek(0); err == nil && cap(p) >= 256 {
|
|
|
br = brw.Reader
|
|
br = brw.Reader
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
if br == nil {
|
|
if br == nil {
|
|
|
|
|
+ if readBufferSize == 0 {
|
|
|
|
|
+ readBufferSize = defaultReadBufferSize
|
|
|
|
|
+ }
|
|
|
|
|
+ if readBufferSize < maxControlFramePayloadSize {
|
|
|
|
|
+ readBufferSize = maxControlFramePayloadSize
|
|
|
|
|
+ }
|
|
|
br = bufio.NewReaderSize(conn, readBufferSize)
|
|
br = bufio.NewReaderSize(conn, readBufferSize)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if writeBufferSize == 0 {
|
|
|
|
|
- writeBufferSize = defaultWriteBufferSize
|
|
|
|
|
|
|
+ var writeBuf []byte
|
|
|
|
|
+ if writeBufferSize == 0 && brw != nil && brw.Writer != nil {
|
|
|
|
|
+ // Use the bufio.Writer's buffer if the buffer has a useful size. This
|
|
|
|
|
+ // code assumes that bufio.Writer.buf[:1] is passed to the
|
|
|
|
|
+ // bufio.Writer's underlying writer.
|
|
|
|
|
+ var wh writeHook
|
|
|
|
|
+ brw.Writer.Reset(&wh)
|
|
|
|
|
+ brw.Writer.WriteByte(0)
|
|
|
|
|
+ brw.Flush()
|
|
|
|
|
+ if cap(wh.p) >= maxFrameHeaderSize+256 {
|
|
|
|
|
+ writeBuf = wh.p[:cap(wh.p)]
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if writeBuf == nil {
|
|
|
|
|
+ if writeBufferSize == 0 {
|
|
|
|
|
+ writeBufferSize = defaultWriteBufferSize
|
|
|
|
|
+ }
|
|
|
|
|
+ writeBuf = make([]byte, writeBufferSize+maxFrameHeaderSize)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
c := &Conn{
|
|
c := &Conn{
|
|
@@ -303,7 +328,7 @@ func newConnBRW(conn net.Conn, isServer bool, readBufferSize, writeBufferSize in
|
|
|
conn: conn,
|
|
conn: conn,
|
|
|
mu: mu,
|
|
mu: mu,
|
|
|
readFinal: true,
|
|
readFinal: true,
|
|
|
- writeBuf: make([]byte, writeBufferSize+maxFrameHeaderSize),
|
|
|
|
|
|
|
+ writeBuf: writeBuf,
|
|
|
enableWriteCompression: true,
|
|
enableWriteCompression: true,
|
|
|
compressionLevel: defaultCompressionLevel,
|
|
compressionLevel: defaultCompressionLevel,
|
|
|
}
|
|
}
|