diff --git a/Source/MQTTnet/Adapter/MqttConnectingFailedException.cs b/Source/MQTTnet/Adapter/MqttConnectingFailedException.cs index ab49d934..447aaa69 100644 --- a/Source/MQTTnet/Adapter/MqttConnectingFailedException.cs +++ b/Source/MQTTnet/Adapter/MqttConnectingFailedException.cs @@ -1,17 +1,19 @@ -using MQTTnet.Client.Connecting; +using System; +using MQTTnet.Client.Connecting; using MQTTnet.Exceptions; namespace MQTTnet.Adapter { - public class MqttConnectingFailedException : MqttCommunicationException + public sealed class MqttConnectingFailedException : MqttCommunicationException { - public MqttConnectingFailedException(MqttClientAuthenticateResult result) - : base($"Connecting with MQTT server failed ({result.ResultCode.ToString()}).") + public MqttConnectingFailedException(string message, Exception innerException, MqttClientAuthenticateResult authenticateResult) + : base(message, innerException) { - Result = result; + Result = authenticateResult; } public MqttClientAuthenticateResult Result { get; } - public MqttClientConnectResultCode ResultCode => Result.ResultCode; + + public MqttClientConnectResultCode ResultCode => Result?.ResultCode ?? MqttClientConnectResultCode.UnspecifiedError; } } diff --git a/Source/MQTTnet/Client/MqttClient.cs b/Source/MQTTnet/Client/MqttClient.cs index 6b454d90..3414e990 100644 --- a/Source/MQTTnet/Client/MqttClient.cs +++ b/Source/MQTTnet/Client/MqttClient.cs @@ -280,16 +280,25 @@ namespace MQTTnet.Client async Task AuthenticateAsync(IMqttChannelAdapter channelAdapter, MqttApplicationMessage willApplicationMessage, CancellationToken cancellationToken) { - var connectPacket = channelAdapter.PacketFormatterAdapter.DataConverter.CreateConnectPacket( - willApplicationMessage, - Options); + MqttClientAuthenticateResult result; - var connAckPacket = await SendAndReceiveAsync(connectPacket, cancellationToken).ConfigureAwait(false); - var result = channelAdapter.PacketFormatterAdapter.DataConverter.CreateClientConnectResult(connAckPacket); + try + { + var connectPacket = channelAdapter.PacketFormatterAdapter.DataConverter.CreateConnectPacket( + willApplicationMessage, + Options); + + var connAckPacket = await SendAndReceiveAsync(connectPacket, cancellationToken).ConfigureAwait(false); + result = channelAdapter.PacketFormatterAdapter.DataConverter.CreateClientConnectResult(connAckPacket); + } + catch (Exception exception) + { + throw new MqttConnectingFailedException($"Error while authenticating. {exception.Message}", exception, null); + } if (result.ResultCode != MqttClientConnectResultCode.Success) { - throw new MqttConnectingFailedException(result); + throw new MqttConnectingFailedException($"Connecting with MQTT server failed ({result.ResultCode}).", null, result); } _logger.Verbose("Authenticated MQTT connection with server established."); @@ -404,10 +413,10 @@ namespace MQTTnet.Client _sendTracker.Restart(); await _adapter.SendPacketAsync(requestPacket, cancellationToken).ConfigureAwait(false); } - catch (Exception e) + catch (Exception exception) { - _logger.Warning(e, "Error when sending request packet ({0}).", requestPacket.GetType().Name); - packetAwaiter.Cancel(); + _logger.Warning(exception, "Error when sending request packet ({0}).", requestPacket.GetType().Name); + packetAwaiter.Fail(exception); } try diff --git a/Tests/MQTTnet.Core.Tests/Server_Tests.cs b/Tests/MQTTnet.Core.Tests/Server_Tests.cs index a5e6837f..09f085bb 100644 --- a/Tests/MQTTnet.Core.Tests/Server_Tests.cs +++ b/Tests/MQTTnet.Core.Tests/Server_Tests.cs @@ -1,4 +1,4 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; +using Microsoft.VisualStudio.TestTools.UnitTesting; using MQTTnet.Adapter; using MQTTnet.Client; using MQTTnet.Client.Connecting; @@ -69,9 +69,9 @@ namespace MQTTnet.Tests .WithCredentials(username, password) .Build(); - var ex = await Assert.ThrowsExceptionAsync(async () => await client.ConnectAsync(clientOptions)); + var ex = await Assert.ThrowsExceptionAsync(async () => await client.ConnectAsync(clientOptions)); Assert.IsInstanceOfType(ex.InnerException, typeof(MqttProtocolViolationException)); - Assert.AreEqual("If the User Name Flag is set to 0, the Password Flag MUST be set to 0 [MQTT-3.1.2-22].", ex.Message, false); + Assert.AreEqual("Error while authenticating. If the User Name Flag is set to 0, the Password Flag MUST be set to 0 [MQTT-3.1.2-22].", ex.Message, false); } } @@ -466,7 +466,7 @@ namespace MQTTnet.Tests public async Task Publish_Multiple_Clients() { var receivedMessagesCount = 0; - + using (var testEnvironment = new TestEnvironment(TestContext)) { await testEnvironment.StartServerAsync(); @@ -496,7 +496,7 @@ namespace MQTTnet.Tests } SpinWait.SpinUntil(() => receivedMessagesCount == 1000, TimeSpan.FromSeconds(20)); - + Assert.AreEqual(1000, receivedMessagesCount); } }