encode method
Codifica o pacote de handshake response em um Uint8List para envio ao servidor.
A codificação segue a especificação do protocolo:
- capabilityFlags (4 bytes, little-endian)
- maxPacketSize (4 bytes, little-endian)
- characterSet (1 byte)
- 23 bytes de preenchimento (0x00)
- username (string UTF-8 seguida de 0x00)
- Se a flag mysqlCapFlagClientSecureConnection estiver ativa:
- tamanho do authResponse (length-encoded integer)
- authResponse (bytes)
- Se houver database e a flag mysqlCapFlagClientConnectWithDB estiver ativa:
- database (string UTF-8 seguida de 0x00)
- 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();
}