Fix MQTT v5 topic alias forwarding (#2250)

This commit is contained in:
Suhas Holla Karkada Chandrashekar
2026-06-13 18:04:42 +02:00
committed by GitHub
parent 8321806acf
commit bca2ded8eb
3 changed files with 9 additions and 4 deletions
@@ -218,6 +218,8 @@ public sealed class MqttConnectedClient : IDisposable
HandleTopicAlias(publishPacket); HandleTopicAlias(publishPacket);
var applicationMessage = MqttApplicationMessageFactory.Create(publishPacket); var applicationMessage = MqttApplicationMessageFactory.Create(publishPacket);
// Topic aliases are scoped to this network connection and must not be forwarded to other clients.
applicationMessage.TopicAlias = 0;
var dispatchApplicationMessageResult = var dispatchApplicationMessageResult =
await _sessionsManager.DispatchApplicationMessage(Id, UserName, Session.Items, applicationMessage, cancellationToken).ConfigureAwait(false); await _sessionsManager.DispatchApplicationMessage(Id, UserName, Session.Items, applicationMessage, cancellationToken).ConfigureAwait(false);
@@ -579,4 +581,4 @@ public sealed class MqttConnectedClient : IDisposable
_logger.Warning(exception, "Client '{0}': Error while sending DISCONNECT packet (ReasonCode = {1})", Id, options.ReasonCode); _logger.Warning(exception, "Client '{0}': Error while sending DISCONNECT packet (ReasonCode = {1})", Id, options.ReasonCode);
} }
} }
} }
+2 -2
View File
@@ -114,7 +114,7 @@ public sealed class Client_Tests : BaseTestClass
Assert.IsNotNull(receivedMessage); Assert.IsNotNull(receivedMessage);
Assert.AreEqual(applicationMessage.Topic, receivedMessage.Topic); Assert.AreEqual(applicationMessage.Topic, receivedMessage.Topic);
Assert.AreEqual(applicationMessage.TopicAlias, receivedMessage.TopicAlias); Assert.AreEqual(0, receivedMessage.TopicAlias);
Assert.AreEqual(applicationMessage.ContentType, receivedMessage.ContentType); Assert.AreEqual(applicationMessage.ContentType, receivedMessage.ContentType);
Assert.AreEqual(applicationMessage.ResponseTopic, receivedMessage.ResponseTopic); Assert.AreEqual(applicationMessage.ResponseTopic, receivedMessage.ResponseTopic);
Assert.AreEqual(applicationMessage.MessageExpiryInterval, receivedMessage.MessageExpiryInterval); Assert.AreEqual(applicationMessage.MessageExpiryInterval, receivedMessage.MessageExpiryInterval);
@@ -344,4 +344,4 @@ public sealed class Client_Tests : BaseTestClass
memoryStream.Position = 0; memoryStream.Position = 0;
return memoryStream; return memoryStream;
} }
} }
@@ -34,6 +34,7 @@ public sealed class Topic_Alias_Tests : BaseTestClass
await testEnvironment.StartServer(); await testEnvironment.StartServer();
var receivedTopics = new List<string>(); var receivedTopics = new List<string>();
var receivedTopicAliases = new List<ushort>();
var c1 = await testEnvironment.ConnectClient(options => options.WithProtocolVersion(MqttProtocolVersion.V500)); var c1 = await testEnvironment.ConnectClient(options => options.WithProtocolVersion(MqttProtocolVersion.V500));
c1.ApplicationMessageReceivedAsync += e => c1.ApplicationMessageReceivedAsync += e =>
@@ -41,6 +42,7 @@ public sealed class Topic_Alias_Tests : BaseTestClass
lock (receivedTopics) lock (receivedTopics)
{ {
receivedTopics.Add(e.ApplicationMessage.Topic); receivedTopics.Add(e.ApplicationMessage.Topic);
receivedTopicAliases.Add(e.ApplicationMessage.TopicAlias);
} }
return CompletedTask.Instance; return CompletedTask.Instance;
@@ -68,5 +70,6 @@ public sealed class Topic_Alias_Tests : BaseTestClass
Assert.HasCount(3, receivedTopics); Assert.HasCount(3, receivedTopics);
CollectionAssert.AllItemsAreNotNull(receivedTopics); CollectionAssert.AllItemsAreNotNull(receivedTopics);
Assert.IsTrue(receivedTopics.All(t => t.Equals("this_is_the_topic", System.StringComparison.Ordinal))); Assert.IsTrue(receivedTopics.All(t => t.Equals("this_is_the_topic", System.StringComparison.Ordinal)));
Assert.IsTrue(receivedTopicAliases.All(a => a == 0));
} }
} }