encode method

  1. @override
Uint8List encode()
override

Codifica o pacote de handshake response em um Uint8List para envio ao servidor.

A codificação segue a especificação do protocolo:

  1. capabilityFlags (4 bytes, little-endian)
  2. maxPacketSize (4 bytes, little-endian)
  3. characterSet (1 byte)
  4. 23 bytes de preenchimento (0x00)
  5. username (string UTF-8 seguida de 0x00)
  6. Se a flag mysqlCapFlagClientSecureConnection estiver ativa:
    • tamanho do authResponse (length-encoded integer)
    • authResponse (bytes)
  7. Se houver database e a flag mysqlCapFlagClientConnectWithDB estiver ativa:
    • database (string UTF-8 seguida de 0x00)
  8. Se a flag mysqlCapFlagClientPluginAuth estiver ativa:
    • authPluginName (string UTF-8 seguida de 0x00)

Implementation

@override
Uint8List encode() {
  final buffer = ByteDataWriter(endian: Endian.little);

  // Se um banco de dados foi especificado, ativa a flag de conexão com DB.
  if (database != null) {
    capabilityFlags = capabilityFlags | mysqlCapFlagClientConnectWithDB;
  }

  // Escreve capabilityFlags (4 bytes)
  buffer.writeUint32(capabilityFlags);
  // Escreve maxPacketSize (4 bytes)
  buffer.writeUint32(maxPacketSize);
  // Escreve characterSet (1 byte)
  buffer.writeUint8(characterSet);
  // Escreve 23 bytes de preenchimento (zeros)
  buffer.write(List.filled(23, 0));
  // Escreve o username seguido de um byte nulo
  buffer.write(utf8.encode(username));
  buffer.writeUint8(0);

  // Se a flag de conexão segura estiver ativa, envia o authResponse.
  if (capabilityFlags & mysqlCapFlagClientSecureConnection != 0) {
    // Escreve o tamanho do authResponse como um inteiro length-encoded
    buffer.writeVariableEncInt(authResponse.lengthInBytes);
    // Escreve os dados de autenticação
    buffer.write(authResponse);
  }

  // Se o banco de dados foi especificado e a flag de conexão com DB estiver ativa,
  // escreve o nome do database seguido de um byte nulo.
  if (database != null &&
      capabilityFlags & mysqlCapFlagClientConnectWithDB != 0) {
    buffer.write(utf8.encode(database!));
    buffer.writeUint8(0);
  }

  // Se a flag de plugin de autenticação estiver ativa, envia o nome do plugin.
  if (capabilityFlags & mysqlCapFlagClientPluginAuth != 0) {
    buffer.write(utf8.encode(authPluginName));
    buffer.writeUint8(0);
  }

  return buffer.toBytes();
}