func handleConn()

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)
	}
}