I have the following code that I think is leaking heavily. And analysing it I suspect that the defer r.Close()
is never called.
Would there be a better way of using the Reader and gzip here at all?
// Read client data from channel
func (c *Client) listen() {
timeoutDuration := 30 * time.Second
reader := bufio.NewReader(c.conn)
clientBuffer := new(bytes.Buffer)
for {
c.conn.SetReadDeadline(time.Now().Add(timeoutDuration))
byte, err := reader.ReadByte()
if err != nil {
c.conn.Close()
c.server.onClientConnectionClosed(c, err)
return
}
clientBuffer.WriteByte(byte)
packet := popPacketFromBuffer(clientBuffer)
if packet != nil {
packetBuffer := bytes.NewBuffer(packet)
r, _ := gzip.NewReader(packetBuffer)
defer r.Close()
b, err := ioutil.ReadAll(r)
if err != nil {
log.Fatal(err)
}
c.server.onNewMessage(c, b)
}
}
}