Skip to content

Commit f33d876

Browse files
committed
Favoring incoming connection over existing one
1 parent c23ffa7 commit f33d876

File tree

3 files changed

+21
-6
lines changed

3 files changed

+21
-6
lines changed

Lib.AspNetCore.ServerSentEvents/ServerSentEventsClient.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ public sealed class ServerSentEventsClient : IServerSentEventsClient
3535
public bool IsConnected { get; internal set; }
3636

3737
internal bool PreventReconnect { get; set; } = false;
38+
39+
internal bool IsRemoved { get; set; } = false;
3840
#endregion
3941

4042
#region Constructor

Lib.AspNetCore.ServerSentEvents/ServerSentEventsMiddleware.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,7 @@ public async Task Invoke(HttpContext context, IPolicyEvaluator policyEvaluator)
8282
Guid clientId = _serverSentEventsClientIdProvider.AcquireClientId(context);
8383
if (_serverSentEventsService.IsClientConnected(clientId))
8484
{
85-
_logger.LogWarning("The IServerSentEventsClient with identifier {ClientId} is already connected. The request can't have been accepted.", clientId);
86-
return;
85+
_serverSentEventsService.RemoveClient(clientId);
8786
}
8887

8988
if (await PreventReconnectAsync(clientId, context))

Lib.AspNetCore.ServerSentEvents/ServerSentEventsService.cs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -383,15 +383,29 @@ internal void AddClient(ServerSentEventsClient client)
383383
_clients.TryAdd(client.Id, client);
384384
}
385385

386+
internal void RemoveClient(Guid clientId)
387+
{
388+
IServerSentEventsClient client;
389+
390+
_clients.TryGetValue(clientId, out client);
391+
392+
RemoveClient((ServerSentEventsClient)client);
393+
}
394+
386395
internal void RemoveClient(ServerSentEventsClient client)
387396
{
388397
client.IsConnected = false;
389398

390-
_clients.TryRemove(client.Id, out _);
391-
392-
foreach(KeyValuePair<string, ConcurrentDictionary<Guid, IServerSentEventsClient>> group in _groups)
399+
if (!client.IsRemoved)
393400
{
394-
group.Value.TryRemove(client.Id, out _);
401+
_clients.TryRemove(client.Id, out _);
402+
403+
client.IsRemoved = true;
404+
405+
foreach (KeyValuePair<string, ConcurrentDictionary<Guid, IServerSentEventsClient>> group in _groups)
406+
{
407+
group.Value.TryRemove(client.Id, out _);
408+
}
395409
}
396410
}
397411

0 commit comments

Comments
 (0)