@@ -22,7 +22,8 @@ | |||||
* [Server] Added interceptor for unsubscriptions. | * [Server] Added interceptor for unsubscriptions. | ||||
* [MQTTnet.Server] Added interceptor for unsubscriptions. | * [MQTTnet.Server] Added interceptor for unsubscriptions. | ||||
* [MQTTnet.AspNetCore] improved compatibility with AspNetCore 3.1 | * [MQTTnet.AspNetCore] improved compatibility with AspNetCore 3.1 | ||||
* [Core] Added MqttApplicationMessage.GetUserProperty<T>() convenience method (thanks to @PMExtra). | |||||
* [Core] Added MqttApplicationMessage.GetUserProperty() convenience method (thanks to @PMExtra). | |||||
* [Client] Support WithConnectionUri to configure client (thanks to @PMExtra). | |||||
* [Server] Removed exceptions when user properties are set with MQTT protocol version 3.1 | * [Server] Removed exceptions when user properties are set with MQTT protocol version 3.1 | ||||
</releaseNotes> | </releaseNotes> | ||||
<copyright>Copyright Christian Kratky 2016-2020</copyright> | <copyright>Copyright Christian Kratky 2016-2020</copyright> | ||||
@@ -0,0 +1,48 @@ | |||||
using System; | |||||
using System.Linq; | |||||
using MQTTnet.Client.Options; | |||||
namespace MQTTnet.Extensions | |||||
{ | |||||
public static class MqttClientOptionsBuilderExtension | |||||
{ | |||||
public static MqttClientOptionsBuilder WithConnectionUri(this MqttClientOptionsBuilder builder, Uri uri) | |||||
{ | |||||
var port = uri.IsDefaultPort ? null : (int?) uri.Port; | |||||
switch (uri.Scheme.ToLower()) | |||||
{ | |||||
case "tcp": | |||||
case "mqtt": | |||||
builder.WithTcpServer(uri.Host, port); | |||||
break; | |||||
case "mqtts": | |||||
builder.WithTcpServer(uri.Host, port).WithTls(); | |||||
break; | |||||
case "ws": | |||||
case "wss": | |||||
builder.WithWebSocketServer(uri.ToString()); | |||||
break; | |||||
default: | |||||
throw new ArgumentException("Unexpected scheme in uri."); | |||||
} | |||||
if (!string.IsNullOrEmpty(uri.UserInfo)) | |||||
{ | |||||
var userInfo = uri.UserInfo.Split(':'); | |||||
var username = userInfo[0]; | |||||
var password = userInfo.Length > 1 ? userInfo[1] : ""; | |||||
builder.WithCredentials(username, password); | |||||
} | |||||
return builder; | |||||
} | |||||
public static MqttClientOptionsBuilder WithConnectionUri(this MqttClientOptionsBuilder builder, string uri) | |||||
{ | |||||
return WithConnectionUri(builder, new Uri(uri, UriKind.Absolute)); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,22 @@ | |||||
using System.Linq; | |||||
using System.Text; | |||||
using Microsoft.VisualStudio.TestTools.UnitTesting; | |||||
using MQTTnet.Client.Options; | |||||
using MQTTnet.Extensions; | |||||
namespace MQTTnet.Tests | |||||
{ | |||||
[TestClass] | |||||
public class MqttClientOptionsBuilder_Tests | |||||
{ | |||||
[TestMethod] | |||||
public void WithConnectionUri_Credential_Test() | |||||
{ | |||||
var options = new MqttClientOptionsBuilder() | |||||
.WithConnectionUri("mqtt://user:password@127.0.0.1") | |||||
.Build(); | |||||
Assert.AreEqual("user", options.Credentials.Username); | |||||
Assert.IsTrue(Encoding.UTF8.GetBytes("password").SequenceEqual(options.Credentials.Password)); | |||||
} | |||||
} | |||||
} |