in internal/server/server.go [112:159]
func handleConn(c net.Conn) {
defer recoverPanic()
log.Infof("Client connected (%s)", c.RemoteAddr().Network())
defer c.Close()
header := make([]byte, util.HeaderLen)
for {
n, err := util.ReadBytes(c, header, util.HeaderLen)
if util.ReadErr(n, err, util.HeaderLen) {
break
}
ty := header[0]
// we only use last 3 bytes to store the length, so the first byte is
// consider zero
header[0] = 0
length := binary.BigEndian.Uint32(header)
log.Infof("receive rpc type: %d data length: %d", ty, length)
buf := make([]byte, length)
n, err = util.ReadBytes(c, buf, int(length))
if util.ReadErr(n, err, int(length)) {
break
}
bd, respTy := dispatchRPC(ty, buf, c)
out := bd.FinishedBytes()
size := len(out)
binary.BigEndian.PutUint32(header, uint32(size))
header[0] = respTy
n, err = util.WriteBytes(c, header, len(header))
if err != nil {
util.WriteErr(n, err)
break
}
n, err = util.WriteBytes(c, out, size)
if err != nil {
util.WriteErr(n, err)
break
}
util.PutBuilder(bd)
}
}