diff --git a/client-ts/Microsoft.AspNetCore.SignalR.Test.Server/Startup.cs b/client-ts/Microsoft.AspNetCore.SignalR.Test.Server/Startup.cs index 771101f605..494de9a17c 100644 --- a/client-ts/Microsoft.AspNetCore.SignalR.Test.Server/Startup.cs +++ b/client-ts/Microsoft.AspNetCore.SignalR.Test.Server/Startup.cs @@ -25,10 +25,10 @@ namespace Microsoft.AspNetCore.SignalR.Test.Server } app.UseFileServer(); - app.UseSockets(options => options.MapEndpoint("/echo")); + app.UseSockets(options => options.MapEndpoint("echo")); app.UseSignalR(routes => { - routes.MapHub("/testhub"); + routes.MapHub("testhub"); }); } } diff --git a/samples/ChatSample/Startup.cs b/samples/ChatSample/Startup.cs index 4ccf1bff84..fd91e559ef 100644 --- a/samples/ChatSample/Startup.cs +++ b/samples/ChatSample/Startup.cs @@ -92,7 +92,7 @@ namespace ChatSample app.UseSignalR(routes => { - routes.MapHub("/chat"); + routes.MapHub("chat"); }); app.UseMvc(routes => diff --git a/samples/SocialWeather/Startup.cs b/samples/SocialWeather/Startup.cs index f7280516db..a950ef629f 100644 --- a/samples/SocialWeather/Startup.cs +++ b/samples/SocialWeather/Startup.cs @@ -32,7 +32,7 @@ namespace SocialWeather app.UseDeveloperExceptionPage(); } - app.UseSockets(o => { o.MapEndpoint("/weather"); }); + app.UseSockets(o => { o.MapEndpoint("weather"); }); app.UseFileServer(); var formatterResolver = app.ApplicationServices.GetRequiredService(); diff --git a/samples/SocketsSample/Startup.cs b/samples/SocketsSample/Startup.cs index ed635cfc6b..034284f9b1 100644 --- a/samples/SocketsSample/Startup.cs +++ b/samples/SocketsSample/Startup.cs @@ -48,12 +48,12 @@ namespace SocketsSample app.UseSignalR(routes => { - routes.MapHub("/hubs"); + routes.MapHub("hubs"); }); app.UseSockets(routes => { - routes.MapEndpoint("/chat"); + routes.MapEndpoint("chat"); }); } } diff --git a/src/Microsoft.AspNetCore.Sockets/HttpConnectionDispatcher.cs b/src/Microsoft.AspNetCore.Sockets/HttpConnectionDispatcher.cs index 522f8a9ad7..875d637b17 100644 --- a/src/Microsoft.AspNetCore.Sockets/HttpConnectionDispatcher.cs +++ b/src/Microsoft.AspNetCore.Sockets/HttpConnectionDispatcher.cs @@ -34,7 +34,7 @@ namespace Microsoft.AspNetCore.Sockets _logger = _loggerFactory.CreateLogger(); } - public async Task ExecuteAsync(string path, HttpContext context) where TEndPoint : EndPoint + public async Task ExecuteAsync(HttpContext context) where TEndPoint : EndPoint { var options = context.RequestServices.GetRequiredService>>().Value; // TODO: Authorize attribute on EndPoint @@ -43,38 +43,31 @@ namespace Microsoft.AspNetCore.Sockets return; } - if (context.Request.Path.Equals(path, StringComparison.OrdinalIgnoreCase)) + if (HttpMethods.IsOptions(context.Request.Method)) { - if (HttpMethods.IsOptions(context.Request.Method)) - { - // OPTIONS /{path} - await ProcessNegotiate(context, options); - } - else if (HttpMethods.IsPost(context.Request.Method)) - { - // POST /{path} - await ProcessSend(context); - } - else if (HttpMethods.IsGet(context.Request.Method)) - { - // GET /{path} + // OPTIONS /{path} + await ProcessNegotiate(context, options); + } + else if (HttpMethods.IsPost(context.Request.Method)) + { + // POST /{path} + await ProcessSend(context); + } + else if (HttpMethods.IsGet(context.Request.Method)) + { + // GET /{path} - // Get the end point mapped to this http connection - var endpoint = (EndPoint)context.RequestServices.GetRequiredService(); - await ExecuteEndpointAsync(path, context, endpoint, options); - } - else - { - context.Response.StatusCode = StatusCodes.Status405MethodNotAllowed; - } + // Get the end point mapped to this http connection + var endpoint = (EndPoint)context.RequestServices.GetRequiredService(); + await ExecuteEndpointAsync(context, endpoint, options); } else { - context.Response.StatusCode = StatusCodes.Status400BadRequest; + context.Response.StatusCode = StatusCodes.Status405MethodNotAllowed; } } - private async Task ExecuteEndpointAsync(string path, HttpContext context, EndPoint endpoint, EndPointOptions options) where TEndPoint : EndPoint + private async Task ExecuteEndpointAsync(HttpContext context, EndPoint endpoint, EndPointOptions options) where TEndPoint : EndPoint { var supportedTransports = options.Transports; diff --git a/src/Microsoft.AspNetCore.Sockets/HttpDispatcherAppBuilderExtensions.cs b/src/Microsoft.AspNetCore.Sockets/HttpDispatcherAppBuilderExtensions.cs index f3c98f944a..a9f1b87888 100644 --- a/src/Microsoft.AspNetCore.Sockets/HttpDispatcherAppBuilderExtensions.cs +++ b/src/Microsoft.AspNetCore.Sockets/HttpDispatcherAppBuilderExtensions.cs @@ -2,9 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Routing; using Microsoft.AspNetCore.Sockets; -using Microsoft.AspNetCore.Sockets.Routing; using Microsoft.Extensions.DependencyInjection; namespace Microsoft.AspNetCore.Builder @@ -38,7 +38,7 @@ namespace Microsoft.AspNetCore.Builder public void MapEndpoint(string path) where TEndPoint : EndPoint { - _routes.AddPrefixRoute(path, new RouteHandler(c => _dispatcher.ExecuteAsync(path, c))); + _routes.MapRoute(path, _dispatcher.ExecuteAsync); } } } diff --git a/src/Microsoft.AspNetCore.Sockets/Routing/PrefixRoute.cs b/src/Microsoft.AspNetCore.Sockets/Routing/PrefixRoute.cs deleted file mode 100644 index 15f83c763c..0000000000 --- a/src/Microsoft.AspNetCore.Sockets/Routing/PrefixRoute.cs +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Routing; - -namespace Microsoft.AspNetCore.Sockets.Routing -{ - internal class PrefixRoute : IRouter - { - private readonly IRouteHandler _target; - private readonly string _prefix; - - public PrefixRoute(IRouteHandler target, string prefix) - { - _target = target; - - if (prefix == null) - { - prefix = "/"; - } - else if (prefix.Length > 0 && prefix[0] != '/') - { - // owin.RequestPath starts with a / - prefix = "/" + prefix; - } - - if (prefix.Length > 1 && prefix[prefix.Length - 1] == '/') - { - prefix = prefix.Substring(0, prefix.Length - 1); - } - - _prefix = prefix; - } - - public Task RouteAsync(RouteContext context) - { - var requestPath = context.HttpContext.Request.Path.Value ?? string.Empty; - if (requestPath.StartsWith(_prefix, StringComparison.OrdinalIgnoreCase)) - { - if (requestPath.Length > _prefix.Length) - { - var lastCharacter = requestPath[_prefix.Length]; - if (lastCharacter != '/' && lastCharacter != '#' && lastCharacter != '?') - { - return Task.FromResult(0); - } - } - - context.Handler = _target.GetRequestHandler(context.HttpContext, context.RouteData); - } - - return Task.FromResult(0); - } - - public VirtualPathData GetVirtualPath(VirtualPathContext context) - { - return null; - } - } -} diff --git a/src/Microsoft.AspNetCore.Sockets/Routing/RouteBuilderExtensions.cs b/src/Microsoft.AspNetCore.Sockets/Routing/RouteBuilderExtensions.cs deleted file mode 100644 index 3482a6770e..0000000000 --- a/src/Microsoft.AspNetCore.Sockets/Routing/RouteBuilderExtensions.cs +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Routing; - -namespace Microsoft.AspNetCore.Sockets.Routing -{ - internal static class RouteBuilderExtensions - { - public static IRouteBuilder AddPrefixRoute( - this IRouteBuilder routeBuilder, - string prefix, - IRouteHandler handler) - { - routeBuilder.Routes.Add(new PrefixRoute(handler, prefix)); - return routeBuilder; - } - } -} diff --git a/test/Microsoft.AspNetCore.SignalR.Client.FunctionalTests/HubConnectionTests.cs b/test/Microsoft.AspNetCore.SignalR.Client.FunctionalTests/HubConnectionTests.cs index 161eb75604..35316d66ad 100644 --- a/test/Microsoft.AspNetCore.SignalR.Client.FunctionalTests/HubConnectionTests.cs +++ b/test/Microsoft.AspNetCore.SignalR.Client.FunctionalTests/HubConnectionTests.cs @@ -37,7 +37,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests { app.UseSignalR(routes => { - routes.MapHub("/hubs"); + routes.MapHub("hubs"); }); }); _testServer = new TestServer(webHostBuilder); diff --git a/test/Microsoft.AspNetCore.SignalR.Tests/ServerFixture.cs b/test/Microsoft.AspNetCore.SignalR.Tests/ServerFixture.cs index 185002d24d..60dd69183d 100644 --- a/test/Microsoft.AspNetCore.SignalR.Tests/ServerFixture.cs +++ b/test/Microsoft.AspNetCore.SignalR.Tests/ServerFixture.cs @@ -46,7 +46,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests public void Configure(IApplicationBuilder app, IHostingEnvironment env) { - app.UseSockets(options => options.MapEndpoint("/echo")); + app.UseSockets(options => options.MapEndpoint("echo")); } } diff --git a/test/Microsoft.AspNetCore.Sockets.Tests/HttpConnectionDispatcherTests.cs b/test/Microsoft.AspNetCore.Sockets.Tests/HttpConnectionDispatcherTests.cs index b605decd0c..4176b8f32a 100644 --- a/test/Microsoft.AspNetCore.Sockets.Tests/HttpConnectionDispatcherTests.cs +++ b/test/Microsoft.AspNetCore.Sockets.Tests/HttpConnectionDispatcherTests.cs @@ -42,7 +42,7 @@ namespace Microsoft.AspNetCore.Sockets.Tests context.Request.Path = "/foo"; context.Request.Method = "OPTIONS"; context.Response.Body = ms; - await dispatcher.ExecuteAsync("/foo", context); + await dispatcher.ExecuteAsync(context); var id = Encoding.UTF8.GetString(ms.ToArray()); @@ -77,7 +77,7 @@ namespace Microsoft.AspNetCore.Sockets.Tests context.Request.Query = qs; SetTransport(context, transportType); - await dispatcher.ExecuteAsync("/foo", context); + await dispatcher.ExecuteAsync(context); Assert.Equal(StatusCodes.Status404NotFound, context.Response.StatusCode); await strm.FlushAsync(); @@ -108,7 +108,7 @@ namespace Microsoft.AspNetCore.Sockets.Tests var qs = new QueryCollection(values); context.Request.Query = qs; - await dispatcher.ExecuteAsync("/foo", context); + await dispatcher.ExecuteAsync(context); Assert.Equal(StatusCodes.Status404NotFound, context.Response.StatusCode); await strm.FlushAsync(); @@ -136,7 +136,7 @@ namespace Microsoft.AspNetCore.Sockets.Tests SetTransport(context, transportType); - await dispatcher.ExecuteAsync("/foo", context); + await dispatcher.ExecuteAsync(context); Assert.Equal(StatusCodes.Status400BadRequest, context.Response.StatusCode); await strm.FlushAsync(); @@ -160,7 +160,7 @@ namespace Microsoft.AspNetCore.Sockets.Tests context.Request.Path = "/foo"; context.Request.Method = "POST"; - await dispatcher.ExecuteAsync("/foo", context); + await dispatcher.ExecuteAsync(context); Assert.Equal(StatusCodes.Status400BadRequest, context.Response.StatusCode); await strm.FlushAsync(); @@ -187,7 +187,7 @@ namespace Microsoft.AspNetCore.Sockets.Tests context.Request.ContentType = "text/plain"; context.Response.Body = strm; - await dispatcher.ExecuteAsync("/foo", context); + await dispatcher.ExecuteAsync(context); Assert.Equal(StatusCodes.Status400BadRequest, context.Response.StatusCode); await strm.FlushAsync(); @@ -240,7 +240,7 @@ namespace Microsoft.AspNetCore.Sockets.Tests var context = MakeRequest("/foo", state); SetTransport(context, TransportType.ServerSentEvents); - await dispatcher.ExecuteAsync("/foo", context); + await dispatcher.ExecuteAsync(context); Assert.Equal(StatusCodes.Status200OK, context.Response.StatusCode); @@ -260,7 +260,7 @@ namespace Microsoft.AspNetCore.Sockets.Tests var context = MakeRequest("/foo", state); SetTransport(context, TransportType.ServerSentEvents); - await dispatcher.ExecuteAsync("/foo", context); + await dispatcher.ExecuteAsync(context); Assert.Equal(StatusCodes.Status200OK, context.Response.StatusCode); @@ -279,7 +279,7 @@ namespace Microsoft.AspNetCore.Sockets.Tests var context = MakeRequest("/foo", state); - await dispatcher.ExecuteAsync("/foo", context); + await dispatcher.ExecuteAsync(context); Assert.Equal(StatusCodes.Status204NoContent, context.Response.StatusCode); @@ -298,7 +298,7 @@ namespace Microsoft.AspNetCore.Sockets.Tests var context = MakeRequest("/foo", state); - await dispatcher.ExecuteAsync("/foo", context); + await dispatcher.ExecuteAsync(context); Assert.Equal(StatusCodes.Status204NoContent, context.Response.StatusCode); @@ -318,7 +318,7 @@ namespace Microsoft.AspNetCore.Sockets.Tests var context = MakeRequest("/foo", state); SetTransport(context, TransportType.WebSockets); - var task = dispatcher.ExecuteAsync("/foo", context); + var task = dispatcher.ExecuteAsync(context); await task.OrTimeout(); } @@ -339,9 +339,9 @@ namespace Microsoft.AspNetCore.Sockets.Tests SetTransport(context1, transportType); SetTransport(context2, transportType); - var request1 = dispatcher.ExecuteAsync("/foo", context1); + var request1 = dispatcher.ExecuteAsync(context1); - await dispatcher.ExecuteAsync("/foo", context2); + await dispatcher.ExecuteAsync(context2); Assert.Equal(StatusCodes.Status409Conflict, context2.Response.StatusCode); @@ -372,8 +372,8 @@ namespace Microsoft.AspNetCore.Sockets.Tests var context1 = MakeRequest("/foo", state); var context2 = MakeRequest("/foo", state); - var request1 = dispatcher.ExecuteAsync("/foo", context1); - var request2 = dispatcher.ExecuteAsync("/foo", context2); + var request1 = dispatcher.ExecuteAsync(context1); + var request2 = dispatcher.ExecuteAsync(context2); await request1; @@ -401,7 +401,7 @@ namespace Microsoft.AspNetCore.Sockets.Tests var context = MakeRequest("/foo", state); SetTransport(context, transportType); - await dispatcher.ExecuteAsync("/foo", context); + await dispatcher.ExecuteAsync(context); Assert.Equal(StatusCodes.Status404NotFound, context.Response.StatusCode); } @@ -416,7 +416,7 @@ namespace Microsoft.AspNetCore.Sockets.Tests var context = MakeRequest("/foo", state); - var task = dispatcher.ExecuteAsync("/foo", context); + var task = dispatcher.ExecuteAsync(context); var buffer = Encoding.UTF8.GetBytes("Hello World"); @@ -442,7 +442,7 @@ namespace Microsoft.AspNetCore.Sockets.Tests var context = MakeRequest("/foo", state); SetTransport(context, TransportType.ServerSentEvents); - var task = dispatcher.ExecuteAsync("/foo", context); + var task = dispatcher.ExecuteAsync(context); var buffer = Encoding.UTF8.GetBytes("Hello World"); @@ -467,7 +467,7 @@ namespace Microsoft.AspNetCore.Sockets.Tests var context = MakeRequest("/foo", state); - var task = dispatcher.ExecuteAsync("/foo", context); + var task = dispatcher.ExecuteAsync(context); var buffer = Encoding.UTF8.GetBytes("Hello World"); @@ -491,9 +491,9 @@ namespace Microsoft.AspNetCore.Sockets.Tests var dispatcher = new HttpConnectionDispatcher(manager, new LoggerFactory()); var context1 = MakeRequest("/foo", state); - var task1 = dispatcher.ExecuteAsync("/foo", context1); + var task1 = dispatcher.ExecuteAsync(context1); var context2 = MakeRequest("/foo", state); - var task2 = dispatcher.ExecuteAsync("/foo", context2); + var task2 = dispatcher.ExecuteAsync(context2); // Task 1 should finish when request 2 arrives await task1.OrTimeout(); @@ -577,7 +577,7 @@ namespace Microsoft.AspNetCore.Sockets.Tests context.Features.Set(authFeature); // would hang if EndPoint was running - await dispatcher.ExecuteAsync("/foo", context).OrTimeout(); + await dispatcher.ExecuteAsync(context).OrTimeout(); Assert.Equal(StatusCodes.Status401Unauthorized, context.Response.StatusCode); } @@ -619,7 +619,7 @@ namespace Microsoft.AspNetCore.Sockets.Tests // "authorize" user context.User = new ClaimsPrincipal(new ClaimsIdentity(new[] { new Claim(ClaimTypes.NameIdentifier, "name") })); - var endPointTask = dispatcher.ExecuteAsync("/foo", context); + var endPointTask = dispatcher.ExecuteAsync(context); await state.Connection.Transport.Output.WriteAsync(new Message(Encoding.UTF8.GetBytes("Hello, World"), MessageType.Text)).OrTimeout(); await endPointTask.OrTimeout(); @@ -665,14 +665,14 @@ namespace Microsoft.AspNetCore.Sockets.Tests context.User = new ClaimsPrincipal(new ClaimsIdentity(new[] { new Claim(ClaimTypes.NameIdentifier, "name") })); // would hang if EndPoint was running - await dispatcher.ExecuteAsync("/foo", context).OrTimeout(); + await dispatcher.ExecuteAsync(context).OrTimeout(); Assert.Equal(StatusCodes.Status401Unauthorized, context.Response.StatusCode); // fully "authorize" user context.User.AddIdentity(new ClaimsIdentity(new[] { new Claim(ClaimTypes.StreetAddress, "12345 123rd St. NW") })); - var endPointTask = dispatcher.ExecuteAsync("/foo", context); + var endPointTask = dispatcher.ExecuteAsync(context); await state.Connection.Transport.Output.WriteAsync(new Message(Encoding.UTF8.GetBytes("Hello, World"), MessageType.Text)).OrTimeout(); await endPointTask.OrTimeout(); @@ -718,7 +718,7 @@ namespace Microsoft.AspNetCore.Sockets.Tests // "authorize" user context.User = new ClaimsPrincipal(new ClaimsIdentity(new[] { new Claim(ClaimTypes.NameIdentifier, "name") })); - var endPointTask = dispatcher.ExecuteAsync("/foo", context); + var endPointTask = dispatcher.ExecuteAsync(context); await state.Connection.Transport.Output.WriteAsync(new Message(Encoding.UTF8.GetBytes("Hello, World"), MessageType.Text)).OrTimeout(); await endPointTask.OrTimeout(); @@ -766,7 +766,7 @@ namespace Microsoft.AspNetCore.Sockets.Tests context.User = new ClaimsPrincipal(new ClaimsIdentity(new[] { new Claim(ClaimTypes.NameIdentifier, "name") })); // would block if EndPoint was executed - await dispatcher.ExecuteAsync("/foo", context).OrTimeout(); + await dispatcher.ExecuteAsync(context).OrTimeout(); Assert.Equal(StatusCodes.Status401Unauthorized, context.Response.StatusCode); } @@ -842,7 +842,7 @@ namespace Microsoft.AspNetCore.Sockets.Tests values["id"] = state.Connection.ConnectionId; var qs = new QueryCollection(values); context.Request.Query = qs; - await dispatcher.ExecuteAsync("/foo", context); + await dispatcher.ExecuteAsync(context); Assert.Equal(status, context.Response.StatusCode); await strm.FlushAsync(); @@ -872,7 +872,7 @@ namespace Microsoft.AspNetCore.Sockets.Tests var messages = new List(); using (context.Request.Body = new MemoryStream(buffer, writable: false)) { - await dispatcher.ExecuteAsync("/foo", context).OrTimeout(); + await dispatcher.ExecuteAsync(context).OrTimeout(); } while (state.Connection.Transport.Input.TryRead(out var message))