From e798c91ff3be9259387d7e7e9f8d66bb3e90d048 Mon Sep 17 00:00:00 2001 From: Christian Kratky Date: Fri, 24 Apr 2020 19:29:03 +0200 Subject: [PATCH] Fix exception handling when using invalid host names upon connect. --- Build/MQTTnet.nuspec | 1 + Source/MQTTnet/Client/MqttClient.cs | 2 +- .../MQTTnet/Implementations/MqttTcpChannel.cs | 2 ++ Tests/MQTTnet.Core.Tests/MqttClient_Tests.cs | 24 +++++++++++++++++++ 4 files changed, 28 insertions(+), 1 deletion(-) diff --git a/Build/MQTTnet.nuspec b/Build/MQTTnet.nuspec index 076bbfae..549c37fe 100644 --- a/Build/MQTTnet.nuspec +++ b/Build/MQTTnet.nuspec @@ -17,6 +17,7 @@ * [Client] Added method to trigger PING/PONG manually (connection check etc.). * [Client] Added support for certificate validation callback when using Web Sockets (requires netstandard2.1+). * [Client] Fixed a memory leak when web socket based connections trying to reconnect with an offline server. +* [Client] Fixed an issue when connecting to an invalid host (format). * [ManagedClient] Added method to trigger PING/PONG manually (connection check etc.). * [MQTTnet.AspNetCore] improved compatibility with AspNetCore 3.1. * [MQTTnet.AspNetCore] Fixed a packaging issue with the Nuget package. diff --git a/Source/MQTTnet/Client/MqttClient.cs b/Source/MQTTnet/Client/MqttClient.cs index 4ace9086..f81cd3d8 100644 --- a/Source/MQTTnet/Client/MqttClient.cs +++ b/Source/MQTTnet/Client/MqttClient.cs @@ -333,7 +333,7 @@ namespace MQTTnet.Client await Task.WhenAll(receiverTask, publishPacketReceiverTask, keepAliveTask).ConfigureAwait(false); - _publishPacketReceiverQueue.Dispose(); + _publishPacketReceiverQueue?.Dispose(); } catch (Exception e) { diff --git a/Source/MQTTnet/Implementations/MqttTcpChannel.cs b/Source/MQTTnet/Implementations/MqttTcpChannel.cs index 756993fc..4449f202 100644 --- a/Source/MQTTnet/Implementations/MqttTcpChannel.cs +++ b/Source/MQTTnet/Implementations/MqttTcpChannel.cs @@ -71,6 +71,8 @@ namespace MQTTnet.Implementations await socket.ConnectAsync(_options.Server, _options.GetPort(), cancellationToken).ConfigureAwait(false); + cancellationToken.ThrowIfCancellationRequested(); + var networkStream = socket.GetStream(); if (_options.TlsOptions?.UseTls == true) diff --git a/Tests/MQTTnet.Core.Tests/MqttClient_Tests.cs b/Tests/MQTTnet.Core.Tests/MqttClient_Tests.cs index b7c8a47e..2924e8e5 100644 --- a/Tests/MQTTnet.Core.Tests/MqttClient_Tests.cs +++ b/Tests/MQTTnet.Core.Tests/MqttClient_Tests.cs @@ -23,6 +23,30 @@ namespace MQTTnet.Tests { public TestContext TestContext { get; set; } + [TestMethod] + [ExpectedException(typeof(MqttCommunicationTimedOutException))] + public async Task Connect_To_Invalid_Server_Wrong_IP() + { + var client = new MqttFactory().CreateMqttClient(); + await client.ConnectAsync(new MqttClientOptionsBuilder().WithTcpServer("1.2.3.4").WithCommunicationTimeout(TimeSpan.FromSeconds(2)).Build()); + } + + [TestMethod] + [ExpectedException(typeof(MqttCommunicationException))] + public async Task Connect_To_Invalid_Server_Port_Not_Opened() + { + var client = new MqttFactory().CreateMqttClient(); + await client.ConnectAsync(new MqttClientOptionsBuilder().WithTcpServer("127.0.0.1", 12345).WithCommunicationTimeout(TimeSpan.FromSeconds(2)).Build()); + } + + [TestMethod] + [ExpectedException(typeof(MqttCommunicationException))] + public async Task Connect_To_Invalid_Server_Wrong_Protocol() + { + var client = new MqttFactory().CreateMqttClient(); + await client.ConnectAsync(new MqttClientOptionsBuilder().WithTcpServer("http://127.0.0.1", 12345).WithCommunicationTimeout(TimeSpan.FromSeconds(2)).Build()); + } + [TestMethod] public async Task Send_Manual_Ping() {