From 4fb2dda133292055725f22dcb117a7097fc66b9e Mon Sep 17 00:00:00 2001 From: Brennan Conroy Date: Mon, 19 Aug 2019 09:46:36 -0700 Subject: [PATCH] Fix AllProtocols with duplicates --- .../src/Internal/DefaultHubProtocolResolver.cs | 5 ++--- .../Internal/DefaultHubProtocolResolverTests.cs | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/SignalR/server/Core/src/Internal/DefaultHubProtocolResolver.cs b/src/SignalR/server/Core/src/Internal/DefaultHubProtocolResolver.cs index 5475fd3f07..546a2f988b 100644 --- a/src/SignalR/server/Core/src/Internal/DefaultHubProtocolResolver.cs +++ b/src/SignalR/server/Core/src/Internal/DefaultHubProtocolResolver.cs @@ -23,13 +23,12 @@ namespace Microsoft.AspNetCore.SignalR.Internal _logger = logger ?? NullLogger.Instance; _availableProtocols = new Dictionary(StringComparer.OrdinalIgnoreCase); - // We might get duplicates in _hubProtocols, but we're going to check it and overwrite in just a sec. - _hubProtocols = availableProtocols.ToList(); - foreach (var protocol in _hubProtocols) + foreach (var protocol in availableProtocols) { Log.RegisteredSignalRProtocol(_logger, protocol.Name, protocol.GetType()); _availableProtocols[protocol.Name] = protocol; } + _hubProtocols = _availableProtocols.Values.ToList(); } public virtual IHubProtocol GetProtocol(string protocolName, IReadOnlyList supportedProtocols) diff --git a/src/SignalR/server/SignalR/test/Internal/DefaultHubProtocolResolverTests.cs b/src/SignalR/server/SignalR/test/Internal/DefaultHubProtocolResolverTests.cs index ae18f59b66..418385ff0c 100644 --- a/src/SignalR/server/SignalR/test/Internal/DefaultHubProtocolResolverTests.cs +++ b/src/SignalR/server/SignalR/test/Internal/DefaultHubProtocolResolverTests.cs @@ -84,6 +84,22 @@ namespace Microsoft.AspNetCore.SignalR.Common.Protocol.Tests Assert.Same(jsonProtocol2, resolvedProtocol); } + [Fact] + public void AllProtocolsOnlyReturnsLatestOfSameType() + { + var jsonProtocol1 = new NewtonsoftJsonHubProtocol(); + var jsonProtocol2 = new NewtonsoftJsonHubProtocol(); + var resolver = new DefaultHubProtocolResolver(new[] { + jsonProtocol1, + jsonProtocol2 + }, NullLogger.Instance); + + var hubProtocols = resolver.AllProtocols; + Assert.Equal(1, hubProtocols.Count); + + Assert.Same(jsonProtocol2, hubProtocols[0]); + } + public static IEnumerable HubProtocolNames => HubProtocolHelpers.AllProtocols.Select(p => new object[] {p.Name}); } }