diff --git a/src/MySqlConnector/MySqlConnection.cs b/src/MySqlConnector/MySqlConnection.cs index c1084afd8..2f7f11830 100644 --- a/src/MySqlConnector/MySqlConnection.cs +++ b/src/MySqlConnector/MySqlConnection.cs @@ -767,7 +767,12 @@ internal void Cancel(ICancellableCommand command, int commandId, bool isCancel) var cancellationTimeout = GetConnectionSettings().CancellationTimeout; csb.ConnectionTimeout = cancellationTimeout < 1 ? 3u : (uint) cancellationTimeout; - using var connection = new MySqlConnection(csb.ConnectionString); + using var connection = new MySqlConnection(csb.ConnectionString) + { + ProvideClientCertificatesCallback = ProvideClientCertificatesCallback, + ProvidePasswordCallback = ProvidePasswordCallback, + RemoteCertificateValidationCallback = RemoteCertificateValidationCallback, + }; connection.Open(); using var killCommand = new MySqlCommand("KILL QUERY {0}".FormatInvariant(command.Connection!.ServerThread), connection); killCommand.CommandTimeout = cancellationTimeout < 1 ? 3 : cancellationTimeout; diff --git a/tests/SideBySide/CancelTests.cs b/tests/SideBySide/CancelTests.cs index 514f3d349..74d490b91 100644 --- a/tests/SideBySide/CancelTests.cs +++ b/tests/SideBySide/CancelTests.cs @@ -38,6 +38,49 @@ public void CancelCommand() task.Wait(); // shouldn't throw } + [SkippableFact(ServerFeatures.CancelSleepSuccessfully)] + public async Task CancelCommandWithPasswordCallback() + { + var csb = AppConfig.CreateConnectionStringBuilder(); + var password = csb.Password; + csb.Password = null; + using var connection = new MySqlConnection(csb.ConnectionString) + { + ProvidePasswordCallback = _ => password, + }; + await connection.OpenAsync(); + using var command = new MySqlCommand("SELECT SLEEP(5)", connection); + var task = Task.Run(async () => + { + await Task.Delay(TimeSpan.FromSeconds(0.5)); + command.Cancel(); + }); + + var stopwatch = Stopwatch.StartNew(); + TestUtilities.AssertIsOne(await command.ExecuteScalarAsync()); + Assert.InRange(stopwatch.ElapsedMilliseconds, 250, 2500); + + task.Wait(); // shouldn't throw + } + + [SkippableFact(ServerFeatures.CancelSleepSuccessfully)] + public async Task CancelCommandCancellationTokenWithPasswordCallback() + { + var csb = AppConfig.CreateConnectionStringBuilder(); + var password = csb.Password; + csb.Password = null; + using var connection = new MySqlConnection(csb.ConnectionString) + { + ProvidePasswordCallback = _ => password, + }; + await connection.OpenAsync(); + using var command = new MySqlCommand("SELECT SLEEP(5)", connection); + using var cts = new CancellationTokenSource(TimeSpan.FromMilliseconds(500)); + var stopwatch = Stopwatch.StartNew(); + TestUtilities.AssertIsOne(await command.ExecuteScalarAsync(cts.Token)); + Assert.InRange(stopwatch.ElapsedMilliseconds, 250, 2500); + } + [SkippableFact(ServerFeatures.StreamingResults | ServerFeatures.Timeout)] public void CancelReaderAsynchronously() {