@@ -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; | |||
} | |||
} |
@@ -280,16 +280,25 @@ namespace MQTTnet.Client | |||
async Task<MqttClientAuthenticateResult> AuthenticateAsync(IMqttChannelAdapter channelAdapter, MqttApplicationMessage willApplicationMessage, CancellationToken cancellationToken) | |||
{ | |||
var connectPacket = channelAdapter.PacketFormatterAdapter.DataConverter.CreateConnectPacket( | |||
willApplicationMessage, | |||
Options); | |||
MqttClientAuthenticateResult result; | |||
var connAckPacket = await SendAndReceiveAsync<MqttConnAckPacket>(connectPacket, cancellationToken).ConfigureAwait(false); | |||
var result = channelAdapter.PacketFormatterAdapter.DataConverter.CreateClientConnectResult(connAckPacket); | |||
try | |||
{ | |||
var connectPacket = channelAdapter.PacketFormatterAdapter.DataConverter.CreateConnectPacket( | |||
willApplicationMessage, | |||
Options); | |||
var connAckPacket = await SendAndReceiveAsync<MqttConnAckPacket>(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 | |||
@@ -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<MqttCommunicationException>(async () => await client.ConnectAsync(clientOptions)); | |||
var ex = await Assert.ThrowsExceptionAsync<MqttConnectingFailedException>(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); | |||
} | |||
} | |||