diff --git a/Source/MQTTnet.AspnetCore/MqttConnectionContext.cs b/Source/MQTTnet.AspnetCore/MqttConnectionContext.cs index 2aa9842..bbc1795 100644 --- a/Source/MQTTnet.AspnetCore/MqttConnectionContext.cs +++ b/Source/MQTTnet.AspnetCore/MqttConnectionContext.cs @@ -25,7 +25,7 @@ namespace MQTTnet.AspNetCore _input = Connection.Transport.Input; _output = Connection.Transport.Output; } - + _reader = new SpanBasedMqttPacketBodyReader(); } @@ -37,6 +37,12 @@ namespace MQTTnet.AspNetCore { get { +#if NETCOREAPP3_1 + if (Connection?.RemoteEndPoint != null) + { + return Connection.RemoteEndPoint.ToString(); + } +#endif var connection = Http?.HttpContext?.Connection; if (connection == null) { diff --git a/Tests/MQTTnet.AspNetCore.Tests/MQTTnet.AspNetCore.Tests.csproj b/Tests/MQTTnet.AspNetCore.Tests/MQTTnet.AspNetCore.Tests.csproj index 3c3f016..98b21cf 100644 --- a/Tests/MQTTnet.AspNetCore.Tests/MQTTnet.AspNetCore.Tests.csproj +++ b/Tests/MQTTnet.AspNetCore.Tests/MQTTnet.AspNetCore.Tests.csproj @@ -1,7 +1,7 @@  - netcoreapp3.1 + netcoreapp3.1;net461 false @@ -11,6 +11,12 @@ + + + + + + diff --git a/Tests/MQTTnet.AspNetCore.Tests/Mockups/ConnectionHandlerMockup.cs b/Tests/MQTTnet.AspNetCore.Tests/Mockups/ConnectionHandlerMockup.cs new file mode 100644 index 0000000..9adcebd --- /dev/null +++ b/Tests/MQTTnet.AspNetCore.Tests/Mockups/ConnectionHandlerMockup.cs @@ -0,0 +1,50 @@ +using Microsoft.AspNetCore.Connections; +using MQTTnet.Adapter; +using MQTTnet.Formatter; +using MQTTnet.Server; +using System; +using System.Threading.Tasks; + +namespace MQTTnet.AspNetCore.Tests.Mockups +{ + public class ConnectionHandlerMockup: IMqttServerAdapter + { + public TaskCompletionSource Context { get; } = new TaskCompletionSource(); + public Func ClientHandler { get; set; } + + public ConnectionHandlerMockup() + { + } + + public async Task OnConnectedAsync(ConnectionContext connection) + { + try + { + var writer = new SpanBasedMqttPacketWriter(); + var formatter = new MqttPacketFormatterAdapter(writer); + var context = new MqttConnectionContext(formatter, connection); + Context.TrySetResult(context); + + await ClientHandler(context); + } + catch (Exception ex) + { + Context.TrySetException(ex); + } + } + + public Task StartAsync(IMqttServerOptions options) + { + return Task.CompletedTask; + } + + public Task StopAsync() + { + return Task.CompletedTask; + } + + public void Dispose() + { + } + } +} diff --git a/Tests/MQTTnet.AspNetCore.Tests/MqttConnectionContextTest.cs b/Tests/MQTTnet.AspNetCore.Tests/MqttConnectionContextTest.cs index f916779..e76d627 100644 --- a/Tests/MQTTnet.AspNetCore.Tests/MqttConnectionContextTest.cs +++ b/Tests/MQTTnet.AspNetCore.Tests/MqttConnectionContextTest.cs @@ -1,13 +1,20 @@ -using Microsoft.AspNetCore.Connections; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Connections; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.DependencyInjection; using Microsoft.VisualStudio.TestTools.UnitTesting; -using MQTTnet.AspNetCore.Tests.Mockups; -using MQTTnet.Exceptions; -using MQTTnet.Packets; + using System; using System.Linq; using System.Threading; using System.Threading.Tasks; +using MQTTnet.Adapter; +using MQTTnet.AspNetCore.Tests.Mockups; +using MQTTnet.Client.Options; +using MQTTnet.Exceptions; using MQTTnet.Formatter; +using MQTTnet.Packets; +using System.Net; namespace MQTTnet.AspNetCore.Tests { @@ -63,5 +70,43 @@ namespace MQTTnet.AspNetCore.Tests var readResult = await pipe.Send.Reader.ReadAsync(); Assert.IsTrue(readResult.Buffer.Length > 20000); } + + private class Startup + { + public void Configure(IApplicationBuilder app) + { + } + } + + [TestMethod] + public async Task TestEndpoint() + { + var mockup = new ConnectionHandlerMockup(); + + + using (var host = new WebHostBuilder() + .UseKestrel(kestrel => kestrel.ListenLocalhost(1883, listener => listener.Use((ctx, next) => mockup.OnConnectedAsync(ctx)))) + .UseStartup() + .ConfigureServices((hostContext, services) => + { + services.AddHostedMqttServer(o => o.WithoutDefaultEndpoint()); + services.AddSingleton(mockup); + }) + .Build()) + using (var client = new MqttFactory().CreateMqttClient()) + { + host.Start(); + await client.ConnectAsync(new MqttClientOptionsBuilder() + .WithTcpServer("localhost") + .Build(), CancellationToken.None); + + var ctx = await mockup.Context.Task; +#if NETCOREAPP3_1 + var ep = IPEndPoint.Parse(ctx.Endpoint); + Assert.IsNotNull(ep); +#endif + Assert.IsNotNull(ctx); + } + } } }