@@ -11,14 +11,7 @@ | |||||
<requireLicenseAcceptance>false</requireLicenseAcceptance> | <requireLicenseAcceptance>false</requireLicenseAcceptance> | ||||
<description>MQTTnet is a high performance .NET library for MQTT based communication. It provides a MQTT client and a MQTT server (broker) and supports v3.1.0, v3.1.1 and v5.0.0 of the MQTT protocol.</description> | <description>MQTTnet is a high performance .NET library for MQTT based communication. It provides a MQTT client and a MQTT server (broker) and supports v3.1.0, v3.1.1 and v5.0.0 of the MQTT protocol.</description> | ||||
<releaseNotes> | <releaseNotes> | ||||
* [Core] Converted all pending methods to use async/await. | |||||
* [Core] Fixed an issue when serializing a PubRec (QoS 2) packet for MQTTv5. | |||||
* [Client] Fixed an issue when checking for revoked SSL certificates (thanks to @cslutgen). | |||||
* [RpcClient] Added support for custom topic generation strategies. | |||||
* [Server] Refactoring of server certificate password classes (BREAKING CHANGE!). | |||||
* [Server] Fixed an issue with empty server certificate passwords (thanks to @SeppPenner). | |||||
* [MQTTnet.Server] Added support for certificate passwords (BREAKING CHANGE IN CONFIG!) | |||||
* [MQTTnet.AspNetCore] Fixed an issue with MQTTv5 package serialization (#743, thanks to @JanEggers, @pcbing). | |||||
* [Server] Added support for assigned client IDs (MQTTv5 only) (thanks to @bcrosnier). | |||||
</releaseNotes> | </releaseNotes> | ||||
<copyright>Copyright Christian Kratky 2016-2019</copyright> | <copyright>Copyright Christian Kratky 2016-2019</copyright> | ||||
<tags>MQTT Message Queue Telemetry Transport MQTTClient MQTTServer Server MQTTBroker Broker NETStandard IoT InternetOfThings Messaging Hardware Arduino Sensor Actuator M2M ESP Smart Home Cities Automation Xamarin</tags> | <tags>MQTT Message Queue Telemetry Transport MQTTClient MQTTServer Server MQTTBroker Broker NETStandard IoT InternetOfThings Messaging Hardware Arduino Sensor Actuator M2M ESP Smart Home Cities Automation Xamarin</tags> | ||||
@@ -12,6 +12,13 @@ Write-Host "Nuget version = $nugetVersion" | |||||
Write-Host "MSBuild path = $msbuild" | Write-Host "MSBuild path = $msbuild" | ||||
Write-Host | Write-Host | ||||
# Build and execute tests | |||||
&$msbuild ..\Tests\MQTTnet.Core.Tests\MQTTnet.Tests.csproj /t:Build /p:Configuration="Release" /p:TargetFramework="netcoreapp2.1" /verbosity:m | |||||
&$msbuild ..\Tests\MQTTnet.AspNetCore.Tests\MQTTnet.AspNetCore.Tests.csproj /t:Build /p:Configuration="Release" /p:TargetFramework="netcoreapp2.1" /verbosity:m | |||||
vstest.console.exe ..\Tests\MQTTnet.Core.Tests\bin\Release\netcoreapp2.1\MQTTnet.Tests.dll | |||||
vstest.console.exe ..\Tests\MQTTnet.AspNetCore.Tests\bin\Release\netcoreapp2.1\MQTTnet.AspNetCore.Tests.dll | |||||
# Build the core library | # Build the core library | ||||
&$msbuild ..\Source\MQTTnet\MQTTnet.csproj /t:Build /p:Configuration="Release" /p:TargetFramework="net452" /p:FileVersion=$assemblyVersion /p:AssemblyVersion=$assemblyVersion /verbosity:m /p:SignAssembly=true /p:AssemblyOriginatorKeyFile=".\..\..\Build\codeSigningKey.pfx" | &$msbuild ..\Source\MQTTnet\MQTTnet.csproj /t:Build /p:Configuration="Release" /p:TargetFramework="net452" /p:FileVersion=$assemblyVersion /p:AssemblyVersion=$assemblyVersion /verbosity:m /p:SignAssembly=true /p:AssemblyOriginatorKeyFile=".\..\..\Build\codeSigningKey.pfx" | ||||
&$msbuild ..\Source\MQTTnet\MQTTnet.csproj /t:Build /p:Configuration="Release" /p:TargetFramework="net461" /p:FileVersion=$assemblyVersion /p:AssemblyVersion=$assemblyVersion /verbosity:m /p:SignAssembly=true /p:AssemblyOriginatorKeyFile=".\..\..\Build\codeSigningKey.pfx" | &$msbuild ..\Source\MQTTnet\MQTTnet.csproj /t:Build /p:Configuration="Release" /p:TargetFramework="net461" /p:FileVersion=$assemblyVersion /p:AssemblyVersion=$assemblyVersion /verbosity:m /p:SignAssembly=true /p:AssemblyOriginatorKeyFile=".\..\..\Build\codeSigningKey.pfx" | ||||
@@ -43,13 +50,6 @@ Write-Host | |||||
&$msbuild ..\Source\MQTTnet.Extensions.WebSocket4Net\MQTTnet.Extensions.WebSocket4Net.csproj /t:Build /p:Configuration="Release" /p:TargetFramework="netstandard2.0" /p:FileVersion=$assemblyVersion /p:AssemblyVersion=$assemblyVersion /verbosity:m /p:SignAssembly=true /p:AssemblyOriginatorKeyFile=".\..\..\Build\codeSigningKey.pfx" | &$msbuild ..\Source\MQTTnet.Extensions.WebSocket4Net\MQTTnet.Extensions.WebSocket4Net.csproj /t:Build /p:Configuration="Release" /p:TargetFramework="netstandard2.0" /p:FileVersion=$assemblyVersion /p:AssemblyVersion=$assemblyVersion /verbosity:m /p:SignAssembly=true /p:AssemblyOriginatorKeyFile=".\..\..\Build\codeSigningKey.pfx" | ||||
&$msbuild ..\Source\MQTTnet.Extensions.WebSocket4Net\MQTTnet.Extensions.WebSocket4Net.csproj /t:Build /p:Configuration="Release" /p:TargetFramework="uap10.0" /p:FileVersion=$assemblyVersion /p:AssemblyVersion=$assemblyVersion /verbosity:m /p:SignAssembly=true /p:AssemblyOriginatorKeyFile=".\..\..\Build\codeSigningKey.pfx" | &$msbuild ..\Source\MQTTnet.Extensions.WebSocket4Net\MQTTnet.Extensions.WebSocket4Net.csproj /t:Build /p:Configuration="Release" /p:TargetFramework="uap10.0" /p:FileVersion=$assemblyVersion /p:AssemblyVersion=$assemblyVersion /verbosity:m /p:SignAssembly=true /p:AssemblyOriginatorKeyFile=".\..\..\Build\codeSigningKey.pfx" | ||||
# Build and execute tests | |||||
&$msbuild ..\Tests\MQTTnet.Core.Tests\MQTTnet.Tests.csproj /t:Build /p:Configuration="Release" /p:TargetFramework="netcoreapp2.1" /verbosity:m | |||||
&$msbuild ..\Tests\MQTTnet.AspNetCore.Tests\MQTTnet.AspNetCore.Tests.csproj /t:Build /p:Configuration="Release" /p:TargetFramework="netcoreapp2.1" /verbosity:m | |||||
vstest.console.exe ..\Tests\MQTTnet.Core.Tests\bin\Release\netcoreapp2.1\MQTTnet.Tests.dll | |||||
vstest.console.exe ..\Tests\MQTTnet.AspNetCore.Tests\bin\Release\netcoreapp2.1\MQTTnet.AspNetCore.Tests.dll | |||||
# Create NuGet packages. | # Create NuGet packages. | ||||
Invoke-WebRequest -Uri "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe" -OutFile "nuget.exe" | Invoke-WebRequest -Uri "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe" -OutFile "nuget.exe" | ||||
@@ -22,7 +22,8 @@ namespace MQTTnet.Server.Mqtt | |||||
{ | { | ||||
try | try | ||||
{ | { | ||||
var sessionItems = (PythonDictionary)context.SessionItems[MqttServerConnectionValidator.WrappedSessionItemsKey]; | |||||
// This might be not set when a message was published by the server instead of a client. | |||||
context.SessionItems.TryGetValue(MqttServerConnectionValidator.WrappedSessionItemsKey, out var sessionItems); | |||||
var pythonContext = new PythonDictionary | var pythonContext = new PythonDictionary | ||||
{ | { | ||||
@@ -50,4 +51,4 @@ namespace MQTTnet.Server.Mqtt | |||||
return Task.CompletedTask; | return Task.CompletedTask; | ||||
} | } | ||||
} | } | ||||
} | |||||
} |
@@ -13,5 +13,31 @@ namespace MQTTnet.Packets | |||||
public string Name { get; } | public string Name { get; } | ||||
public string Value { get; } | public string Value { get; } | ||||
public override int GetHashCode() | |||||
{ | |||||
return Name.GetHashCode() ^ Value.GetHashCode(); | |||||
} | |||||
public override bool Equals(object other) | |||||
{ | |||||
return Equals(other as MqttUserProperty); | |||||
} | |||||
public bool Equals(MqttUserProperty other) | |||||
{ | |||||
if (other == null) | |||||
{ | |||||
return false; | |||||
} | |||||
if (ReferenceEquals(other, this)) | |||||
{ | |||||
return true; | |||||
} | |||||
return string.Equals(Name, other.Name, StringComparison.Ordinal) && | |||||
string.Equals(Value, other.Value, StringComparison.Ordinal); | |||||
} | |||||
} | } | ||||
} | } |
@@ -293,5 +293,52 @@ namespace MQTTnet.Tests.MQTTv5 | |||||
await server.StopAsync(); | await server.StopAsync(); | ||||
} | } | ||||
} | } | ||||
[TestMethod] | |||||
public async Task Publish_And_Receive_New_Properties() | |||||
{ | |||||
using (var testEnvironment = new TestEnvironment()) | |||||
{ | |||||
await testEnvironment.StartServerAsync(); | |||||
var receiver = await testEnvironment.ConnectClientAsync(new MqttClientOptionsBuilder().WithProtocolVersion(MqttProtocolVersion.V500)); | |||||
await receiver.SubscribeAsync("#"); | |||||
MqttApplicationMessage receivedMessage = null; | |||||
receiver.UseApplicationMessageReceivedHandler(c => | |||||
{ | |||||
receivedMessage = c.ApplicationMessage; | |||||
}); | |||||
var sender = await testEnvironment.ConnectClientAsync(new MqttClientOptionsBuilder().WithProtocolVersion(MqttProtocolVersion.V500)); | |||||
var applicationMessage = new MqttApplicationMessageBuilder() | |||||
.WithTopic("Hello") | |||||
.WithPayload("World") | |||||
.WithAtMostOnceQoS() | |||||
.WithUserProperty("x", "1") | |||||
.WithUserProperty("y", "2") | |||||
.WithResponseTopic("response") | |||||
.WithContentType("text") | |||||
.WithMessageExpiryInterval(50) | |||||
.WithCorrelationData(new byte[12]) | |||||
.WithTopicAlias(2) | |||||
.Build(); | |||||
await sender.PublishAsync(applicationMessage); | |||||
await Task.Delay(500); | |||||
Assert.IsNotNull(receivedMessage); | |||||
Assert.AreEqual(applicationMessage.Topic, receivedMessage.Topic); | |||||
Assert.AreEqual(applicationMessage.TopicAlias, receivedMessage.TopicAlias); | |||||
Assert.AreEqual(applicationMessage.ContentType, receivedMessage.ContentType); | |||||
Assert.AreEqual(applicationMessage.ResponseTopic, receivedMessage.ResponseTopic); | |||||
Assert.AreEqual(applicationMessage.MessageExpiryInterval, receivedMessage.MessageExpiryInterval); | |||||
CollectionAssert.AreEqual(applicationMessage.CorrelationData, receivedMessage.CorrelationData); | |||||
CollectionAssert.AreEqual(applicationMessage.Payload, receivedMessage.Payload); | |||||
CollectionAssert.AreEqual(applicationMessage.UserProperties, receivedMessage.UserProperties); | |||||
} | |||||
} | |||||
} | } | ||||
} | } |