The rename games part 1 of many (#1696)

- React to rename of EndPoint to ConnectionHandler
- Rename UseSockets to UseConnections
- Rename MapEndPoint to MapConnectionHandler
- Rename HttpSocketOptions to HttpConnectionOptions
This commit is contained in:
David Fowler 2018-03-22 22:35:55 -07:00 committed by GitHub
parent d367bdc9aa
commit 2e63e5afe3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
76 changed files with 599 additions and 654 deletions

View File

@ -9,7 +9,7 @@ using System.Reactive.Linq;
using System.Threading.Channels; using System.Threading.Channels;
using System.Threading.Tasks; using System.Threading.Tasks;
using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Attributes;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.SignalR.Internal; using Microsoft.AspNetCore.SignalR.Internal;
using Microsoft.AspNetCore.SignalR.Internal.Protocol; using Microsoft.AspNetCore.SignalR.Internal.Protocol;
using Microsoft.AspNetCore.Sockets; using Microsoft.AspNetCore.Sockets;

View File

@ -22,11 +22,11 @@
<MicrosoftAspNetCoreHttpPackageVersion>2.1.0-preview2-30355</MicrosoftAspNetCoreHttpPackageVersion> <MicrosoftAspNetCoreHttpPackageVersion>2.1.0-preview2-30355</MicrosoftAspNetCoreHttpPackageVersion>
<MicrosoftAspNetCoreIdentityEntityFrameworkCorePackageVersion>2.1.0-preview2-30355</MicrosoftAspNetCoreIdentityEntityFrameworkCorePackageVersion> <MicrosoftAspNetCoreIdentityEntityFrameworkCorePackageVersion>2.1.0-preview2-30355</MicrosoftAspNetCoreIdentityEntityFrameworkCorePackageVersion>
<MicrosoftAspNetCoreMvcPackageVersion>2.1.0-preview2-30355</MicrosoftAspNetCoreMvcPackageVersion> <MicrosoftAspNetCoreMvcPackageVersion>2.1.0-preview2-30355</MicrosoftAspNetCoreMvcPackageVersion>
<MicrosoftAspNetCoreProtocolsAbstractionsPackageVersion>2.1.0-preview2-30355</MicrosoftAspNetCoreProtocolsAbstractionsPackageVersion> <MicrosoftAspNetCoreConnectionsAbstractionsPackageVersion>2.1.0-a-preview2-bedrock-renames-17598</MicrosoftAspNetCoreConnectionsAbstractionsPackageVersion>
<MicrosoftAspNetCoreRoutingPackageVersion>2.1.0-preview2-30355</MicrosoftAspNetCoreRoutingPackageVersion> <MicrosoftAspNetCoreRoutingPackageVersion>2.1.0-preview2-30355</MicrosoftAspNetCoreRoutingPackageVersion>
<MicrosoftAspNetCoreServerIISIntegrationPackageVersion>2.1.0-preview2-30355</MicrosoftAspNetCoreServerIISIntegrationPackageVersion> <MicrosoftAspNetCoreServerIISIntegrationPackageVersion>2.1.0-preview2-30355</MicrosoftAspNetCoreServerIISIntegrationPackageVersion>
<MicrosoftAspNetCoreServerIntegrationTestingPackageVersion>0.5.0-preview2-30355</MicrosoftAspNetCoreServerIntegrationTestingPackageVersion> <MicrosoftAspNetCoreServerIntegrationTestingPackageVersion>0.5.0-preview2-30355</MicrosoftAspNetCoreServerIntegrationTestingPackageVersion>
<MicrosoftAspNetCoreServerKestrelPackageVersion>2.1.0-preview2-30355</MicrosoftAspNetCoreServerKestrelPackageVersion> <MicrosoftAspNetCoreServerKestrelPackageVersion>2.1.0-a-preview2-bedrock-renames-17598</MicrosoftAspNetCoreServerKestrelPackageVersion>
<MicrosoftAspNetCoreStaticFilesPackageVersion>2.1.0-preview2-30355</MicrosoftAspNetCoreStaticFilesPackageVersion> <MicrosoftAspNetCoreStaticFilesPackageVersion>2.1.0-preview2-30355</MicrosoftAspNetCoreStaticFilesPackageVersion>
<MicrosoftAspNetCoreTestHostPackageVersion>2.1.0-preview2-30355</MicrosoftAspNetCoreTestHostPackageVersion> <MicrosoftAspNetCoreTestHostPackageVersion>2.1.0-preview2-30355</MicrosoftAspNetCoreTestHostPackageVersion>
<MicrosoftAspNetCoreTestingPackageVersion>2.1.0-preview2-30355</MicrosoftAspNetCoreTestingPackageVersion> <MicrosoftAspNetCoreTestingPackageVersion>2.1.0-preview2-30355</MicrosoftAspNetCoreTestingPackageVersion>

View File

@ -3,13 +3,13 @@
using System.Buffers; using System.Buffers;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Protocols.Features; using Microsoft.AspNetCore.Connections.Features;
using Microsoft.AspNetCore.Sockets; using Microsoft.AspNetCore.Sockets;
namespace FunctionalTests namespace FunctionalTests
{ {
public class EchoEndPoint : EndPoint public class EchoConnectionHandler : ConnectionHandler
{ {
public async override Task OnConnectedAsync(ConnectionContext connection) public async override Task OnConnectedAsync(ConnectionContext connection)
{ {

View File

@ -23,7 +23,7 @@ namespace FunctionalTests
public void ConfigureServices(IServiceCollection services) public void ConfigureServices(IServiceCollection services)
{ {
services.AddSockets(); services.AddConnections();
services.AddSignalR() services.AddSignalR()
.AddJsonProtocol(options => .AddJsonProtocol(options =>
{ {
@ -70,7 +70,6 @@ namespace FunctionalTests
} }
}; };
}); });
services.AddSingleton<EchoEndPoint>();
} }
public void Configure(IApplicationBuilder app, IHostingEnvironment env) public void Configure(IApplicationBuilder app, IHostingEnvironment env)
@ -81,9 +80,9 @@ namespace FunctionalTests
} }
app.UseFileServer(); app.UseFileServer();
app.UseSockets(routes => app.UseConnections(routes =>
{ {
routes.MapEndPoint<EchoEndPoint>("/echo"); routes.MapConnectionHandler<EchoConnectionHandler>("/echo");
}); });
app.UseSignalR(routes => app.UseSignalR(routes =>

View File

@ -8,7 +8,7 @@ using System.Net.Http;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Sockets; using Microsoft.AspNetCore.Sockets;
using Microsoft.AspNetCore.Sockets.Client; using Microsoft.AspNetCore.Sockets.Client;
using Microsoft.Extensions.CommandLineUtils; using Microsoft.Extensions.CommandLineUtils;

View File

@ -5,7 +5,7 @@ using System;
using System.Collections; using System.Collections;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
namespace Microsoft.AspNetCore.Sockets namespace Microsoft.AspNetCore.Sockets
{ {

View File

@ -5,8 +5,8 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Protocols.Features; using Microsoft.AspNetCore.Connections.Features;
using Microsoft.AspNetCore.Sockets; using Microsoft.AspNetCore.Sockets;
namespace SocialWeather namespace SocialWeather

View File

@ -4,21 +4,21 @@
using System.Buffers; using System.Buffers;
using System.IO; using System.IO;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Protocols.Features; using Microsoft.AspNetCore.Connections.Features;
using Microsoft.AspNetCore.Sockets; using Microsoft.AspNetCore.Sockets;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
namespace SocialWeather namespace SocialWeather
{ {
public class SocialWeatherEndPoint : EndPoint public class SocialWeatherConnectionHandler : ConnectionHandler
{ {
private readonly PersistentConnectionLifeTimeManager _lifetimeManager; private readonly PersistentConnectionLifeTimeManager _lifetimeManager;
private readonly FormatterResolver _formatterResolver; private readonly FormatterResolver _formatterResolver;
private readonly ILogger<SocialWeatherEndPoint> _logger; private readonly ILogger<SocialWeatherConnectionHandler> _logger;
public SocialWeatherEndPoint(PersistentConnectionLifeTimeManager lifetimeManager, public SocialWeatherConnectionHandler(PersistentConnectionLifeTimeManager lifetimeManager,
FormatterResolver formatterResolver, ILogger<SocialWeatherEndPoint> logger) FormatterResolver formatterResolver, ILogger<SocialWeatherConnectionHandler> logger)
{ {
_lifetimeManager = lifetimeManager; _lifetimeManager = lifetimeManager;
_formatterResolver = formatterResolver; _formatterResolver = formatterResolver;

View File

@ -15,9 +15,7 @@ namespace SocialWeather
{ {
public void ConfigureServices(IServiceCollection services) public void ConfigureServices(IServiceCollection services)
{ {
services.AddRouting(); services.AddConnections();
services.AddSockets();
services.AddSingleton<SocialWeatherEndPoint>();
services.AddTransient<PersistentConnectionLifeTimeManager>(); services.AddTransient<PersistentConnectionLifeTimeManager>();
services.AddSingleton(typeof(JsonStreamFormatter<>), typeof(JsonStreamFormatter<>)); services.AddSingleton(typeof(JsonStreamFormatter<>), typeof(JsonStreamFormatter<>));
services.AddSingleton<PipeWeatherStreamFormatter>(); services.AddSingleton<PipeWeatherStreamFormatter>();
@ -32,7 +30,7 @@ namespace SocialWeather
app.UseDeveloperExceptionPage(); app.UseDeveloperExceptionPage();
} }
app.UseSockets(o => { o.MapEndPoint<SocialWeatherEndPoint>("/weather"); }); app.UseConnections(o => o.MapConnectionHandler<SocialWeatherConnectionHandler>("/weather"));
app.UseFileServer(); app.UseFileServer();
var formatterResolver = app.ApplicationServices.GetRequiredService<FormatterResolver>(); var formatterResolver = app.ApplicationServices.GetRequiredService<FormatterResolver>();

View File

@ -5,13 +5,13 @@ using System.Buffers;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Protocols.Features; using Microsoft.AspNetCore.Connections.Features;
using Microsoft.AspNetCore.Sockets; using Microsoft.AspNetCore.Sockets;
namespace SocketsSample.EndPoints namespace SocketsSample.ConnectionHandlers
{ {
public class MessagesEndPoint : EndPoint public class MessagesConnectionHandler : ConnectionHandler
{ {
private ConnectionList Connections { get; } = new ConnectionList(); private ConnectionList Connections { get; } = new ConnectionList();

View File

@ -5,7 +5,7 @@ using System;
using System.Collections; using System.Collections;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
namespace Microsoft.AspNetCore.Sockets namespace Microsoft.AspNetCore.Sockets
{ {

View File

@ -7,7 +7,7 @@ using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Sockets; using Microsoft.AspNetCore.Sockets;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using MsgPack.Serialization; using MsgPack.Serialization;
using SocketsSample.EndPoints; using SocketsSample.ConnectionHandlers;
using SocketsSample.Hubs; using SocketsSample.Hubs;
using StackExchange.Redis; using StackExchange.Redis;
@ -19,7 +19,7 @@ namespace SocketsSample
// For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=398940 // For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=398940
public void ConfigureServices(IServiceCollection services) public void ConfigureServices(IServiceCollection services)
{ {
services.AddSockets(); services.AddConnections();
services.AddSignalR(options => services.AddSignalR(options =>
{ {
@ -42,8 +42,6 @@ namespace SocketsSample
.AllowCredentials(); .AllowCredentials();
}); });
}); });
services.AddSingleton<MessagesEndPoint>();
} }
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
@ -66,9 +64,9 @@ namespace SocketsSample
routes.MapHub<HubTChat>("/hubT"); routes.MapHub<HubTChat>("/hubT");
}); });
app.UseSockets(routes => app.UseConnections(routes =>
{ {
routes.MapEndPoint<MessagesEndPoint>("/chat"); routes.MapConnectionHandler<MessagesConnectionHandler>("/chat");
}); });
} }
} }

View File

@ -8,7 +8,7 @@ using System.IO;
using System.Threading; using System.Threading;
using System.Threading.Channels; using System.Threading.Channels;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Protocols.Features; using Microsoft.AspNetCore.Connections.Features;
using Microsoft.AspNetCore.SignalR.Internal; using Microsoft.AspNetCore.SignalR.Internal;
using Microsoft.AspNetCore.SignalR.Internal.Formatters; using Microsoft.AspNetCore.SignalR.Internal.Formatters;
using Microsoft.AspNetCore.SignalR.Internal.Protocol; using Microsoft.AspNetCore.SignalR.Internal.Protocol;

View File

@ -4,7 +4,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
namespace Microsoft.AspNetCore.SignalR.Internal.Protocol namespace Microsoft.AspNetCore.SignalR.Internal.Protocol
{ {

View File

@ -6,7 +6,7 @@ using System.Collections.Generic;
using System.IO; using System.IO;
using System.Runtime.ExceptionServices; using System.Runtime.ExceptionServices;
using System.Text; using System.Text;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.SignalR.Internal.Formatters; using Microsoft.AspNetCore.SignalR.Internal.Formatters;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Newtonsoft.Json; using Newtonsoft.Json;

View File

@ -14,8 +14,8 @@ using System.Security.Claims;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Http.Features; using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Protocols.Features; using Microsoft.AspNetCore.Connections.Features;
using Microsoft.AspNetCore.SignalR.Core; using Microsoft.AspNetCore.SignalR.Core;
using Microsoft.AspNetCore.SignalR.Internal; using Microsoft.AspNetCore.SignalR.Internal;
using Microsoft.AspNetCore.SignalR.Internal.Protocol; using Microsoft.AspNetCore.SignalR.Internal.Protocol;
@ -313,7 +313,7 @@ namespace Microsoft.AspNetCore.SignalR
Abort(); Abort();
} }
// Used by the HubEndPoint only // Used by the HubConnectionHandler only
internal Task AbortAsync() internal Task AbortAsync()
{ {
Abort(); Abort();

View File

@ -5,7 +5,7 @@ using System;
using System.Buffers; using System.Buffers;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.SignalR.Core; using Microsoft.AspNetCore.SignalR.Core;
using Microsoft.AspNetCore.SignalR.Internal; using Microsoft.AspNetCore.SignalR.Internal;
using Microsoft.AspNetCore.SignalR.Internal.Protocol; using Microsoft.AspNetCore.SignalR.Internal.Protocol;
@ -15,31 +15,31 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.SignalR namespace Microsoft.AspNetCore.SignalR
{ {
public class HubEndPoint<THub> : EndPoint where THub : Hub public class HubConnectionHandler<THub> : ConnectionHandler where THub : Hub
{ {
private readonly HubLifetimeManager<THub> _lifetimeManager; private readonly HubLifetimeManager<THub> _lifetimeManager;
private readonly ILoggerFactory _loggerFactory; private readonly ILoggerFactory _loggerFactory;
private readonly ILogger<HubEndPoint<THub>> _logger; private readonly ILogger<HubConnectionHandler<THub>> _logger;
private readonly IHubProtocolResolver _protocolResolver; private readonly IHubProtocolResolver _protocolResolver;
private readonly HubOptions<THub> _hubOptions; private readonly HubOptions<THub> _hubOptions;
private readonly HubOptions _globalHubOptions; private readonly HubOptions _globalHubOptions;
private readonly IUserIdProvider _userIdProvider; private readonly IUserIdProvider _userIdProvider;
private readonly HubDispatcher<THub> _dispatcher; private readonly HubDispatcher<THub> _dispatcher;
public HubEndPoint(HubLifetimeManager<THub> lifetimeManager, public HubConnectionHandler(HubLifetimeManager<THub> lifetimeManager,
IHubProtocolResolver protocolResolver, IHubProtocolResolver protocolResolver,
IOptions<HubOptions> globalHubOptions, IOptions<HubOptions> globalHubOptions,
IOptions<HubOptions<THub>> hubOptions, IOptions<HubOptions<THub>> hubOptions,
ILoggerFactory loggerFactory, ILoggerFactory loggerFactory,
IUserIdProvider userIdProvider, IUserIdProvider userIdProvider,
HubDispatcher<THub> dispatcher) HubDispatcher<THub> dispatcher)
{ {
_protocolResolver = protocolResolver; _protocolResolver = protocolResolver;
_lifetimeManager = lifetimeManager; _lifetimeManager = lifetimeManager;
_loggerFactory = loggerFactory; _loggerFactory = loggerFactory;
_hubOptions = hubOptions.Value; _hubOptions = hubOptions.Value;
_globalHubOptions = globalHubOptions.Value; _globalHubOptions = globalHubOptions.Value;
_logger = loggerFactory.CreateLogger<HubEndPoint<THub>>(); _logger = loggerFactory.CreateLogger<HubConnectionHandler<THub>>();
_userIdProvider = userIdProvider; _userIdProvider = userIdProvider;
_dispatcher = dispatcher; _dispatcher = dispatcher;
} }

View File

@ -15,7 +15,7 @@ namespace Microsoft.Extensions.DependencyInjection
services.AddSingleton(typeof(IHubProtocolResolver), typeof(DefaultHubProtocolResolver)); services.AddSingleton(typeof(IHubProtocolResolver), typeof(DefaultHubProtocolResolver));
services.AddSingleton(typeof(IHubContext<>), typeof(HubContext<>)); services.AddSingleton(typeof(IHubContext<>), typeof(HubContext<>));
services.AddSingleton(typeof(IHubContext<,>), typeof(HubContext<,>)); services.AddSingleton(typeof(IHubContext<,>), typeof(HubContext<,>));
services.AddSingleton(typeof(HubEndPoint<>), typeof(HubEndPoint<>)); services.AddSingleton(typeof(HubConnectionHandler<>), typeof(HubConnectionHandler<>));
services.AddSingleton(typeof(IUserIdProvider), typeof(DefaultUserIdProvider)); services.AddSingleton(typeof(IUserIdProvider), typeof(DefaultUserIdProvider));
services.AddSingleton(typeof(HubDispatcher<>), typeof(DefaultHubDispatcher<>)); services.AddSingleton(typeof(HubDispatcher<>), typeof(DefaultHubDispatcher<>));
services.AddScoped(typeof(IHubActivator<>), typeof(DefaultHubActivator<>)); services.AddScoped(typeof(IHubActivator<>), typeof(DefaultHubActivator<>));

View File

@ -1,7 +1,7 @@
// Copyright (c) .NET Foundation. All rights reserved. // 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. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Sockets; using Microsoft.AspNetCore.Sockets;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
@ -9,10 +9,9 @@ namespace Microsoft.AspNetCore.SignalR
{ {
public static class SignalRSocketBuilderExtensions public static class SignalRSocketBuilderExtensions
{ {
public static IConnectionBuilder UseHub<THub>(this IConnectionBuilder socketBuilder) where THub : Hub public static IConnectionBuilder UseHub<THub>(this IConnectionBuilder connectionBuilder) where THub : Hub
{ {
var endpoint = socketBuilder.ApplicationServices.GetRequiredService<HubEndPoint<THub>>(); return connectionBuilder.UseConnectionHandler<HubConnectionHandler<THub>>();
return socketBuilder.Run(connection => endpoint.OnConnectedAsync(connection));
} }
} }
} }

View File

@ -7,7 +7,7 @@ using System.Diagnostics;
using System.IO; using System.IO;
using System.Runtime.ExceptionServices; using System.Runtime.ExceptionServices;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.SignalR.Internal.Formatters; using Microsoft.AspNetCore.SignalR.Internal.Formatters;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using MsgPack; using MsgPack;

View File

@ -11,35 +11,35 @@ namespace Microsoft.AspNetCore.SignalR
{ {
public class HubRouteBuilder public class HubRouteBuilder
{ {
private readonly SocketRouteBuilder _routes; private readonly ConnectionsRouteBuilder _routes;
public HubRouteBuilder(SocketRouteBuilder routes) public HubRouteBuilder(ConnectionsRouteBuilder routes)
{ {
_routes = routes; _routes = routes;
} }
public void MapHub<THub>(string path) where THub : Hub public void MapHub<THub>(string path) where THub : Hub
{ {
MapHub<THub>(new PathString(path), socketOptions: null); MapHub<THub>(new PathString(path), configureOptions: null);
} }
public void MapHub<THub>(PathString path) where THub : Hub public void MapHub<THub>(PathString path) where THub : Hub
{ {
MapHub<THub>(path, socketOptions: null); MapHub<THub>(path, configureOptions: null);
} }
public void MapHub<THub>(PathString path, Action<HttpSocketOptions> socketOptions) where THub : Hub public void MapHub<THub>(PathString path, Action<HttpConnectionOptions> configureOptions) where THub : Hub
{ {
// find auth attributes // find auth attributes
var authorizeAttributes = typeof(THub).GetCustomAttributes<AuthorizeAttribute>(inherit: true); var authorizeAttributes = typeof(THub).GetCustomAttributes<AuthorizeAttribute>(inherit: true);
var options = new HttpSocketOptions(); var options = new HttpConnectionOptions();
foreach (var attribute in authorizeAttributes) foreach (var attribute in authorizeAttributes)
{ {
options.AuthorizationData.Add(attribute); options.AuthorizationData.Add(attribute);
} }
socketOptions?.Invoke(options); configureOptions?.Invoke(options);
_routes.MapSocket(path, options, builder => _routes.MapConnections(path, options, builder =>
{ {
builder.UseHub<THub>(); builder.UseHub<THub>();
}); });

View File

@ -18,7 +18,7 @@ namespace Microsoft.AspNetCore.Builder
"calling 'IServiceCollection.AddSignalR()'."); "calling 'IServiceCollection.AddSignalR()'.");
} }
app.UseSockets(routes => app.UseConnections(routes =>
{ {
configure(new HubRouteBuilder(routes)); configure(new HubRouteBuilder(routes));
}); });

View File

@ -11,7 +11,7 @@ namespace Microsoft.Extensions.DependencyInjection
{ {
public static ISignalRBuilder AddSignalR(this IServiceCollection services) public static ISignalRBuilder AddSignalR(this IServiceCollection services)
{ {
services.AddSockets(); services.AddConnections();
services.AddSingleton<SignalRMarkerService>(); services.AddSingleton<SignalRMarkerService>();
services.AddSingleton<IConfigureOptions<HubOptions>, HubOptionsSetup>(); services.AddSingleton<IConfigureOptions<HubOptions>, HubOptionsSetup>();
return services.AddSignalRCore() return services.AddSignalRCore()

View File

@ -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 Microsoft.AspNetCore.Protocols;
namespace Microsoft.AspNetCore.Sockets
{
public static class ConnectionBuilderExtensions
{
public static IConnectionBuilder UseEndPoint<TEndPoint>(this IConnectionBuilder connectionBuilder) where TEndPoint : EndPoint
{
var endpoint = (TEndPoint)connectionBuilder.ApplicationServices.GetService(typeof(TEndPoint));
if (endpoint == null)
{
throw new InvalidOperationException($"{nameof(EndPoint)} type {typeof(TEndPoint)} is not registered.");
}
// This is a terminal middleware, so there's no need to use the 'next' parameter
return connectionBuilder.Run(connection => endpoint.OnConnectedAsync(connection));
}
}
}

View File

@ -8,8 +8,8 @@ using System.Security.Claims;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Http.Features; using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Protocols.Features; using Microsoft.AspNetCore.Connections.Features;
namespace Microsoft.AspNetCore.Sockets namespace Microsoft.AspNetCore.Sockets
{ {

View File

@ -1,21 +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.Threading.Tasks;
using Microsoft.AspNetCore.Protocols;
namespace Microsoft.AspNetCore.Sockets
{
/// <summary>
/// Represents an end point that multiple connections connect to. For HTTP, endpoints are URLs, for non HTTP it can be a TCP listener (or similar)
/// </summary>
public abstract class EndPoint
{
/// <summary>
/// Called when a new connection is accepted to the endpoint
/// </summary>
/// <param name="connection">The new <see cref="ConnectionContext"/></param>
/// <returns>A <see cref="Task"/> that represents the connection lifetime. When the task completes, the connection is complete.</returns>
public abstract Task OnConnectedAsync(ConnectionContext connection);
}
}

View File

@ -3,7 +3,7 @@
using System; using System;
namespace Microsoft.AspNetCore.Protocols.Features namespace Microsoft.AspNetCore.Connections.Features
{ {
public class ConnectionInherentKeepAliveFeature : IConnectionInherentKeepAliveFeature public class ConnectionInherentKeepAliveFeature : IConnectionInherentKeepAliveFeature
{ {

View File

@ -5,7 +5,7 @@ using System;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Http.Features; using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
namespace Microsoft.AspNetCore.Sockets.Client namespace Microsoft.AspNetCore.Sockets.Client
{ {

View File

@ -7,7 +7,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Protocols.Abstractions" Version="$(MicrosoftAspNetCoreProtocolsAbstractionsPackageVersion)" /> <PackageReference Include="Microsoft.AspNetCore.Connections.Abstractions" Version="$(MicrosoftAspNetCoreConnectionsAbstractionsPackageVersion)" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -2,7 +2,7 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System; using System;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Sockets.Client namespace Microsoft.AspNetCore.Sockets.Client

View File

@ -12,7 +12,7 @@ using System.Runtime.InteropServices;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Http.Features; using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Sockets.Client.Http; using Microsoft.AspNetCore.Sockets.Client.Http;
using Microsoft.AspNetCore.Sockets.Client.Internal; using Microsoft.AspNetCore.Sockets.Client.Internal;
using Microsoft.AspNetCore.Sockets.Http.Internal; using Microsoft.AspNetCore.Sockets.Http.Internal;

View File

@ -4,7 +4,7 @@
using System; using System;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.IO.Pipelines; using System.IO.Pipelines;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
namespace Microsoft.AspNetCore.Sockets.Client namespace Microsoft.AspNetCore.Sockets.Client
{ {

View File

@ -2,7 +2,7 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System; using System;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Sockets.Client namespace Microsoft.AspNetCore.Sockets.Client

View File

@ -8,10 +8,10 @@ using System.Net.Http;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Sockets.Client.Http; using Microsoft.AspNetCore.Sockets.Client.Http;
using Microsoft.AspNetCore.Protocols.Features; using Microsoft.AspNetCore.Connections.Features;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
namespace Microsoft.AspNetCore.Sockets.Client namespace Microsoft.AspNetCore.Sockets.Client
{ {

View File

@ -21,9 +21,6 @@
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="$(MicrosoftExtensionsLoggingAbstractionsPackageVersion)" /> <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="$(MicrosoftExtensionsLoggingAbstractionsPackageVersion)" />
<PackageReference Include="Newtonsoft.Json" Version="$(NewtonsoftJsonPackageVersion)" /> <PackageReference Include="Newtonsoft.Json" Version="$(NewtonsoftJsonPackageVersion)" />
<PackageReference Include="System.IO.Pipelines" Version="$(SystemIOPipelinesPackageVersion)" /> <PackageReference Include="System.IO.Pipelines" Version="$(SystemIOPipelinesPackageVersion)" />
<PackageReference Include="System.Memory" Version="$(SystemMemoryPackageVersion)" />
<PackageReference Include="System.Numerics.Vectors" Version="$(SystemNumericsVectorsPackageVersion)" />
<PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="$(SystemRuntimeCompilerServicesUnsafePackageVersion)" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -2,7 +2,7 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System; using System;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Sockets.Client namespace Microsoft.AspNetCore.Sockets.Client

View File

@ -7,7 +7,7 @@ using System.Net.Http;
using System.Net.Http.Headers; using System.Net.Http.Headers;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Sockets.Client.Http; using Microsoft.AspNetCore.Sockets.Client.Http;
using Microsoft.AspNetCore.Sockets.Internal.Formatters; using Microsoft.AspNetCore.Sockets.Internal.Formatters;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;

View File

@ -3,7 +3,7 @@
using System; using System;
using System.Net.WebSockets; using System.Net.WebSockets;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Sockets.Client namespace Microsoft.AspNetCore.Sockets.Client

View File

@ -9,7 +9,7 @@ using System.Net.WebSockets;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Sockets.Client.Http; using Microsoft.AspNetCore.Sockets.Client.Http;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Logging.Abstractions;

View File

@ -8,15 +8,15 @@ using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.AspNetCore.Builder namespace Microsoft.AspNetCore.Builder
{ {
public static class SocketsAppBuilderExtensions public static class ConnectionsAppBuilderExtensions
{ {
public static IApplicationBuilder UseSockets(this IApplicationBuilder app, Action<SocketRouteBuilder> callback) public static IApplicationBuilder UseConnections(this IApplicationBuilder app, Action<ConnectionsRouteBuilder> callback)
{ {
var dispatcher = app.ApplicationServices.GetRequiredService<HttpConnectionDispatcher>(); var dispatcher = app.ApplicationServices.GetRequiredService<HttpConnectionDispatcher>();
var routes = new RouteBuilder(app); var routes = new RouteBuilder(app);
callback(new SocketRouteBuilder(routes, dispatcher)); callback(new ConnectionsRouteBuilder(routes, dispatcher));
app.UseWebSockets(); app.UseWebSockets();
app.UseRouter(routes.Build()); app.UseRouter(routes.Build());

View File

@ -6,9 +6,9 @@ using Microsoft.Extensions.DependencyInjection.Extensions;
namespace Microsoft.Extensions.DependencyInjection namespace Microsoft.Extensions.DependencyInjection
{ {
public static class SocketsDependencyInjectionExtensions public static class ConnectionsDependencyInjectionExtensions
{ {
public static IServiceCollection AddSockets(this IServiceCollection services) public static IServiceCollection AddConnections(this IServiceCollection services)
{ {
services.AddRouting(); services.AddRouting();
services.AddAuthorizationPolicyEvaluator(); services.AddAuthorizationPolicyEvaluator();

View File

@ -0,0 +1,65 @@
// 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.Reflection;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Routing;
namespace Microsoft.AspNetCore.Sockets
{
public class ConnectionsRouteBuilder
{
private readonly HttpConnectionDispatcher _dispatcher;
private readonly RouteBuilder _routes;
public ConnectionsRouteBuilder(RouteBuilder routes, HttpConnectionDispatcher dispatcher)
{
_routes = routes;
_dispatcher = dispatcher;
}
public void MapConnections(string path, Action<IConnectionBuilder> configure) =>
MapConnections(new PathString(path), new HttpConnectionOptions(), configure);
public void MapConnections(PathString path, Action<IConnectionBuilder> configure) =>
MapConnections(path, new HttpConnectionOptions(), configure);
public void MapConnections(PathString path, HttpConnectionOptions options, Action<IConnectionBuilder> configure)
{
var connectionBuilder = new ConnectionBuilder(_routes.ServiceProvider);
configure(connectionBuilder);
var socket = connectionBuilder.Build();
_routes.MapRoute(path, c => _dispatcher.ExecuteAsync(c, options, socket));
_routes.MapRoute(path + "/negotiate", c => _dispatcher.ExecuteNegotiateAsync(c, options));
}
public void MapConnectionHandler<TConnectionHandler>(string path) where TConnectionHandler : ConnectionHandler
{
MapConnectionHandler<TConnectionHandler>(new PathString(path), configureOptions: null);
}
public void MapConnectionHandler<TConnectionHandler>(PathString path) where TConnectionHandler : ConnectionHandler
{
MapConnectionHandler<TConnectionHandler>(path, configureOptions: null);
}
public void MapConnectionHandler<TConnectionHandler>(PathString path, Action<HttpConnectionOptions> configureOptions) where TConnectionHandler : ConnectionHandler
{
var authorizeAttributes = typeof(TConnectionHandler).GetCustomAttributes<AuthorizeAttribute>(inherit: true);
var options = new HttpConnectionOptions();
foreach (var attribute in authorizeAttributes)
{
options.AuthorizationData.Add(attribute);
}
configureOptions?.Invoke(options);
MapConnections(path, options, builder =>
{
builder.UseConnectionHandler<TConnectionHandler>();
});
}
}
}

View File

@ -2,7 +2,7 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Sockets.Http.Features; using Microsoft.AspNetCore.Sockets.Http.Features;
namespace Microsoft.AspNetCore.Sockets namespace Microsoft.AspNetCore.Sockets

View File

@ -29,7 +29,7 @@ namespace Microsoft.AspNetCore.Sockets
LoggerMessage.Define<long>(LogLevel.Trace, new EventId(6, "ReceivedBytes"), "Received {Count} bytes."); LoggerMessage.Define<long>(LogLevel.Trace, new EventId(6, "ReceivedBytes"), "Received {Count} bytes.");
private static readonly Action<ILogger, TransportType, Exception> _transportNotSupported = private static readonly Action<ILogger, TransportType, Exception> _transportNotSupported =
LoggerMessage.Define<TransportType>(LogLevel.Debug, new EventId(7, "TransportNotSupported"), "{TransportType} transport not supported by this endpoint type."); LoggerMessage.Define<TransportType>(LogLevel.Debug, new EventId(7, "TransportNotSupported"), "{TransportType} transport not supported by this connection handler.");
private static readonly Action<ILogger, TransportType, TransportType, Exception> _cannotChangeTransport = private static readonly Action<ILogger, TransportType, TransportType, Exception> _cannotChangeTransport =
LoggerMessage.Define<TransportType, TransportType>(LogLevel.Error, new EventId(8, "CannotChangeTransport"), "Cannot change transports mid-connection; currently using {TransportType}, requesting {RequestedTransport}."); LoggerMessage.Define<TransportType, TransportType>(LogLevel.Error, new EventId(8, "CannotChangeTransport"), "Cannot change transports mid-connection; currently using {TransportType}, requesting {RequestedTransport}.");

View File

@ -12,8 +12,8 @@ using System.Threading.Tasks;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Features; using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Http.Internal; using Microsoft.AspNetCore.Http.Internal;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Protocols.Features; using Microsoft.AspNetCore.Connections.Features;
using Microsoft.AspNetCore.Sockets.Internal; using Microsoft.AspNetCore.Sockets.Internal;
using Microsoft.AspNetCore.Sockets.Internal.Transports; using Microsoft.AspNetCore.Sockets.Internal.Transports;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
@ -35,7 +35,7 @@ namespace Microsoft.AspNetCore.Sockets
_logger = _loggerFactory.CreateLogger<HttpConnectionDispatcher>(); _logger = _loggerFactory.CreateLogger<HttpConnectionDispatcher>();
} }
public async Task ExecuteAsync(HttpContext context, HttpSocketOptions options, ConnectionDelegate connectionDelegate) public async Task ExecuteAsync(HttpContext context, HttpConnectionOptions options, ConnectionDelegate connectionDelegate)
{ {
// Create the log scope and attempt to pass the Connection ID to it so as many logs as possible contain // Create the log scope and attempt to pass the Connection ID to it so as many logs as possible contain
// the Connection ID metadata. If this is the negotiate request then the Connection ID for the scope will // the Connection ID metadata. If this is the negotiate request then the Connection ID for the scope will
@ -56,7 +56,7 @@ namespace Microsoft.AspNetCore.Sockets
else if (HttpMethods.IsGet(context.Request.Method)) else if (HttpMethods.IsGet(context.Request.Method))
{ {
// GET /{path} // GET /{path}
await ExecuteEndpointAsync(context, connectionDelegate, options, logScope); await ExecuteAsync(context, connectionDelegate, options, logScope);
} }
else else
{ {
@ -66,7 +66,7 @@ namespace Microsoft.AspNetCore.Sockets
} }
} }
public async Task ExecuteNegotiateAsync(HttpContext context, HttpSocketOptions options) public async Task ExecuteNegotiateAsync(HttpContext context, HttpConnectionOptions options)
{ {
// Create the log scope and the scope connectionId param will be set when the connection is created. // Create the log scope and the scope connectionId param will be set when the connection is created.
var logScope = new ConnectionLogScope(connectionId: string.Empty); var logScope = new ConnectionLogScope(connectionId: string.Empty);
@ -90,7 +90,7 @@ namespace Microsoft.AspNetCore.Sockets
} }
} }
private async Task ExecuteEndpointAsync(HttpContext context, ConnectionDelegate connectionDelegate, HttpSocketOptions options, ConnectionLogScope logScope) private async Task ExecuteAsync(HttpContext context, ConnectionDelegate connectionDelegate, HttpConnectionOptions options, ConnectionLogScope logScope)
{ {
var supportedTransports = options.Transports; var supportedTransports = options.Transports;
@ -356,7 +356,7 @@ namespace Microsoft.AspNetCore.Sockets
await connectionDelegate(connection); await connectionDelegate(connection);
} }
private Task ProcessNegotiate(HttpContext context, HttpSocketOptions options, ConnectionLogScope logScope) private Task ProcessNegotiate(HttpContext context, HttpConnectionOptions options, ConnectionLogScope logScope)
{ {
context.Response.ContentType = "application/json"; context.Response.ContentType = "application/json";
@ -377,7 +377,7 @@ namespace Microsoft.AspNetCore.Sockets
return context.Response.Body.WriteAsync(negotiateResponseBuffer, 0, negotiateResponseBuffer.Length); return context.Response.Body.WriteAsync(negotiateResponseBuffer, 0, negotiateResponseBuffer.Length);
} }
private static string GetNegotiatePayload(string connectionId, HttpContext context, HttpSocketOptions options) private static string GetNegotiatePayload(string connectionId, HttpContext context, HttpConnectionOptions options)
{ {
var sb = new StringBuilder(); var sb = new StringBuilder();
using (var jsonWriter = new JsonTextWriter(new StringWriter(sb))) using (var jsonWriter = new JsonTextWriter(new StringWriter(sb)))
@ -441,7 +441,7 @@ namespace Microsoft.AspNetCore.Sockets
private static string GetConnectionId(HttpContext context) => context.Request.Query["id"]; private static string GetConnectionId(HttpContext context) => context.Request.Query["id"];
private async Task ProcessSend(HttpContext context, HttpSocketOptions options) private async Task ProcessSend(HttpContext context, HttpConnectionOptions options)
{ {
var connection = await GetConnectionAsync(context, options); var connection = await GetConnectionAsync(context, options);
if (connection == null) if (connection == null)
@ -471,7 +471,7 @@ namespace Microsoft.AspNetCore.Sockets
await connection.Application.Output.FlushAsync(); await connection.Application.Output.FlushAsync();
} }
private async Task<bool> EnsureConnectionStateAsync(DefaultConnectionContext connection, HttpContext context, TransportType transportType, TransportType supportedTransports, ConnectionLogScope logScope, HttpSocketOptions options) private async Task<bool> EnsureConnectionStateAsync(DefaultConnectionContext connection, HttpContext context, TransportType transportType, TransportType supportedTransports, ConnectionLogScope logScope, HttpConnectionOptions options)
{ {
if ((supportedTransports & transportType) == 0) if ((supportedTransports & transportType) == 0)
{ {
@ -596,7 +596,7 @@ namespace Microsoft.AspNetCore.Sockets
return newHttpContext; return newHttpContext;
} }
private async Task<DefaultConnectionContext> GetConnectionAsync(HttpContext context, HttpSocketOptions options) private async Task<DefaultConnectionContext> GetConnectionAsync(HttpContext context, HttpConnectionOptions options)
{ {
var connectionId = GetConnectionId(context); var connectionId = GetConnectionId(context);
@ -623,7 +623,7 @@ namespace Microsoft.AspNetCore.Sockets
return connection; return connection;
} }
private void EnsureConnectionStateInternal(DefaultConnectionContext connection, HttpSocketOptions options) private void EnsureConnectionStateInternal(DefaultConnectionContext connection, HttpConnectionOptions options)
{ {
// If the connection doesn't have a pipe yet then create one, we lazily create the pipe to save on allocations until the client actually connects // If the connection doesn't have a pipe yet then create one, we lazily create the pipe to save on allocations until the client actually connects
if (connection.Transport == null) if (connection.Transport == null)
@ -637,7 +637,7 @@ namespace Microsoft.AspNetCore.Sockets
} }
// This is only used for WebSockets connections, which can connect directly without negotiating // This is only used for WebSockets connections, which can connect directly without negotiating
private async Task<DefaultConnectionContext> GetOrCreateConnectionAsync(HttpContext context, HttpSocketOptions options) private async Task<DefaultConnectionContext> GetOrCreateConnectionAsync(HttpContext context, HttpConnectionOptions options)
{ {
var connectionId = GetConnectionId(context); var connectionId = GetConnectionId(context);
DefaultConnectionContext connection; DefaultConnectionContext connection;

View File

@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Authorization;
namespace Microsoft.AspNetCore.Sockets namespace Microsoft.AspNetCore.Sockets
{ {
public class HttpSocketOptions public class HttpConnectionOptions
{ {
public IList<IAuthorizeData> AuthorizationData { get; } = new List<IAuthorizeData>(); public IList<IAuthorizeData> AuthorizationData { get; } = new List<IAuthorizeData>();

View File

@ -9,7 +9,7 @@ using System.Runtime.InteropServices;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Sockets.Internal.Transports namespace Microsoft.AspNetCore.Sockets.Internal.Transports

View File

@ -1,65 +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.Reflection;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Protocols;
using Microsoft.AspNetCore.Routing;
namespace Microsoft.AspNetCore.Sockets
{
public class SocketRouteBuilder
{
private readonly HttpConnectionDispatcher _dispatcher;
private readonly RouteBuilder _routes;
public SocketRouteBuilder(RouteBuilder routes, HttpConnectionDispatcher dispatcher)
{
_routes = routes;
_dispatcher = dispatcher;
}
public void MapSocket(string path, Action<IConnectionBuilder> socketConfig) =>
MapSocket(new PathString(path), new HttpSocketOptions(), socketConfig);
public void MapSocket(PathString path, Action<IConnectionBuilder> socketConfig) =>
MapSocket(path, new HttpSocketOptions(), socketConfig);
public void MapSocket(PathString path, HttpSocketOptions options, Action<IConnectionBuilder> connectionConfig)
{
var connectionBuilder = new ConnectionBuilder(_routes.ServiceProvider);
connectionConfig(connectionBuilder);
var socket = connectionBuilder.Build();
_routes.MapRoute(path, c => _dispatcher.ExecuteAsync(c, options, socket));
_routes.MapRoute(path + "/negotiate", c => _dispatcher.ExecuteNegotiateAsync(c, options));
}
public void MapEndPoint<TEndPoint>(string path) where TEndPoint : EndPoint
{
MapEndPoint<TEndPoint>(new PathString(path), socketOptions: null);
}
public void MapEndPoint<TEndPoint>(PathString path) where TEndPoint : EndPoint
{
MapEndPoint<TEndPoint>(path, socketOptions: null);
}
public void MapEndPoint<TEndPoint>(PathString path, Action<HttpSocketOptions> socketOptions) where TEndPoint : EndPoint
{
var authorizeAttributes = typeof(TEndPoint).GetCustomAttributes<AuthorizeAttribute>(inherit: true);
var options = new HttpSocketOptions();
foreach (var attribute in authorizeAttributes)
{
options.AuthorizationData.Add(attribute);
}
socketOptions?.Invoke(options);
MapSocket(path, options, builder =>
{
builder.UseEndPoint<TEndPoint>();
});
}
}
}

View File

@ -3,7 +3,7 @@
using System; using System;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Sockets; using Microsoft.AspNetCore.Sockets;
using Xunit; using Xunit;

View File

@ -6,7 +6,7 @@ using System.Net;
using System.Net.Http; using System.Net.Http;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Client.Tests; using Microsoft.AspNetCore.Client.Tests;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Sockets; using Microsoft.AspNetCore.Sockets;
using Microsoft.AspNetCore.Sockets.Client; using Microsoft.AspNetCore.Sockets.Client;
using Microsoft.Extensions.Logging.Testing; using Microsoft.Extensions.Logging.Testing;

View File

@ -5,7 +5,7 @@ using System;
using System.Net; using System.Net;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Client.Tests; using Microsoft.AspNetCore.Client.Tests;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Sockets; using Microsoft.AspNetCore.Sockets;
using Microsoft.AspNetCore.Sockets.Client; using Microsoft.AspNetCore.Sockets.Client;
using Moq; using Moq;

View File

@ -6,7 +6,7 @@ using System.Net;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Client.Tests; using Microsoft.AspNetCore.Client.Tests;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Sockets; using Microsoft.AspNetCore.Sockets;
using Xunit; using Xunit;

View File

@ -6,7 +6,7 @@ using System.Net;
using System.Net.Http; using System.Net.Http;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Client.Tests; using Microsoft.AspNetCore.Client.Tests;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Sockets; using Microsoft.AspNetCore.Sockets;
using Xunit; using Xunit;

View File

@ -9,7 +9,7 @@ using System.Security.Cryptography.X509Certificates;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Client.Tests; using Microsoft.AspNetCore.Client.Tests;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Sockets.Client; using Microsoft.AspNetCore.Sockets.Client;
using Microsoft.AspNetCore.Sockets.Client.Http; using Microsoft.AspNetCore.Sockets.Client.Http;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;

View File

@ -6,7 +6,7 @@ using System.Collections.Generic;
using System.IO; using System.IO;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Http.Features; using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.SignalR.Internal; using Microsoft.AspNetCore.SignalR.Internal;
using Microsoft.AspNetCore.SignalR.Internal.Protocol; using Microsoft.AspNetCore.SignalR.Internal.Protocol;
using Microsoft.AspNetCore.Sockets.Client; using Microsoft.AspNetCore.Sockets.Client;

View File

@ -13,7 +13,7 @@ using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Channels; using System.Threading.Channels;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.SignalR.Client.Tests; using Microsoft.AspNetCore.SignalR.Client.Tests;
using Microsoft.AspNetCore.Sockets; using Microsoft.AspNetCore.Sockets;
using Microsoft.AspNetCore.Sockets.Client; using Microsoft.AspNetCore.Sockets.Client;

View File

@ -5,7 +5,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Net; using System.Net;
using System.Net.Http; using System.Net.Http;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Sockets; using Microsoft.AspNetCore.Sockets;
using Newtonsoft.Json; using Newtonsoft.Json;
using SocketsTransportType = Microsoft.AspNetCore.Sockets.TransportType; using SocketsTransportType = Microsoft.AspNetCore.Sockets.TransportType;

View File

@ -13,7 +13,7 @@ using System.Threading;
using System.Threading.Channels; using System.Threading.Channels;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Client.Tests; using Microsoft.AspNetCore.Client.Tests;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Sockets; using Microsoft.AspNetCore.Sockets;
using Microsoft.AspNetCore.Sockets.Client; using Microsoft.AspNetCore.Sockets.Client;
using Microsoft.AspNetCore.Sockets.Client.Http; using Microsoft.AspNetCore.Sockets.Client.Http;

View File

@ -9,7 +9,7 @@ using System.Threading;
using System.Threading.Channels; using System.Threading.Channels;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Http.Features; using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.SignalR.Internal.Formatters; using Microsoft.AspNetCore.SignalR.Internal.Formatters;
using Microsoft.AspNetCore.SignalR.Internal.Protocol; using Microsoft.AspNetCore.SignalR.Internal.Protocol;
using Microsoft.AspNetCore.Sockets.Client; using Microsoft.AspNetCore.Sockets.Client;

View File

@ -1,7 +1,7 @@
using System; using System;
using System.IO.Pipelines; using System.IO.Pipelines;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Sockets; using Microsoft.AspNetCore.Sockets;
using Microsoft.AspNetCore.Sockets.Client; using Microsoft.AspNetCore.Sockets.Client;

View File

@ -2,7 +2,7 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System; using System;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.SignalR.Internal; using Microsoft.AspNetCore.SignalR.Internal;
using Microsoft.AspNetCore.SignalR.Internal.Protocol; using Microsoft.AspNetCore.SignalR.Internal.Protocol;
using Microsoft.AspNetCore.Sockets; using Microsoft.AspNetCore.Sockets;

View File

@ -51,7 +51,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests
} }
public async Task<Task> ConnectAsync( public async Task<Task> ConnectAsync(
EndPoint endPoint, Connections.ConnectionHandler handler,
bool sendHandshakeRequestMessage = true, bool sendHandshakeRequestMessage = true,
bool expectedHandshakeResponseMessage = true) bool expectedHandshakeResponseMessage = true)
{ {
@ -64,7 +64,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests
} }
} }
var connection = endPoint.OnConnectedAsync(Connection); var connection = handler.OnConnectedAsync(Connection);
if (expectedHandshakeResponseMessage) if (expectedHandshakeResponseMessage)
{ {

View File

@ -4,12 +4,12 @@
using System.Buffers; using System.Buffers;
using System.IO.Pipelines; using System.IO.Pipelines;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Sockets; using Microsoft.AspNetCore.Sockets;
namespace Microsoft.AspNetCore.SignalR.Tests namespace Microsoft.AspNetCore.SignalR.Tests
{ {
public class EchoEndPoint : EndPoint public class EchoConnectionHandler : ConnectionHandler
{ {
public override async Task OnConnectedAsync(ConnectionContext connection) public override async Task OnConnectedAsync(ConnectionContext connection)
{ {

View File

@ -9,7 +9,7 @@ using System.Net.WebSockets;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.SignalR.Client; using Microsoft.AspNetCore.SignalR.Client;
using Microsoft.AspNetCore.Sockets; using Microsoft.AspNetCore.Sockets;
using Microsoft.AspNetCore.Sockets.Client; using Microsoft.AspNetCore.Sockets.Client;
@ -215,7 +215,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests
catch (OperationCanceledException) catch (OperationCanceledException)
{ {
// Because the server and client are run in the same process there is a race where websocket.SendAsync // Because the server and client are run in the same process there is a race where websocket.SendAsync
// can send a message but before returning be suspended allowing the server to run the EchoEndpoint and // can send a message but before returning be suspended allowing the server to run the EchoConnectionHandler and
// send a close frame which triggers a cancellation token on the client and cancels the websocket.SendAsync. // send a close frame which triggers a cancellation token on the client and cancels the websocket.SendAsync.
// Our solution to this is to just catch OperationCanceledException from the sent message if the race happens // Our solution to this is to just catch OperationCanceledException from the sent message if the race happens
// because we know the send went through, and its safe to check the response. // because we know the send went through, and its safe to check the response.

View File

@ -7,13 +7,13 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Sockets; using Microsoft.AspNetCore.Sockets;
using Microsoft.AspNetCore.Sockets.Http.Features; using Microsoft.AspNetCore.Sockets.Http.Features;
namespace Microsoft.AspNetCore.SignalR.Tests namespace Microsoft.AspNetCore.SignalR.Tests
{ {
public class HttpHeaderEndPoint : EndPoint public class HttpHeaderConnectionHandler : ConnectionHandler
{ {
public override async Task OnConnectedAsync(ConnectionContext connection) public override async Task OnConnectedAsync(ConnectionContext connection)
{ {

View File

@ -9,7 +9,7 @@ using System.Threading.Channels;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
namespace Microsoft.AspNetCore.SignalR.Tests.HubEndpointTestUtils namespace Microsoft.AspNetCore.SignalR.Tests
{ {
public class MethodHub : TestHub public class MethodHub : TestHub
{ {

View File

@ -7,14 +7,14 @@ using Microsoft.AspNetCore.Sockets;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Xunit; using Xunit;
namespace Microsoft.AspNetCore.SignalR.Tests.HubEndpointTestUtils namespace Microsoft.AspNetCore.SignalR.Tests
{ {
public class HubEndPointTestUtils public class HubConnectionHandlerTestUtils
{ {
public static Type GetEndPointType(Type hubType) public static Type GetConnectionHandlerType(Type hubType)
{ {
var endPointType = typeof(HubEndPoint<>); var connectionHandlerType = typeof(HubConnectionHandler<>);
return endPointType.MakeGenericType(hubType); return connectionHandlerType.MakeGenericType(hubType);
} }
public static Type GetGenericType(Type genericType, Type hubType) public static Type GetGenericType(Type genericType, Type hubType)
@ -65,10 +65,10 @@ namespace Microsoft.AspNetCore.SignalR.Tests.HubEndpointTestUtils
return services.BuildServiceProvider(); return services.BuildServiceProvider();
} }
public static EndPoint GetHubEndpoint(Type hubType) public static Connections.ConnectionHandler GetHubConnectionHandler(Type hubType)
{ {
var serviceProvider = CreateServiceProvider(); var serviceProvider = CreateServiceProvider();
return (EndPoint)serviceProvider.GetService(GetEndPointType(hubType)); return (Connections.ConnectionHandler)serviceProvider.GetService(GetConnectionHandlerType(hubType));
} }
} }

View File

@ -4,7 +4,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Microsoft.AspNetCore.Http.Features; using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.SignalR.Internal; using Microsoft.AspNetCore.SignalR.Internal;
using Microsoft.AspNetCore.SignalR.Internal.Protocol; using Microsoft.AspNetCore.SignalR.Internal.Protocol;
using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Logging.Abstractions;

View File

@ -14,7 +14,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests
{ {
var ex = Assert.Throws<NotSupportedException>(() => var ex = Assert.Throws<NotSupportedException>(() =>
{ {
using (var builder = BuildWebHost(options => options.MapHub<InvalidHub>("/overloads"))) using (var builder = BuildWebHost(routes => routes.MapHub<InvalidHub>("/overloads")))
{ {
builder.Start(); builder.Start();
} }
@ -31,9 +31,9 @@ namespace Microsoft.AspNetCore.SignalR.Tests
.Configure(app => .Configure(app =>
{ {
var ex = Assert.Throws<InvalidOperationException>(() => { var ex = Assert.Throws<InvalidOperationException>(() => {
app.UseSignalR(options => app.UseSignalR(routes =>
{ {
options.MapHub<AuthHub>("/overloads"); routes.MapHub<AuthHub>("/overloads");
}); });
}); });
@ -47,9 +47,9 @@ namespace Microsoft.AspNetCore.SignalR.Tests
public void MapHubFindsAuthAttributeOnHub() public void MapHubFindsAuthAttributeOnHub()
{ {
var authCount = 0; var authCount = 0;
using (var builder = BuildWebHost(options => options.MapHub<AuthHub>("/path", httpSocketOptions => using (var builder = BuildWebHost(routes => routes.MapHub<AuthHub>("/path", options =>
{ {
authCount += httpSocketOptions.AuthorizationData.Count; authCount += options.AuthorizationData.Count;
}))) })))
{ {
builder.Start(); builder.Start();
@ -62,9 +62,9 @@ namespace Microsoft.AspNetCore.SignalR.Tests
public void MapHubFindsAuthAttributeOnInheritedHub() public void MapHubFindsAuthAttributeOnInheritedHub()
{ {
var authCount = 0; var authCount = 0;
using (var builder = BuildWebHost(options => options.MapHub<InheritedAuthHub>("/path", httpSocketOptions => using (var builder = BuildWebHost(routes => routes.MapHub<InheritedAuthHub>("/path", options =>
{ {
authCount += httpSocketOptions.AuthorizationData.Count; authCount += options.AuthorizationData.Count;
}))) })))
{ {
builder.Start(); builder.Start();
@ -77,9 +77,9 @@ namespace Microsoft.AspNetCore.SignalR.Tests
public void MapHubFindsMultipleAuthAttributesOnDoubleAuthHub() public void MapHubFindsMultipleAuthAttributesOnDoubleAuthHub()
{ {
var authCount = 0; var authCount = 0;
using (var builder = BuildWebHost(options => options.MapHub<DoubleAuthHub>("/path", httpSocketOptions => using (var builder = BuildWebHost(routes => routes.MapHub<DoubleAuthHub>("/path", options =>
{ {
authCount += httpSocketOptions.AuthorizationData.Count; authCount += options.AuthorizationData.Count;
}))) })))
{ {
builder.Start(); builder.Start();

View File

@ -11,16 +11,16 @@ namespace Microsoft.AspNetCore.SignalR.Tests
{ {
public void ConfigureServices(IServiceCollection services) public void ConfigureServices(IServiceCollection services)
{ {
services.AddSockets(); services.AddConnections();
services.AddSignalR(); services.AddSignalR();
services.AddSingleton<EchoEndPoint>(); services.AddSingleton<EchoConnectionHandler>();
services.AddSingleton<HttpHeaderEndPoint>(); services.AddSingleton<HttpHeaderConnectionHandler>();
} }
public void Configure(IApplicationBuilder app, IHostingEnvironment env) public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{ {
app.UseSockets(options => options.MapEndPoint<EchoEndPoint>("/echo")); app.UseConnections(options => options.MapConnectionHandler<EchoConnectionHandler>("/echo"));
app.UseSockets(options => options.MapEndPoint<HttpHeaderEndPoint>("/httpheader")); app.UseConnections(options => options.MapConnectionHandler<HttpHeaderConnectionHandler>("/httpheader"));
app.UseSignalR(options => options.MapHub<UncreatableHub>("/uncreatable")); app.UseSignalR(options => options.MapHub<UncreatableHub>("/uncreatable"));
} }
} }

View File

@ -13,7 +13,7 @@ using System.Reflection;
using System.Security.Cryptography.X509Certificates; using System.Security.Cryptography.X509Certificates;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Sockets; using Microsoft.AspNetCore.Sockets;
using Microsoft.AspNetCore.Sockets.Client; using Microsoft.AspNetCore.Sockets.Client;
using Microsoft.AspNetCore.Sockets.Client.Http; using Microsoft.AspNetCore.Sockets.Client.Http;

View File

@ -18,8 +18,8 @@ using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Features; using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Http.Internal; using Microsoft.AspNetCore.Http.Internal;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Protocols.Features; using Microsoft.AspNetCore.Connections.Features;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Testing; using Microsoft.Extensions.Logging.Testing;
@ -46,13 +46,13 @@ namespace Microsoft.AspNetCore.Sockets.Tests
var dispatcher = new HttpConnectionDispatcher(manager, loggerFactory); var dispatcher = new HttpConnectionDispatcher(manager, loggerFactory);
var context = new DefaultHttpContext(); var context = new DefaultHttpContext();
var services = new ServiceCollection(); var services = new ServiceCollection();
services.AddSingleton<TestEndPoint>(); services.AddSingleton<TestConnectionHandler>();
services.AddOptions(); services.AddOptions();
var ms = new MemoryStream(); var ms = new MemoryStream();
context.Request.Path = "/foo"; context.Request.Path = "/foo";
context.Request.Method = "POST"; context.Request.Method = "POST";
context.Response.Body = ms; context.Response.Body = ms;
await dispatcher.ExecuteNegotiateAsync(context, new HttpSocketOptions()); await dispatcher.ExecuteNegotiateAsync(context, new HttpConnectionOptions());
var negotiateResponse = JsonConvert.DeserializeObject<JObject>(Encoding.UTF8.GetString(ms.ToArray())); var negotiateResponse = JsonConvert.DeserializeObject<JObject>(Encoding.UTF8.GetString(ms.ToArray()));
var connectionId = negotiateResponse.Value<string>("connectionId"); var connectionId = negotiateResponse.Value<string>("connectionId");
Assert.True(manager.TryGetConnection(connectionId, out var connectionContext)); Assert.True(manager.TryGetConnection(connectionId, out var connectionContext));
@ -69,20 +69,20 @@ namespace Microsoft.AspNetCore.Sockets.Tests
var dispatcher = new HttpConnectionDispatcher(manager, loggerFactory); var dispatcher = new HttpConnectionDispatcher(manager, loggerFactory);
var context = new DefaultHttpContext(); var context = new DefaultHttpContext();
var services = new ServiceCollection(); var services = new ServiceCollection();
services.AddSingleton<TestEndPoint>(); services.AddSingleton<TestConnectionHandler>();
services.AddOptions(); services.AddOptions();
var ms = new MemoryStream(); var ms = new MemoryStream();
context.Request.Path = "/foo"; context.Request.Path = "/foo";
context.Request.Method = "POST"; context.Request.Method = "POST";
context.Response.Body = ms; context.Response.Body = ms;
var httpSocketOptions = new HttpSocketOptions { TransportMaxBufferSize = 4, ApplicationMaxBufferSize = 4 }; var options = new HttpConnectionOptions { TransportMaxBufferSize = 4, ApplicationMaxBufferSize = 4 };
await dispatcher.ExecuteNegotiateAsync(context, httpSocketOptions); await dispatcher.ExecuteNegotiateAsync(context, options);
var negotiateResponse = JsonConvert.DeserializeObject<JObject>(Encoding.UTF8.GetString(ms.ToArray())); var negotiateResponse = JsonConvert.DeserializeObject<JObject>(Encoding.UTF8.GetString(ms.ToArray()));
var connectionId = negotiateResponse.Value<string>("connectionId"); var connectionId = negotiateResponse.Value<string>("connectionId");
context.Request.QueryString = context.Request.QueryString.Add("id", connectionId); context.Request.QueryString = context.Request.QueryString.Add("id", connectionId);
Assert.True(manager.TryGetConnection(connectionId, out var connection)); Assert.True(manager.TryGetConnection(connectionId, out var connection));
// Fake actual connection after negotiate to populate the pipes on the connection // Fake actual connection after negotiate to populate the pipes on the connection
await dispatcher.ExecuteAsync(context, httpSocketOptions, c => Task.CompletedTask); await dispatcher.ExecuteAsync(context, options, c => Task.CompletedTask);
// This write should complete immediately but it exceeds the writer threshold // This write should complete immediately but it exceeds the writer threshold
var writeTask = connection.Application.Output.WriteAsync(new byte[] { (byte)'b', (byte)'y', (byte)'t', (byte)'e', (byte)'s' }); var writeTask = connection.Application.Output.WriteAsync(new byte[] { (byte)'b', (byte)'y', (byte)'t', (byte)'e', (byte)'s' });
@ -121,7 +121,7 @@ namespace Microsoft.AspNetCore.Sockets.Tests
context.Response.Body = responseBody; context.Response.Body = responseBody;
var services = new ServiceCollection(); var services = new ServiceCollection();
services.AddSingleton<TestEndPoint>(); services.AddSingleton<TestConnectionHandler>();
services.AddOptions(); services.AddOptions();
context.Request.Path = "/foo"; context.Request.Path = "/foo";
context.Request.Method = "POST"; context.Request.Method = "POST";
@ -131,11 +131,11 @@ namespace Microsoft.AspNetCore.Sockets.Tests
context.Request.Query = qs; context.Request.Query = qs;
var builder = new ConnectionBuilder(services.BuildServiceProvider()); var builder = new ConnectionBuilder(services.BuildServiceProvider());
builder.UseEndPoint<TestEndPoint>(); builder.UseConnectionHandler<TestConnectionHandler>();
var app = builder.Build(); var app = builder.Build();
// This task should complete immediately but it exceeds the writer threshold // This task should complete immediately but it exceeds the writer threshold
var executeTask = dispatcher.ExecuteAsync(context, new HttpSocketOptions(), app); var executeTask = dispatcher.ExecuteAsync(context, new HttpConnectionOptions(), app);
Assert.False(executeTask.IsCompleted); Assert.False(executeTask.IsCompleted);
await connection.Transport.Input.ConsumeAsync(10); await connection.Transport.Input.ConsumeAsync(10);
await executeTask.OrTimeout(); await executeTask.OrTimeout();
@ -161,13 +161,13 @@ namespace Microsoft.AspNetCore.Sockets.Tests
context.Features.Set<IHttpResponseFeature>(new ResponseFeature()); context.Features.Set<IHttpResponseFeature>(new ResponseFeature());
context.Features.Set<IHttpWebSocketFeature>(new TestWebSocketConnectionFeature()); context.Features.Set<IHttpWebSocketFeature>(new TestWebSocketConnectionFeature());
var services = new ServiceCollection(); var services = new ServiceCollection();
services.AddSingleton<TestEndPoint>(); services.AddSingleton<TestConnectionHandler>();
services.AddOptions(); services.AddOptions();
var ms = new MemoryStream(); var ms = new MemoryStream();
context.Request.Path = "/foo"; context.Request.Path = "/foo";
context.Request.Method = "POST"; context.Request.Method = "POST";
context.Response.Body = ms; context.Response.Body = ms;
await dispatcher.ExecuteNegotiateAsync(context, new HttpSocketOptions { Transports = transports }); await dispatcher.ExecuteNegotiateAsync(context, new HttpConnectionOptions { Transports = transports });
var negotiateResponse = JsonConvert.DeserializeObject<JObject>(Encoding.UTF8.GetString(ms.ToArray())); var negotiateResponse = JsonConvert.DeserializeObject<JObject>(Encoding.UTF8.GetString(ms.ToArray()));
var availableTransports = (TransportType)0; var availableTransports = (TransportType)0;
@ -199,7 +199,7 @@ namespace Microsoft.AspNetCore.Sockets.Tests
context.Response.Body = strm; context.Response.Body = strm;
var services = new ServiceCollection(); var services = new ServiceCollection();
services.AddSingleton<TestEndPoint>(); services.AddSingleton<TestConnectionHandler>();
services.AddOptions(); services.AddOptions();
context.Request.Path = "/foo"; context.Request.Path = "/foo";
context.Request.Method = "GET"; context.Request.Method = "GET";
@ -210,9 +210,9 @@ namespace Microsoft.AspNetCore.Sockets.Tests
SetTransport(context, transportType); SetTransport(context, transportType);
var builder = new ConnectionBuilder(services.BuildServiceProvider()); var builder = new ConnectionBuilder(services.BuildServiceProvider());
builder.UseEndPoint<TestEndPoint>(); builder.UseConnectionHandler<TestConnectionHandler>();
var app = builder.Build(); var app = builder.Build();
await dispatcher.ExecuteAsync(context, new HttpSocketOptions(), app); await dispatcher.ExecuteAsync(context, new HttpConnectionOptions(), app);
Assert.Equal(StatusCodes.Status404NotFound, context.Response.StatusCode); Assert.Equal(StatusCodes.Status404NotFound, context.Response.StatusCode);
await strm.FlushAsync(); await strm.FlushAsync();
@ -235,7 +235,7 @@ namespace Microsoft.AspNetCore.Sockets.Tests
context.Response.Body = strm; context.Response.Body = strm;
var services = new ServiceCollection(); var services = new ServiceCollection();
services.AddSingleton<TestEndPoint>(); services.AddSingleton<TestConnectionHandler>();
services.AddOptions(); services.AddOptions();
context.Request.Path = "/foo"; context.Request.Path = "/foo";
context.Request.Method = "POST"; context.Request.Method = "POST";
@ -245,9 +245,9 @@ namespace Microsoft.AspNetCore.Sockets.Tests
context.Request.Query = qs; context.Request.Query = qs;
var builder = new ConnectionBuilder(services.BuildServiceProvider()); var builder = new ConnectionBuilder(services.BuildServiceProvider());
builder.UseEndPoint<TestEndPoint>(); builder.UseConnectionHandler<TestConnectionHandler>();
var app = builder.Build(); var app = builder.Build();
await dispatcher.ExecuteAsync(context, new HttpSocketOptions(), app); await dispatcher.ExecuteAsync(context, new HttpConnectionOptions(), app);
Assert.Equal(StatusCodes.Status404NotFound, context.Response.StatusCode); Assert.Equal(StatusCodes.Status404NotFound, context.Response.StatusCode);
await strm.FlushAsync(); await strm.FlushAsync();
@ -272,7 +272,7 @@ namespace Microsoft.AspNetCore.Sockets.Tests
context.Response.Body = strm; context.Response.Body = strm;
var services = new ServiceCollection(); var services = new ServiceCollection();
services.AddSingleton<TestEndPoint>(); services.AddSingleton<TestConnectionHandler>();
services.AddOptions(); services.AddOptions();
context.Request.Path = "/foo"; context.Request.Path = "/foo";
context.Request.Method = "POST"; context.Request.Method = "POST";
@ -282,9 +282,9 @@ namespace Microsoft.AspNetCore.Sockets.Tests
context.Request.Query = qs; context.Request.Query = qs;
var builder = new ConnectionBuilder(services.BuildServiceProvider()); var builder = new ConnectionBuilder(services.BuildServiceProvider());
builder.UseEndPoint<TestEndPoint>(); builder.UseConnectionHandler<TestConnectionHandler>();
var app = builder.Build(); var app = builder.Build();
await dispatcher.ExecuteAsync(context, new HttpSocketOptions(), app); await dispatcher.ExecuteAsync(context, new HttpConnectionOptions(), app);
Assert.Equal(StatusCodes.Status405MethodNotAllowed, context.Response.StatusCode); Assert.Equal(StatusCodes.Status405MethodNotAllowed, context.Response.StatusCode);
await strm.FlushAsync(); await strm.FlushAsync();
@ -317,7 +317,7 @@ namespace Microsoft.AspNetCore.Sockets.Tests
context.Response.Body = responseBody; context.Response.Body = responseBody;
var services = new ServiceCollection(); var services = new ServiceCollection();
services.AddSingleton<TestEndPoint>(); services.AddSingleton<TestConnectionHandler>();
services.AddOptions(); services.AddOptions();
context.Request.Path = "/foo"; context.Request.Path = "/foo";
context.Request.Method = "POST"; context.Request.Method = "POST";
@ -327,10 +327,10 @@ namespace Microsoft.AspNetCore.Sockets.Tests
context.Request.Query = qs; context.Request.Query = qs;
var builder = new ConnectionBuilder(services.BuildServiceProvider()); var builder = new ConnectionBuilder(services.BuildServiceProvider());
builder.UseEndPoint<TestEndPoint>(); builder.UseConnectionHandler<TestConnectionHandler>();
var app = builder.Build(); var app = builder.Build();
await dispatcher.ExecuteAsync(context, new HttpSocketOptions(), app); await dispatcher.ExecuteAsync(context, new HttpConnectionOptions(), app);
Assert.True(connection.Transport.Input.TryRead(out var result)); Assert.True(connection.Transport.Input.TryRead(out var result));
Assert.Equal("Hello World", Encoding.UTF8.GetString(result.Buffer.ToArray())); Assert.Equal("Hello World", Encoding.UTF8.GetString(result.Buffer.ToArray()));
@ -356,7 +356,7 @@ namespace Microsoft.AspNetCore.Sockets.Tests
context.Response.Body = responseBody; context.Response.Body = responseBody;
var services = new ServiceCollection(); var services = new ServiceCollection();
services.AddSingleton<HttpContextEndPoint>(); services.AddSingleton<HttpContextConnectionHandler>();
services.AddOptions(); services.AddOptions();
// Setup state on the HttpContext // Setup state on the HttpContext
@ -379,11 +379,11 @@ namespace Microsoft.AspNetCore.Sockets.Tests
context.Connection.RemotePort = 43456; context.Connection.RemotePort = 43456;
var builder = new ConnectionBuilder(services.BuildServiceProvider()); var builder = new ConnectionBuilder(services.BuildServiceProvider());
builder.UseEndPoint<HttpContextEndPoint>(); builder.UseConnectionHandler<HttpContextConnectionHandler>();
var app = builder.Build(); var app = builder.Build();
// Start a poll // Start a poll
var task = dispatcher.ExecuteAsync(context, new HttpSocketOptions(), app); var task = dispatcher.ExecuteAsync(context, new HttpConnectionOptions(), app);
// Send to the application // Send to the application
var buffer = Encoding.UTF8.GetBytes("Hello World"); var buffer = Encoding.UTF8.GetBytes("Hello World");
@ -445,16 +445,16 @@ namespace Microsoft.AspNetCore.Sockets.Tests
context.Response.Body = strm; context.Response.Body = strm;
var services = new ServiceCollection(); var services = new ServiceCollection();
services.AddOptions(); services.AddOptions();
services.AddSingleton<TestEndPoint>(); services.AddSingleton<TestConnectionHandler>();
context.Request.Path = "/foo"; context.Request.Path = "/foo";
context.Request.Method = "GET"; context.Request.Method = "GET";
SetTransport(context, transportType); SetTransport(context, transportType);
var builder = new ConnectionBuilder(services.BuildServiceProvider()); var builder = new ConnectionBuilder(services.BuildServiceProvider());
builder.UseEndPoint<TestEndPoint>(); builder.UseConnectionHandler<TestConnectionHandler>();
var app = builder.Build(); var app = builder.Build();
await dispatcher.ExecuteAsync(context, new HttpSocketOptions(), app); await dispatcher.ExecuteAsync(context, new HttpConnectionOptions(), app);
Assert.Equal(StatusCodes.Status400BadRequest, context.Response.StatusCode); Assert.Equal(StatusCodes.Status400BadRequest, context.Response.StatusCode);
await strm.FlushAsync(); await strm.FlushAsync();
@ -476,14 +476,14 @@ namespace Microsoft.AspNetCore.Sockets.Tests
context.Response.Body = strm; context.Response.Body = strm;
var services = new ServiceCollection(); var services = new ServiceCollection();
services.AddOptions(); services.AddOptions();
services.AddSingleton<TestEndPoint>(); services.AddSingleton<TestConnectionHandler>();
context.Request.Path = "/foo"; context.Request.Path = "/foo";
context.Request.Method = "POST"; context.Request.Method = "POST";
var builder = new ConnectionBuilder(services.BuildServiceProvider()); var builder = new ConnectionBuilder(services.BuildServiceProvider());
builder.UseEndPoint<TestEndPoint>(); builder.UseConnectionHandler<TestConnectionHandler>();
var app = builder.Build(); var app = builder.Build();
await dispatcher.ExecuteAsync(context, new HttpSocketOptions(), app); await dispatcher.ExecuteAsync(context, new HttpConnectionOptions(), app);
Assert.Equal(StatusCodes.Status400BadRequest, context.Response.StatusCode); Assert.Equal(StatusCodes.Status400BadRequest, context.Response.StatusCode);
await strm.FlushAsync(); await strm.FlushAsync();
@ -552,11 +552,11 @@ namespace Microsoft.AspNetCore.Sockets.Tests
SetTransport(context, TransportType.ServerSentEvents); SetTransport(context, TransportType.ServerSentEvents);
var services = new ServiceCollection(); var services = new ServiceCollection();
services.AddSingleton<ImmediatelyCompleteEndPoint>(); services.AddSingleton<ImmediatelyCompleteConnectionHandler>();
var builder = new ConnectionBuilder(services.BuildServiceProvider()); var builder = new ConnectionBuilder(services.BuildServiceProvider());
builder.UseEndPoint<ImmediatelyCompleteEndPoint>(); builder.UseConnectionHandler<ImmediatelyCompleteConnectionHandler>();
var app = builder.Build(); var app = builder.Build();
await dispatcher.ExecuteAsync(context, new HttpSocketOptions(), app); await dispatcher.ExecuteAsync(context, new HttpConnectionOptions(), app);
Assert.Equal(StatusCodes.Status200OK, context.Response.StatusCode); Assert.Equal(StatusCodes.Status200OK, context.Response.StatusCode);
@ -578,11 +578,11 @@ namespace Microsoft.AspNetCore.Sockets.Tests
SetTransport(context, TransportType.ServerSentEvents); SetTransport(context, TransportType.ServerSentEvents);
var services = new ServiceCollection(); var services = new ServiceCollection();
services.AddSingleton<SynchronusExceptionEndPoint>(); services.AddSingleton<SynchronusExceptionConnectionHandler>();
var builder = new ConnectionBuilder(services.BuildServiceProvider()); var builder = new ConnectionBuilder(services.BuildServiceProvider());
builder.UseEndPoint<SynchronusExceptionEndPoint>(); builder.UseConnectionHandler<SynchronusExceptionConnectionHandler>();
var app = builder.Build(); var app = builder.Build();
await dispatcher.ExecuteAsync(context, new HttpSocketOptions(), app); await dispatcher.ExecuteAsync(context, new HttpConnectionOptions(), app);
Assert.Equal(StatusCodes.Status200OK, context.Response.StatusCode); Assert.Equal(StatusCodes.Status200OK, context.Response.StatusCode);
@ -604,11 +604,11 @@ namespace Microsoft.AspNetCore.Sockets.Tests
var context = MakeRequest("/foo", connection); var context = MakeRequest("/foo", connection);
var services = new ServiceCollection(); var services = new ServiceCollection();
services.AddSingleton<ImmediatelyCompleteEndPoint>(); services.AddSingleton<ImmediatelyCompleteConnectionHandler>();
var builder = new ConnectionBuilder(services.BuildServiceProvider()); var builder = new ConnectionBuilder(services.BuildServiceProvider());
builder.UseEndPoint<ImmediatelyCompleteEndPoint>(); builder.UseConnectionHandler<ImmediatelyCompleteConnectionHandler>();
var app = builder.Build(); var app = builder.Build();
await dispatcher.ExecuteAsync(context, new HttpSocketOptions(), app); await dispatcher.ExecuteAsync(context, new HttpConnectionOptions(), app);
Assert.Equal(StatusCodes.Status204NoContent, context.Response.StatusCode); Assert.Equal(StatusCodes.Status204NoContent, context.Response.StatusCode);
@ -630,11 +630,11 @@ namespace Microsoft.AspNetCore.Sockets.Tests
var context = MakeRequest("/foo", connection); var context = MakeRequest("/foo", connection);
var services = new ServiceCollection(); var services = new ServiceCollection();
services.AddSingleton<TestEndPoint>(); services.AddSingleton<TestConnectionHandler>();
var builder = new ConnectionBuilder(services.BuildServiceProvider()); var builder = new ConnectionBuilder(services.BuildServiceProvider());
builder.UseEndPoint<TestEndPoint>(); builder.UseConnectionHandler<TestConnectionHandler>();
var app = builder.Build(); var app = builder.Build();
var options = new HttpSocketOptions(); var options = new HttpConnectionOptions();
options.LongPolling.PollTimeout = TimeSpan.FromSeconds(2); options.LongPolling.PollTimeout = TimeSpan.FromSeconds(2);
await dispatcher.ExecuteAsync(context, options, app).OrTimeout(); await dispatcher.ExecuteAsync(context, options, app).OrTimeout();
@ -656,11 +656,11 @@ namespace Microsoft.AspNetCore.Sockets.Tests
SetTransport(context, TransportType.WebSockets); SetTransport(context, TransportType.WebSockets);
var services = new ServiceCollection(); var services = new ServiceCollection();
services.AddSingleton<ImmediatelyCompleteEndPoint>(); services.AddSingleton<ImmediatelyCompleteConnectionHandler>();
var builder = new ConnectionBuilder(services.BuildServiceProvider()); var builder = new ConnectionBuilder(services.BuildServiceProvider());
builder.UseEndPoint<ImmediatelyCompleteEndPoint>(); builder.UseConnectionHandler<ImmediatelyCompleteConnectionHandler>();
var app = builder.Build(); var app = builder.Build();
var options = new HttpSocketOptions(); var options = new HttpConnectionOptions();
options.WebSockets.CloseTimeout = TimeSpan.FromSeconds(1); options.WebSockets.CloseTimeout = TimeSpan.FromSeconds(1);
var task = dispatcher.ExecuteAsync(context, options, app); var task = dispatcher.ExecuteAsync(context, options, app);
@ -688,11 +688,11 @@ namespace Microsoft.AspNetCore.Sockets.Tests
SetTransport(context2, transportType); SetTransport(context2, transportType);
var services = new ServiceCollection(); var services = new ServiceCollection();
services.AddSingleton<TestEndPoint>(); services.AddSingleton<TestConnectionHandler>();
var builder = new ConnectionBuilder(services.BuildServiceProvider()); var builder = new ConnectionBuilder(services.BuildServiceProvider());
builder.UseEndPoint<TestEndPoint>(); builder.UseConnectionHandler<TestConnectionHandler>();
var app = builder.Build(); var app = builder.Build();
var options = new HttpSocketOptions(); var options = new HttpConnectionOptions();
var request1 = dispatcher.ExecuteAsync(context1, options, app); var request1 = dispatcher.ExecuteAsync(context1, options, app);
await dispatcher.ExecuteAsync(context2, options, app); await dispatcher.ExecuteAsync(context2, options, app);
@ -727,11 +727,11 @@ namespace Microsoft.AspNetCore.Sockets.Tests
var context2 = MakeRequest("/foo", connection); var context2 = MakeRequest("/foo", connection);
var services = new ServiceCollection(); var services = new ServiceCollection();
services.AddSingleton<TestEndPoint>(); services.AddSingleton<TestConnectionHandler>();
var builder = new ConnectionBuilder(services.BuildServiceProvider()); var builder = new ConnectionBuilder(services.BuildServiceProvider());
builder.UseEndPoint<TestEndPoint>(); builder.UseConnectionHandler<TestConnectionHandler>();
var app = builder.Build(); var app = builder.Build();
var options = new HttpSocketOptions(); var options = new HttpConnectionOptions();
var request1 = dispatcher.ExecuteAsync(context1, options, app); var request1 = dispatcher.ExecuteAsync(context1, options, app);
var request2 = dispatcher.ExecuteAsync(context2, options, app); var request2 = dispatcher.ExecuteAsync(context2, options, app);
@ -765,11 +765,11 @@ namespace Microsoft.AspNetCore.Sockets.Tests
SetTransport(context, transportType); SetTransport(context, transportType);
var services = new ServiceCollection(); var services = new ServiceCollection();
services.AddSingleton<TestEndPoint>(); services.AddSingleton<TestConnectionHandler>();
var builder = new ConnectionBuilder(services.BuildServiceProvider()); var builder = new ConnectionBuilder(services.BuildServiceProvider());
builder.UseEndPoint<TestEndPoint>(); builder.UseConnectionHandler<TestConnectionHandler>();
var app = builder.Build(); var app = builder.Build();
var options = new HttpSocketOptions(); var options = new HttpConnectionOptions();
await dispatcher.ExecuteAsync(context, options, app); await dispatcher.ExecuteAsync(context, options, app);
@ -790,11 +790,11 @@ namespace Microsoft.AspNetCore.Sockets.Tests
var context = MakeRequest("/foo", connection); var context = MakeRequest("/foo", connection);
var services = new ServiceCollection(); var services = new ServiceCollection();
services.AddSingleton<TestEndPoint>(); services.AddSingleton<TestConnectionHandler>();
var builder = new ConnectionBuilder(services.BuildServiceProvider()); var builder = new ConnectionBuilder(services.BuildServiceProvider());
builder.UseEndPoint<TestEndPoint>(); builder.UseConnectionHandler<TestConnectionHandler>();
var app = builder.Build(); var app = builder.Build();
var options = new HttpSocketOptions(); var options = new HttpConnectionOptions();
var task = dispatcher.ExecuteAsync(context, options, app); var task = dispatcher.ExecuteAsync(context, options, app);
var buffer = Encoding.UTF8.GetBytes("Hello World"); var buffer = Encoding.UTF8.GetBytes("Hello World");
@ -825,11 +825,11 @@ namespace Microsoft.AspNetCore.Sockets.Tests
SetTransport(context, TransportType.ServerSentEvents); SetTransport(context, TransportType.ServerSentEvents);
var services = new ServiceCollection(); var services = new ServiceCollection();
services.AddSingleton<BlockingEndPoint>(); services.AddSingleton<BlockingConnectionHandler>();
var builder = new ConnectionBuilder(services.BuildServiceProvider()); var builder = new ConnectionBuilder(services.BuildServiceProvider());
builder.UseEndPoint<BlockingEndPoint>(); builder.UseConnectionHandler<BlockingConnectionHandler>();
var app = builder.Build(); var app = builder.Build();
var options = new HttpSocketOptions(); var options = new HttpConnectionOptions();
var task = dispatcher.ExecuteAsync(context, options, app); var task = dispatcher.ExecuteAsync(context, options, app);
var buffer = Encoding.UTF8.GetBytes("Hello World"); var buffer = Encoding.UTF8.GetBytes("Hello World");
@ -858,11 +858,11 @@ namespace Microsoft.AspNetCore.Sockets.Tests
var context = MakeRequest("/foo", connection); var context = MakeRequest("/foo", connection);
var services = new ServiceCollection(); var services = new ServiceCollection();
services.AddSingleton<BlockingEndPoint>(); services.AddSingleton<BlockingConnectionHandler>();
var builder = new ConnectionBuilder(services.BuildServiceProvider()); var builder = new ConnectionBuilder(services.BuildServiceProvider());
builder.UseEndPoint<BlockingEndPoint>(); builder.UseConnectionHandler<BlockingConnectionHandler>();
var app = builder.Build(); var app = builder.Build();
var options = new HttpSocketOptions(); var options = new HttpConnectionOptions();
var task = dispatcher.ExecuteAsync(context, options, app); var task = dispatcher.ExecuteAsync(context, options, app);
var buffer = Encoding.UTF8.GetBytes("Hello World"); var buffer = Encoding.UTF8.GetBytes("Hello World");
@ -889,11 +889,11 @@ namespace Microsoft.AspNetCore.Sockets.Tests
var dispatcher = new HttpConnectionDispatcher(manager, loggerFactory); var dispatcher = new HttpConnectionDispatcher(manager, loggerFactory);
var services = new ServiceCollection(); var services = new ServiceCollection();
services.AddSingleton<TestEndPoint>(); services.AddSingleton<TestConnectionHandler>();
var builder = new ConnectionBuilder(services.BuildServiceProvider()); var builder = new ConnectionBuilder(services.BuildServiceProvider());
builder.UseEndPoint<TestEndPoint>(); builder.UseConnectionHandler<TestConnectionHandler>();
var app = builder.Build(); var app = builder.Build();
var options = new HttpSocketOptions(); var options = new HttpConnectionOptions();
var context1 = MakeRequest("/foo", connection); var context1 = MakeRequest("/foo", connection);
var task1 = dispatcher.ExecuteAsync(context1, options, app); var task1 = dispatcher.ExecuteAsync(context1, options, app);
@ -933,12 +933,12 @@ namespace Microsoft.AspNetCore.Sockets.Tests
SetTransport(context, transportType); SetTransport(context, transportType);
var services = new ServiceCollection(); var services = new ServiceCollection();
services.AddSingleton<ImmediatelyCompleteEndPoint>(); services.AddSingleton<ImmediatelyCompleteConnectionHandler>();
var builder = new ConnectionBuilder(services.BuildServiceProvider()); var builder = new ConnectionBuilder(services.BuildServiceProvider());
builder.UseEndPoint<ImmediatelyCompleteEndPoint>(); builder.UseConnectionHandler<ImmediatelyCompleteConnectionHandler>();
var app = builder.Build(); var app = builder.Build();
var options = new HttpSocketOptions(); var options = new HttpConnectionOptions();
options.WebSockets.CloseTimeout = TimeSpan.FromSeconds(0); options.WebSockets.CloseTimeout = TimeSpan.FromSeconds(0);
await dispatcher.ExecuteAsync(context, options, app); await dispatcher.ExecuteAsync(context, options, app);
@ -961,7 +961,7 @@ namespace Microsoft.AspNetCore.Sockets.Tests
var context = new DefaultHttpContext(); var context = new DefaultHttpContext();
var services = new ServiceCollection(); var services = new ServiceCollection();
services.AddOptions(); services.AddOptions();
services.AddSingleton<TestEndPoint>(); services.AddSingleton<TestConnectionHandler>();
services.AddAuthorizationPolicyEvaluator(); services.AddAuthorizationPolicyEvaluator();
services.AddAuthorization(o => services.AddAuthorization(o =>
{ {
@ -983,9 +983,9 @@ namespace Microsoft.AspNetCore.Sockets.Tests
context.Request.Query = qs; context.Request.Query = qs;
var builder = new ConnectionBuilder(sp); var builder = new ConnectionBuilder(sp);
builder.UseEndPoint<TestEndPoint>(); builder.UseConnectionHandler<TestConnectionHandler>();
var app = builder.Build(); var app = builder.Build();
var options = new HttpSocketOptions(); var options = new HttpConnectionOptions();
options.AuthorizationData.Add(new AuthorizeAttribute("test")); options.AuthorizationData.Add(new AuthorizeAttribute("test"));
// would hang if EndPoint was running // would hang if EndPoint was running
@ -1006,7 +1006,7 @@ namespace Microsoft.AspNetCore.Sockets.Tests
var context = new DefaultHttpContext(); var context = new DefaultHttpContext();
var services = new ServiceCollection(); var services = new ServiceCollection();
services.AddOptions(); services.AddOptions();
services.AddSingleton<TestEndPoint>(); services.AddSingleton<TestConnectionHandler>();
services.AddAuthorizationPolicyEvaluator(); services.AddAuthorizationPolicyEvaluator();
services.AddAuthorization(o => services.AddAuthorization(o =>
{ {
@ -1028,9 +1028,9 @@ namespace Microsoft.AspNetCore.Sockets.Tests
context.Request.Query = qs; context.Request.Query = qs;
var builder = new ConnectionBuilder(sp); var builder = new ConnectionBuilder(sp);
builder.UseEndPoint<TestEndPoint>(); builder.UseConnectionHandler<TestConnectionHandler>();
var app = builder.Build(); var app = builder.Build();
var options = new HttpSocketOptions(); var options = new HttpConnectionOptions();
options.AuthorizationData.Add(new AuthorizeAttribute("test")); options.AuthorizationData.Add(new AuthorizeAttribute("test"));
context.User = new ClaimsPrincipal(new ClaimsIdentity("authenticated")); context.User = new ClaimsPrincipal(new ClaimsIdentity("authenticated"));
@ -1054,7 +1054,7 @@ namespace Microsoft.AspNetCore.Sockets.Tests
context.Features.Set<IHttpResponseFeature>(new ResponseFeature()); context.Features.Set<IHttpResponseFeature>(new ResponseFeature());
var services = new ServiceCollection(); var services = new ServiceCollection();
services.AddOptions(); services.AddOptions();
services.AddSingleton<TestEndPoint>(); services.AddSingleton<TestConnectionHandler>();
services.AddAuthorizationPolicyEvaluator(); services.AddAuthorizationPolicyEvaluator();
services.AddAuthorization(o => services.AddAuthorization(o =>
{ {
@ -1080,18 +1080,18 @@ namespace Microsoft.AspNetCore.Sockets.Tests
context.Response.Body = new MemoryStream(); context.Response.Body = new MemoryStream();
var builder = new ConnectionBuilder(sp); var builder = new ConnectionBuilder(sp);
builder.UseEndPoint<TestEndPoint>(); builder.UseConnectionHandler<TestConnectionHandler>();
var app = builder.Build(); var app = builder.Build();
var options = new HttpSocketOptions(); var options = new HttpConnectionOptions();
options.AuthorizationData.Add(new AuthorizeAttribute("test")); options.AuthorizationData.Add(new AuthorizeAttribute("test"));
// "authorize" user // "authorize" user
context.User = new ClaimsPrincipal(new ClaimsIdentity(new[] { new Claim(ClaimTypes.NameIdentifier, "name") })); context.User = new ClaimsPrincipal(new ClaimsIdentity(new[] { new Claim(ClaimTypes.NameIdentifier, "name") }));
var endPointTask = dispatcher.ExecuteAsync(context, options, app); var connectionHandlerTask = dispatcher.ExecuteAsync(context, options, app);
await connection.Transport.Output.WriteAsync(Encoding.UTF8.GetBytes("Hello, World")).AsTask().OrTimeout(); await connection.Transport.Output.WriteAsync(Encoding.UTF8.GetBytes("Hello, World")).AsTask().OrTimeout();
await endPointTask.OrTimeout(); await connectionHandlerTask.OrTimeout();
Assert.Equal(StatusCodes.Status200OK, context.Response.StatusCode); Assert.Equal(StatusCodes.Status200OK, context.Response.StatusCode);
Assert.Equal("Hello, World", GetContentAsString(context.Response.Body)); Assert.Equal("Hello, World", GetContentAsString(context.Response.Body));
@ -1110,7 +1110,7 @@ namespace Microsoft.AspNetCore.Sockets.Tests
context.Features.Set<IHttpResponseFeature>(new ResponseFeature()); context.Features.Set<IHttpResponseFeature>(new ResponseFeature());
var services = new ServiceCollection(); var services = new ServiceCollection();
services.AddOptions(); services.AddOptions();
services.AddSingleton<TestEndPoint>(); services.AddSingleton<TestConnectionHandler>();
services.AddAuthorizationPolicyEvaluator(); services.AddAuthorizationPolicyEvaluator();
services.AddAuthorization(o => services.AddAuthorization(o =>
{ {
@ -1140,9 +1140,9 @@ namespace Microsoft.AspNetCore.Sockets.Tests
context.Response.Body = new MemoryStream(); context.Response.Body = new MemoryStream();
var builder = new ConnectionBuilder(sp); var builder = new ConnectionBuilder(sp);
builder.UseEndPoint<TestEndPoint>(); builder.UseConnectionHandler<TestConnectionHandler>();
var app = builder.Build(); var app = builder.Build();
var options = new HttpSocketOptions(); var options = new HttpConnectionOptions();
options.AuthorizationData.Add(new AuthorizeAttribute("test")); options.AuthorizationData.Add(new AuthorizeAttribute("test"));
options.AuthorizationData.Add(new AuthorizeAttribute("secondPolicy")); options.AuthorizationData.Add(new AuthorizeAttribute("secondPolicy"));
@ -1169,10 +1169,10 @@ namespace Microsoft.AspNetCore.Sockets.Tests
new Claim(ClaimTypes.StreetAddress, "12345 123rd St. NW") new Claim(ClaimTypes.StreetAddress, "12345 123rd St. NW")
})); }));
var endPointTask = dispatcher.ExecuteAsync(context, options, app); var connectionHandlerTask = dispatcher.ExecuteAsync(context, options, app);
await connection.Transport.Output.WriteAsync(Encoding.UTF8.GetBytes("Hello, World")).AsTask().OrTimeout(); await connection.Transport.Output.WriteAsync(Encoding.UTF8.GetBytes("Hello, World")).AsTask().OrTimeout();
await endPointTask.OrTimeout(); await connectionHandlerTask.OrTimeout();
Assert.Equal(StatusCodes.Status200OK, context.Response.StatusCode); Assert.Equal(StatusCodes.Status200OK, context.Response.StatusCode);
Assert.Equal("Hello, World", GetContentAsString(context.Response.Body)); Assert.Equal("Hello, World", GetContentAsString(context.Response.Body));
@ -1191,7 +1191,7 @@ namespace Microsoft.AspNetCore.Sockets.Tests
context.Features.Set<IHttpResponseFeature>(new ResponseFeature()); context.Features.Set<IHttpResponseFeature>(new ResponseFeature());
var services = new ServiceCollection(); var services = new ServiceCollection();
services.AddOptions(); services.AddOptions();
services.AddSingleton<TestEndPoint>(); services.AddSingleton<TestConnectionHandler>();
services.AddAuthorization(o => services.AddAuthorization(o =>
{ {
o.AddPolicy("test", policy => o.AddPolicy("test", policy =>
@ -1218,18 +1218,18 @@ namespace Microsoft.AspNetCore.Sockets.Tests
context.Response.Body = new MemoryStream(); context.Response.Body = new MemoryStream();
var builder = new ConnectionBuilder(sp); var builder = new ConnectionBuilder(sp);
builder.UseEndPoint<TestEndPoint>(); builder.UseConnectionHandler<TestConnectionHandler>();
var app = builder.Build(); var app = builder.Build();
var options = new HttpSocketOptions(); var options = new HttpConnectionOptions();
options.AuthorizationData.Add(new AuthorizeAttribute("test")); options.AuthorizationData.Add(new AuthorizeAttribute("test"));
// "authorize" user // "authorize" user
context.User = new ClaimsPrincipal(new ClaimsIdentity(new[] { new Claim(ClaimTypes.NameIdentifier, "name") })); context.User = new ClaimsPrincipal(new ClaimsIdentity(new[] { new Claim(ClaimTypes.NameIdentifier, "name") }));
var endPointTask = dispatcher.ExecuteAsync(context, options, app); var connectionHandlerTask = dispatcher.ExecuteAsync(context, options, app);
await connection.Transport.Output.WriteAsync(Encoding.UTF8.GetBytes("Hello, World")).AsTask().OrTimeout(); await connection.Transport.Output.WriteAsync(Encoding.UTF8.GetBytes("Hello, World")).AsTask().OrTimeout();
await endPointTask.OrTimeout(); await connectionHandlerTask.OrTimeout();
Assert.Equal(StatusCodes.Status200OK, context.Response.StatusCode); Assert.Equal(StatusCodes.Status200OK, context.Response.StatusCode);
Assert.Equal("Hello, World", GetContentAsString(context.Response.Body)); Assert.Equal("Hello, World", GetContentAsString(context.Response.Body));
@ -1247,7 +1247,7 @@ namespace Microsoft.AspNetCore.Sockets.Tests
var context = new DefaultHttpContext(); var context = new DefaultHttpContext();
var services = new ServiceCollection(); var services = new ServiceCollection();
services.AddOptions(); services.AddOptions();
services.AddSingleton<TestEndPoint>(); services.AddSingleton<TestConnectionHandler>();
services.AddAuthorization(o => services.AddAuthorization(o =>
{ {
o.AddPolicy("test", policy => o.AddPolicy("test", policy =>
@ -1274,9 +1274,9 @@ namespace Microsoft.AspNetCore.Sockets.Tests
context.Response.Body = new MemoryStream(); context.Response.Body = new MemoryStream();
var builder = new ConnectionBuilder(sp); var builder = new ConnectionBuilder(sp);
builder.UseEndPoint<TestEndPoint>(); builder.UseConnectionHandler<TestConnectionHandler>();
var app = builder.Build(); var app = builder.Build();
var options = new HttpSocketOptions(); var options = new HttpConnectionOptions();
options.AuthorizationData.Add(new AuthorizeAttribute("test")); options.AuthorizationData.Add(new AuthorizeAttribute("test"));
// "authorize" user // "authorize" user
@ -1302,11 +1302,11 @@ namespace Microsoft.AspNetCore.Sockets.Tests
var context = MakeRequest("/foo", connection); var context = MakeRequest("/foo", connection);
var services = new ServiceCollection(); var services = new ServiceCollection();
services.AddSingleton<TestEndPoint>(); services.AddSingleton<TestConnectionHandler>();
var builder = new ConnectionBuilder(services.BuildServiceProvider()); var builder = new ConnectionBuilder(services.BuildServiceProvider());
builder.UseEndPoint<TestEndPoint>(); builder.UseConnectionHandler<TestConnectionHandler>();
var app = builder.Build(); var app = builder.Build();
var options = new HttpSocketOptions(); var options = new HttpConnectionOptions();
options.LongPolling.PollTimeout = TimeSpan.FromMilliseconds(1); // We don't care about the poll itself options.LongPolling.PollTimeout = TimeSpan.FromMilliseconds(1); // We don't care about the poll itself
Assert.Null(connection.Features.Get<IConnectionInherentKeepAliveFeature>()); Assert.Null(connection.Features.Get<IConnectionInherentKeepAliveFeature>());
@ -1328,13 +1328,13 @@ namespace Microsoft.AspNetCore.Sockets.Tests
var context = new DefaultHttpContext(); var context = new DefaultHttpContext();
context.Features.Set<IHttpResponseFeature>(new ResponseFeature()); context.Features.Set<IHttpResponseFeature>(new ResponseFeature());
var services = new ServiceCollection(); var services = new ServiceCollection();
services.AddSingleton<TestEndPoint>(); services.AddSingleton<TestConnectionHandler>();
services.AddOptions(); services.AddOptions();
var ms = new MemoryStream(); var ms = new MemoryStream();
context.Request.Path = "/foo"; context.Request.Path = "/foo";
context.Request.Method = "POST"; context.Request.Method = "POST";
context.Response.Body = ms; context.Response.Body = ms;
await dispatcher.ExecuteNegotiateAsync(context, new HttpSocketOptions { Transports = TransportType.WebSockets }); await dispatcher.ExecuteNegotiateAsync(context, new HttpConnectionOptions { Transports = TransportType.WebSockets });
var negotiateResponse = JsonConvert.DeserializeObject<JObject>(Encoding.UTF8.GetString(ms.ToArray())); var negotiateResponse = JsonConvert.DeserializeObject<JObject>(Encoding.UTF8.GetString(ms.ToArray()));
var availableTransports = (JArray)negotiateResponse["availableTransports"]; var availableTransports = (JArray)negotiateResponse["availableTransports"];
@ -1399,7 +1399,7 @@ namespace Microsoft.AspNetCore.Sockets.Tests
context.Response.Body = strm; context.Response.Body = strm;
var services = new ServiceCollection(); var services = new ServiceCollection();
services.AddOptions(); services.AddOptions();
services.AddSingleton<ImmediatelyCompleteEndPoint>(); services.AddSingleton<ImmediatelyCompleteConnectionHandler>();
SetTransport(context, transportType); SetTransport(context, transportType);
context.Request.Path = "/foo"; context.Request.Path = "/foo";
context.Request.Method = "GET"; context.Request.Method = "GET";
@ -1409,9 +1409,9 @@ namespace Microsoft.AspNetCore.Sockets.Tests
context.Request.Query = qs; context.Request.Query = qs;
var builder = new ConnectionBuilder(services.BuildServiceProvider()); var builder = new ConnectionBuilder(services.BuildServiceProvider());
builder.UseEndPoint<ImmediatelyCompleteEndPoint>(); builder.UseConnectionHandler<ImmediatelyCompleteConnectionHandler>();
var app = builder.Build(); var app = builder.Build();
var options = new HttpSocketOptions(); var options = new HttpConnectionOptions();
options.Transports = supportedTransports; options.Transports = supportedTransports;
await dispatcher.ExecuteAsync(context, options, app); await dispatcher.ExecuteAsync(context, options, app);
@ -1475,7 +1475,7 @@ namespace Microsoft.AspNetCore.Sockets.Tests
} }
} }
public class NerverEndingEndPoint : EndPoint public class NerverEndingConnectionHandler : ConnectionHandler
{ {
public override Task OnConnectedAsync(ConnectionContext connection) public override Task OnConnectedAsync(ConnectionContext connection)
{ {
@ -1484,7 +1484,7 @@ namespace Microsoft.AspNetCore.Sockets.Tests
} }
} }
public class BlockingEndPoint : EndPoint public class BlockingConnectionHandler : ConnectionHandler
{ {
public override Task OnConnectedAsync(ConnectionContext connection) public override Task OnConnectedAsync(ConnectionContext connection)
{ {
@ -1494,7 +1494,7 @@ namespace Microsoft.AspNetCore.Sockets.Tests
} }
} }
public class SynchronusExceptionEndPoint : EndPoint public class SynchronusExceptionConnectionHandler : ConnectionHandler
{ {
public override Task OnConnectedAsync(ConnectionContext connection) public override Task OnConnectedAsync(ConnectionContext connection)
{ {
@ -1502,7 +1502,7 @@ namespace Microsoft.AspNetCore.Sockets.Tests
} }
} }
public class ImmediatelyCompleteEndPoint : EndPoint public class ImmediatelyCompleteConnectionHandler : ConnectionHandler
{ {
public override Task OnConnectedAsync(ConnectionContext connection) public override Task OnConnectedAsync(ConnectionContext connection)
{ {
@ -1510,7 +1510,7 @@ namespace Microsoft.AspNetCore.Sockets.Tests
} }
} }
public class HttpContextEndPoint : EndPoint public class HttpContextConnectionHandler : ConnectionHandler
{ {
public override async Task OnConnectedAsync(ConnectionContext connection) public override async Task OnConnectedAsync(ConnectionContext connection)
{ {
@ -1543,7 +1543,7 @@ namespace Microsoft.AspNetCore.Sockets.Tests
} }
} }
public class TestEndPoint : EndPoint public class TestConnectionHandler : ConnectionHandler
{ {
public override async Task OnConnectedAsync(ConnectionContext connection) public override async Task OnConnectedAsync(ConnectionContext connection)
{ {

View File

@ -100,7 +100,7 @@ namespace Microsoft.AspNetCore.Sockets.Tests
[Fact] [Fact]
public void CheckLongPollingTimeoutValue() public void CheckLongPollingTimeoutValue()
{ {
var options = new HttpSocketOptions(); var options = new HttpConnectionOptions();
Assert.Equal(options.LongPolling.PollTimeout, TimeSpan.FromSeconds(90)); Assert.Equal(options.LongPolling.PollTimeout, TimeSpan.FromSeconds(90));
} }
} }

View File

@ -10,7 +10,7 @@ using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Hosting.Server.Features; using Microsoft.AspNetCore.Hosting.Server.Features;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Testing.xunit; using Microsoft.AspNetCore.Testing.xunit;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
@ -19,20 +19,20 @@ using Xunit.Abstractions;
namespace Microsoft.AspNetCore.Sockets.Tests namespace Microsoft.AspNetCore.Sockets.Tests
{ {
public class MapEndPointTests public class MapConnectionHandlerTests
{ {
private ITestOutputHelper _output; private ITestOutputHelper _output;
public MapEndPointTests(ITestOutputHelper output) public MapConnectionHandlerTests(ITestOutputHelper output)
{ {
_output = output; _output = output;
} }
[Fact] [Fact]
public void MapEndPointFindsAuthAttributeOnEndPoint() public void MapConnectionHandlerFindsAuthAttributeOnEndPoint()
{ {
var authCount = 0; var authCount = 0;
using (var builder = BuildWebHost<AuthEndPoint>("/auth", using (var builder = BuildWebHost<AuthConnectionHandler>("/auth",
options => authCount += options.AuthorizationData.Count)) options => authCount += options.AuthorizationData.Count))
{ {
builder.Start(); builder.Start();
@ -42,10 +42,10 @@ namespace Microsoft.AspNetCore.Sockets.Tests
} }
[Fact] [Fact]
public void MapEndPointFindsAuthAttributeOnInheritedEndPoint() public void MapConnectionHandlerFindsAuthAttributeOnInheritedEndPoint()
{ {
var authCount = 0; var authCount = 0;
using (var builder = BuildWebHost<InheritedAuthEndPoint>("/auth", using (var builder = BuildWebHost<InheritedAuthConnectionHandler>("/auth",
options => authCount += options.AuthorizationData.Count)) options => authCount += options.AuthorizationData.Count))
{ {
builder.Start(); builder.Start();
@ -55,10 +55,10 @@ namespace Microsoft.AspNetCore.Sockets.Tests
} }
[Fact] [Fact]
public void MapEndPointFindsAuthAttributesOnDoubleAuthEndPoint() public void MapConnectionHandlerFindsAuthAttributesOnDoubleAuthEndPoint()
{ {
var authCount = 0; var authCount = 0;
using (var builder = BuildWebHost<DoubleAuthEndPoint>("/auth", using (var builder = BuildWebHost<DoubleAuthConnectionHandler>("/auth",
options => authCount += options.AuthorizationData.Count)) options => authCount += options.AuthorizationData.Count))
{ {
builder.Start(); builder.Start();
@ -69,9 +69,9 @@ namespace Microsoft.AspNetCore.Sockets.Tests
[ConditionalFact] [ConditionalFact]
[OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win7, WindowsVersions.Win2008R2, SkipReason = "No WebSockets Client for this platform")] [OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win7, WindowsVersions.Win2008R2, SkipReason = "No WebSockets Client for this platform")]
public async Task MapEndPointWithWebSocketSubProtocolSetsProtocol() public async Task MapConnectionHandlerWithWebSocketSubProtocolSetsProtocol()
{ {
var host = BuildWebHost<MyEndPoint>("/socket", var host = BuildWebHost<MyConnectionHandler>("/socket",
options => options.WebSockets.SubProtocol = "protocol1"); options => options.WebSockets.SubProtocol = "protocol1");
await host.StartAsync(); await host.StartAsync();
@ -89,7 +89,7 @@ namespace Microsoft.AspNetCore.Sockets.Tests
Assert.Equal(WebSocketMessageType.Close, result.MessageType); Assert.Equal(WebSocketMessageType.Close, result.MessageType);
} }
private class MyEndPoint : EndPoint private class MyConnectionHandler : ConnectionHandler
{ {
public override async Task OnConnectedAsync(ConnectionContext connection) public override async Task OnConnectedAsync(ConnectionContext connection)
{ {
@ -108,7 +108,7 @@ namespace Microsoft.AspNetCore.Sockets.Tests
} }
} }
private class InheritedAuthEndPoint : AuthEndPoint private class InheritedAuthConnectionHandler : AuthConnectionHandler
{ {
public override Task OnConnectedAsync(ConnectionContext connection) public override Task OnConnectedAsync(ConnectionContext connection)
{ {
@ -117,12 +117,12 @@ namespace Microsoft.AspNetCore.Sockets.Tests
} }
[Authorize] [Authorize]
private class DoubleAuthEndPoint : AuthEndPoint private class DoubleAuthConnectionHandler : AuthConnectionHandler
{ {
} }
[Authorize] [Authorize]
private class AuthEndPoint : EndPoint private class AuthConnectionHandler : ConnectionHandler
{ {
public override Task OnConnectedAsync(ConnectionContext connection) public override Task OnConnectedAsync(ConnectionContext connection)
{ {
@ -130,22 +130,20 @@ namespace Microsoft.AspNetCore.Sockets.Tests
} }
} }
private IWebHost BuildWebHost<TEndPoint>(string path, Action<HttpSocketOptions> configure) where TEndPoint : EndPoint private IWebHost BuildWebHost<TConnectionHandler>(string path, Action<HttpConnectionOptions> configureOptions) where TConnectionHandler : ConnectionHandler
{ {
return new WebHostBuilder() return new WebHostBuilder()
.UseUrls("http://127.0.0.1:0") .UseUrls("http://127.0.0.1:0")
.UseKestrel() .UseKestrel()
.ConfigureServices(services => .ConfigureServices(services =>
{ {
services.AddSockets(); services.AddConnections();
services.AddSingleton<TEndPoint>();
}) })
.Configure(app => .Configure(app =>
{ {
app.UseSockets(routes => app.UseConnections(routes =>
{ {
routes.MapEndPoint<TEndPoint>(path, routes.MapConnectionHandler<TConnectionHandler>(path, configureOptions);
httpSocketOptions => configure(httpSocketOptions));
}); });
}) })
.ConfigureLogging(factory => .ConfigureLogging(factory =>

View File

@ -8,7 +8,7 @@ using System.Net.WebSockets;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Protocols; using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Sockets.Internal.Transports; using Microsoft.AspNetCore.Sockets.Internal.Transports;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Testing; using Microsoft.Extensions.Logging.Testing;