Skip to content

Commit

Permalink
Reuse buffer
Browse files Browse the repository at this point in the history
  • Loading branch information
jrouzierinverse committed Dec 8, 2023
1 parent 2efe855 commit f42ad90
Showing 1 changed file with 11 additions and 10 deletions.
21 changes: 11 additions & 10 deletions share/cnet/conn_ws.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package cnet

import (
"bytes"
"net"
"time"

Expand All @@ -9,41 +10,41 @@ import (

type wsConn struct {
*websocket.Conn
buff []byte
buff *bytes.Buffer
}

//NewWebSocketConn converts a websocket.Conn into a net.Conn
// NewWebSocketConn converts a websocket.Conn into a net.Conn
func NewWebSocketConn(websocketConn *websocket.Conn) net.Conn {
c := wsConn{
Conn: websocketConn,
buff: &bytes.Buffer{},
}
return &c
}

//Read is not threadsafe though thats okay since there
//should never be more than one reader
// Read is not threadsafe though thats okay since there
// should never be more than one reader
func (c *wsConn) Read(dst []byte) (int, error) {
ldst := len(dst)
//use buffer or read new message
var src []byte
if len(c.buff) > 0 {
src = c.buff
c.buff = nil
if c.buff.Len() > 0 {
src = c.buff.Bytes()
c.buff.Reset()
} else if _, msg, err := c.Conn.ReadMessage(); err == nil {
src = msg
} else {
return 0, err
}

//copy src->dest
var n int
if len(src) > ldst {
//copy as much as possible of src into dst
n = copy(dst, src[:ldst])
//copy remainder into buffer
r := src[ldst:]
lr := len(r)
c.buff = make([]byte, lr)
copy(c.buff, r)
c.buff.Write(r)
} else {
//copy all of src into dst
n = copy(dst, src)
Expand Down

0 comments on commit f42ad90

Please sign in to comment.