From 67d56644b2e9dd034fbd14575b9afe0cdc179f35 Mon Sep 17 00:00:00 2001 From: Christian Kratky Date: Sat, 4 Apr 2020 12:54:33 +0200 Subject: [PATCH] Expose custom session items in session status. --- Build/MQTTnet.nuspec | 1 + Source/MQTTnet/Server/MqttClientSession.cs | 5 +-- .../Server/Status/IMqttClientStatus.cs | 8 ++--- .../Server/Status/IMqttSessionStatus.cs | 9 +++-- .../MQTTnet/Server/Status/MqttClientStatus.cs | 8 ++--- .../Server/Status/MqttSessionStatus.cs | 11 ++++--- Tests/MQTTnet.Core.Tests/Session_Tests.cs | 33 ++++++++++++++++--- 7 files changed, 54 insertions(+), 21 deletions(-) diff --git a/Build/MQTTnet.nuspec b/Build/MQTTnet.nuspec index 57c87c2a..e055a25c 100644 --- a/Build/MQTTnet.nuspec +++ b/Build/MQTTnet.nuspec @@ -25,6 +25,7 @@ * [Server] Added support for assigned client IDs (MQTTv5 only) (thanks to @bcrosnier). * [Server] Added interceptor for unsubscriptions. * [Server] Removed exceptions when user properties are set with MQTT protocol version 3.1 +* [Server] Added custom session items to the client status. * [MQTTnet.AspNetCore] improved compatibility with AspNetCore 3.1 * [MQTTnet.Server] Added interceptor for unsubscriptions. diff --git a/Source/MQTTnet/Server/MqttClientSession.cs b/Source/MQTTnet/Server/MqttClientSession.cs index e0d21753..70b04d95 100644 --- a/Source/MQTTnet/Server/MqttClientSession.cs +++ b/Source/MQTTnet/Server/MqttClientSession.cs @@ -8,9 +8,9 @@ namespace MQTTnet.Server { public class MqttClientSession { - private readonly IMqttNetLogger _logger; + readonly IMqttNetLogger _logger; - private readonly DateTime _createdTimestamp = DateTime.UtcNow; + readonly DateTime _createdTimestamp = DateTime.UtcNow; public MqttClientSession(string clientId, IDictionary items, MqttServerEventDispatcher eventDispatcher, IMqttServerOptions serverOptions, IMqttNetLogger logger) { @@ -73,6 +73,7 @@ namespace MQTTnet.Server status.ClientId = ClientId; status.CreatedTimestamp = _createdTimestamp; status.PendingApplicationMessagesCount = ApplicationMessagesQueue.Count; + status.Items = Items; } } } \ No newline at end of file diff --git a/Source/MQTTnet/Server/Status/IMqttClientStatus.cs b/Source/MQTTnet/Server/Status/IMqttClientStatus.cs index bbf4799f..d7debdc6 100644 --- a/Source/MQTTnet/Server/Status/IMqttClientStatus.cs +++ b/Source/MQTTnet/Server/Status/IMqttClientStatus.cs @@ -1,6 +1,6 @@ -using System; +using MQTTnet.Formatter; +using System; using System.Threading.Tasks; -using MQTTnet.Formatter; namespace MQTTnet.Server.Status { @@ -9,7 +9,7 @@ namespace MQTTnet.Server.Status string ClientId { get; } string Endpoint { get; } - + MqttProtocolVersion ProtocolVersion { get; } DateTime LastPacketReceivedTimestamp { get; } @@ -29,7 +29,7 @@ namespace MQTTnet.Server.Status long BytesSent { get; } long BytesReceived { get; } - + Task DisconnectAsync(); void ResetStatistics(); diff --git a/Source/MQTTnet/Server/Status/IMqttSessionStatus.cs b/Source/MQTTnet/Server/Status/IMqttSessionStatus.cs index 349f715e..2ff996b1 100644 --- a/Source/MQTTnet/Server/Status/IMqttSessionStatus.cs +++ b/Source/MQTTnet/Server/Status/IMqttSessionStatus.cs @@ -1,12 +1,15 @@ -using System.Threading.Tasks; +using System.Collections.Generic; +using System.Threading.Tasks; namespace MQTTnet.Server.Status { public interface IMqttSessionStatus { - string ClientId { get; set; } + string ClientId { get; } - long PendingApplicationMessagesCount { get; set; } + long PendingApplicationMessagesCount { get; } + + IDictionary Items { get; } Task ClearPendingApplicationMessagesAsync(); diff --git a/Source/MQTTnet/Server/Status/MqttClientStatus.cs b/Source/MQTTnet/Server/Status/MqttClientStatus.cs index 553795f4..7f6448f2 100644 --- a/Source/MQTTnet/Server/Status/MqttClientStatus.cs +++ b/Source/MQTTnet/Server/Status/MqttClientStatus.cs @@ -1,16 +1,16 @@ -using System; +using MQTTnet.Formatter; +using System; using System.Threading.Tasks; -using MQTTnet.Formatter; namespace MQTTnet.Server.Status { public class MqttClientStatus : IMqttClientStatus { - private readonly MqttClientConnection _connection; + readonly MqttClientConnection _connection; public MqttClientStatus(MqttClientConnection connection) { - _connection = connection; + _connection = connection ?? throw new ArgumentNullException(nameof(connection)); } public string ClientId { get; set; } diff --git a/Source/MQTTnet/Server/Status/MqttSessionStatus.cs b/Source/MQTTnet/Server/Status/MqttSessionStatus.cs index 451644c6..2dfe22fd 100644 --- a/Source/MQTTnet/Server/Status/MqttSessionStatus.cs +++ b/Source/MQTTnet/Server/Status/MqttSessionStatus.cs @@ -1,12 +1,13 @@ using System; +using System.Collections.Generic; using System.Threading.Tasks; namespace MQTTnet.Server.Status { public class MqttSessionStatus : IMqttSessionStatus { - private readonly MqttClientSession _session; - private readonly MqttClientSessionsManager _sessionsManager; + readonly MqttClientSession _session; + readonly MqttClientSessionsManager _sessionsManager; public MqttSessionStatus(MqttClientSession session, MqttClientSessionsManager sessionsManager) { @@ -17,14 +18,16 @@ namespace MQTTnet.Server.Status public string ClientId { get; set; } public long PendingApplicationMessagesCount { get; set; } - + public DateTime CreatedTimestamp { get; set; } + public IDictionary Items { get; set; } + public Task DeleteAsync() { return _sessionsManager.DeleteSessionAsync(ClientId); } - + public Task ClearPendingApplicationMessagesAsync() { _session.ApplicationMessagesQueue.Clear(); diff --git a/Tests/MQTTnet.Core.Tests/Session_Tests.cs b/Tests/MQTTnet.Core.Tests/Session_Tests.cs index 073f272c..973fbf3e 100644 --- a/Tests/MQTTnet.Core.Tests/Session_Tests.cs +++ b/Tests/MQTTnet.Core.Tests/Session_Tests.cs @@ -1,10 +1,11 @@ -using System.Text; -using System.Threading.Tasks; -using Microsoft.VisualStudio.TestTools.UnitTesting; +using Microsoft.VisualStudio.TestTools.UnitTesting; using MQTTnet.Client; using MQTTnet.Client.Subscribing; using MQTTnet.Server; using MQTTnet.Tests.Mockups; +using System.Linq; +using System.Text; +using System.Threading.Tasks; namespace MQTTnet.Tests { @@ -42,7 +43,7 @@ namespace MQTTnet.Tests string receivedPayload = null; var client = await testEnvironment.ConnectClientAsync(); - client.UseApplicationMessageReceivedHandler(delegate(MqttApplicationMessageReceivedEventArgs args) + client.UseApplicationMessageReceivedHandler(delegate (MqttApplicationMessageReceivedEventArgs args) { receivedPayload = args.ApplicationMessage.ConvertPayloadToString(); }); @@ -59,5 +60,29 @@ namespace MQTTnet.Tests Assert.AreEqual("Hello World", receivedPayload); } } + + [TestMethod] + public async Task Get_Session_Items_In_Status() + { + using (var testEnvironment = new TestEnvironment(TestContext)) + { + var serverOptions = new MqttServerOptionsBuilder() + .WithConnectionValidator(delegate (MqttConnectionValidatorContext context) + { + // Don't validate anything. Just set some session items. + context.SessionItems["can_subscribe_x"] = true; + context.SessionItems["default_payload"] = "Hello World"; + }); + + await testEnvironment.StartServerAsync(serverOptions); + + var client = await testEnvironment.ConnectClientAsync(); + + var sessionStatus = await testEnvironment.Server.GetSessionStatusAsync(); + var session = sessionStatus.First(); + + Assert.AreEqual(true, session.Items["can_subscribe_x"]); + } + } } }