Exit OnConnected early if Negotiate fails (#733)
This commit is contained in:
parent
a359da0c44
commit
b12451025f
|
|
@ -61,7 +61,10 @@ namespace Microsoft.AspNetCore.SignalR
|
||||||
|
|
||||||
var connectionContext = new HubConnectionContext(output, connection);
|
var connectionContext = new HubConnectionContext(output, connection);
|
||||||
|
|
||||||
await ProcessNegotiate(connectionContext);
|
if (!await ProcessNegotiate(connectionContext))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Hubs support multiple producers so we set up this loop to copy
|
// Hubs support multiple producers so we set up this loop to copy
|
||||||
// data written to the HubConnectionContext's channel to the transport channel
|
// data written to the HubConnectionContext's channel to the transport channel
|
||||||
|
|
@ -103,7 +106,7 @@ namespace Microsoft.AspNetCore.SignalR
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task ProcessNegotiate(HubConnectionContext connection)
|
private async Task<bool> ProcessNegotiate(HubConnectionContext connection)
|
||||||
{
|
{
|
||||||
while (await connection.Input.WaitToReadAsync())
|
while (await connection.Input.WaitToReadAsync())
|
||||||
{
|
{
|
||||||
|
|
@ -130,10 +133,12 @@ namespace Microsoft.AspNetCore.SignalR
|
||||||
|
|
||||||
connection.ProtocolReaderWriter = new HubProtocolReaderWriter(protocol, dataEncoder);
|
connection.ProtocolReaderWriter = new HubProtocolReaderWriter(protocol, dataEncoder);
|
||||||
|
|
||||||
return;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task RunHubAsync(HubConnectionContext connection)
|
private async Task RunHubAsync(HubConnectionContext connection)
|
||||||
|
|
|
||||||
|
|
@ -39,6 +39,26 @@ namespace Microsoft.AspNetCore.SignalR.Tests
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task MissingNegotiateAndMessageSentFromHubConnectionCanBeDisposedCleanly()
|
||||||
|
{
|
||||||
|
var serviceProvider = CreateServiceProvider();
|
||||||
|
var endPoint = serviceProvider.GetService<HubEndPoint<SimpleHub>>();
|
||||||
|
|
||||||
|
using (var client = new TestClient())
|
||||||
|
{
|
||||||
|
// TestClient automatically writes negotiate, for this test we want to assume negotiate never gets sent
|
||||||
|
client.Connection.Transport.In.TryRead(out var item);
|
||||||
|
|
||||||
|
var endPointTask = endPoint.OnConnectedAsync(client.Connection);
|
||||||
|
|
||||||
|
// kill the connection
|
||||||
|
client.Dispose();
|
||||||
|
|
||||||
|
await endPointTask;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task LifetimeManagerOnDisconnectedAsyncCalledIfLifetimeManagerOnConnectedAsyncThrows()
|
public async Task LifetimeManagerOnDisconnectedAsyncCalledIfLifetimeManagerOnConnectedAsyncThrows()
|
||||||
{
|
{
|
||||||
|
|
@ -1094,5 +1114,14 @@ namespace Microsoft.AspNetCore.SignalR.Tests
|
||||||
return base.OnConnectedAsync();
|
return base.OnConnectedAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class SimpleHub : Hub
|
||||||
|
{
|
||||||
|
public override async Task OnConnectedAsync()
|
||||||
|
{
|
||||||
|
await Clients.All.InvokeAsync("Send", $"{Context.ConnectionId} joined");
|
||||||
|
await base.OnConnectedAsync();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue