Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -239,10 +239,15 @@ public async Task ResponseBodyWriteExceptions_ClientDisconnectsBeforeFirstWrite_
var responseTask = SendRequestAsync(address, cts.Token);

var context = await server.AcceptAsync(Utilities.DefaultTimeout).Before(responseTask);
// First write sends headers

var disconnectCts = new TaskCompletionSource<int>(TaskCreationOptions.RunContinuationsAsynchronously);
context.DisconnectToken.Register(() => disconnectCts.SetResult(0));

// Make sure the client is aborted
cts.Cancel();
await Assert.ThrowsAnyAsync<OperationCanceledException>(() => responseTask);
Assert.True(context.DisconnectToken.WaitHandle.WaitOne(TimeSpan.FromSeconds(5)));
await disconnectCts.Task.WithTimeout();

Assert.Throws<IOException>(() =>
{
// It can take several tries before Write notices the disconnect.
Expand Down Expand Up @@ -270,11 +275,14 @@ public async Task ResponseBodyWriteExceptions_ClientDisconnectsBeforeFirstWriteA

var context = await server.AcceptAsync(Utilities.DefaultTimeout).Before(responseTask);

var disconnectCts = new TaskCompletionSource<int>(TaskCreationOptions.RunContinuationsAsynchronously);
context.DisconnectToken.Register(() => disconnectCts.SetResult(0));

// First write sends headers
cts.Cancel();
await Assert.ThrowsAnyAsync<OperationCanceledException>(() => responseTask);
await disconnectCts.Task.WithTimeout();

Assert.True(context.DisconnectToken.WaitHandle.WaitOne(TimeSpan.FromSeconds(5)));
await Assert.ThrowsAsync<IOException>(async () =>
{
// It can take several tries before Write notices the disconnect.
Expand All @@ -301,10 +309,14 @@ public async Task ResponseBody_ClientDisconnectsBeforeFirstWrite_WriteCompletesS

server.Options.AllowSynchronousIO = true;
var context = await server.AcceptAsync(Utilities.DefaultTimeout).Before(responseTask);
// First write sends headers

var disconnectCts = new TaskCompletionSource<int>(TaskCreationOptions.RunContinuationsAsynchronously);
context.DisconnectToken.Register(() => disconnectCts.SetResult(0));

cts.Cancel();
await Assert.ThrowsAnyAsync<OperationCanceledException>(() => responseTask);
Assert.True(context.DisconnectToken.WaitHandle.WaitOne(TimeSpan.FromSeconds(5)));
await disconnectCts.Task.WithTimeout();

// It can take several tries before Write notices the disconnect.
for (int i = 0; i < Utilities.WriteRetryLimit; i++)
{
Expand All @@ -324,10 +336,14 @@ public async Task ResponseBody_ClientDisconnectsBeforeFirstWriteAsync_WriteCompl
var responseTask = SendRequestAsync(address, cts.Token);

var context = await server.AcceptAsync(Utilities.DefaultTimeout).Before(responseTask);
// First write sends headers

var disconnectCts = new TaskCompletionSource<int>(TaskCreationOptions.RunContinuationsAsynchronously);
context.DisconnectToken.Register(() => disconnectCts.SetResult(0));

cts.Cancel();
await Assert.ThrowsAnyAsync<OperationCanceledException>(() => responseTask);
Assert.True(context.DisconnectToken.WaitHandle.WaitOne(TimeSpan.FromSeconds(5)));
await disconnectCts.Task.WithTimeout();

// It can take several tries before Write notices the disconnect.
for (int i = 0; i < Utilities.WriteRetryLimit; i++)
{
Expand All @@ -350,16 +366,20 @@ public async Task ResponseBodyWriteExceptions_ClientDisconnectsBeforeSecondWrite
var responseTask = client.GetAsync(address, HttpCompletionOption.ResponseHeadersRead);

context = await server.AcceptAsync(Utilities.DefaultTimeout).Before(responseTask);

var disconnectCts = new TaskCompletionSource<int>(TaskCreationOptions.RunContinuationsAsynchronously);
context.DisconnectToken.Register(() => disconnectCts.SetResult(0));

// First write sends headers
context.AllowSynchronousIO = true;
context.Response.Body.Write(new byte[10], 0, 10);

var response = await responseTask;
response.EnsureSuccessStatusCode();
response.Dispose();
await disconnectCts.Task.WithTimeout();
}

Assert.True(context.DisconnectToken.WaitHandle.WaitOne(TimeSpan.FromSeconds(5)));
Assert.Throws<IOException>(() =>
{
// It can take several tries before Write notices the disconnect.
Expand All @@ -385,15 +405,19 @@ public async Task ResponseBodyWriteExceptions_ClientDisconnectsBeforeSecondWrite
var responseTask = client.GetAsync(address, HttpCompletionOption.ResponseHeadersRead);

context = await server.AcceptAsync(Utilities.DefaultTimeout).Before(responseTask);

var disconnectCts = new TaskCompletionSource<int>(TaskCreationOptions.RunContinuationsAsynchronously);
context.DisconnectToken.Register(() => disconnectCts.SetResult(0));

// First write sends headers
await context.Response.Body.WriteAsync(new byte[10], 0, 10);

var response = await responseTask;
response.EnsureSuccessStatusCode();
response.Dispose();
await disconnectCts.Task.WithTimeout();
}

Assert.True(context.DisconnectToken.WaitHandle.WaitOne(TimeSpan.FromSeconds(5)));
await Assert.ThrowsAsync<IOException>(async () =>
{
// It can take several tries before Write notices the disconnect.
Expand All @@ -419,15 +443,19 @@ public async Task ResponseBody_ClientDisconnectsBeforeSecondWrite_WriteCompletes
var responseTask = client.GetAsync(address, HttpCompletionOption.ResponseHeadersRead);

context = await server.AcceptAsync(Utilities.DefaultTimeout).Before(responseTask);

var disconnectCts = new TaskCompletionSource<int>(TaskCreationOptions.RunContinuationsAsynchronously);
context.DisconnectToken.Register(() => disconnectCts.SetResult(0));

// First write sends headers
context.Response.Body.Write(new byte[10], 0, 10);

var response = await responseTask;
response.EnsureSuccessStatusCode();
response.Dispose();
await disconnectCts.Task.WithTimeout();
}

Assert.True(context.DisconnectToken.WaitHandle.WaitOne(TimeSpan.FromSeconds(5)));
// It can take several tries before Write notices the disconnect.
for (int i = 0; i < Utilities.WriteRetryLimit; i++)
{
Expand All @@ -449,15 +477,19 @@ public async Task ResponseBody_ClientDisconnectsBeforeSecondWriteAsync_WriteComp
var responseTask = client.GetAsync(address, HttpCompletionOption.ResponseHeadersRead);

context = await server.AcceptAsync(Utilities.DefaultTimeout).Before(responseTask);

var disconnectCts = new TaskCompletionSource<int>(TaskCreationOptions.RunContinuationsAsynchronously);
context.DisconnectToken.Register(() => disconnectCts.SetResult(0));

// First write sends headers
await context.Response.Body.WriteAsync(new byte[10], 0, 10);

var response = await responseTask;
response.EnsureSuccessStatusCode();
response.Dispose();
await disconnectCts.Task.WithTimeout();
}

Assert.True(context.DisconnectToken.WaitHandle.WaitOne(TimeSpan.FromSeconds(5)));
// It can take several tries before Write notices the disconnect.
for (int i = 0; i < Utilities.WriteRetryLimit; i++)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,8 @@ public async Task Server_TokenRegisteredAfterClientDisconnects_CallCanceled()
var ct = context.DisconnectToken;
Assert.True(ct.CanBeCanceled, "CanBeCanceled");
ct.Register(() => canceled.SetResult(0));
Assert.True(ct.WaitHandle.WaitOne(interval));
Assert.True(ct.IsCancellationRequested, "IsCancellationRequested");

await canceled.Task.TimeoutAfter(interval);
Assert.True(ct.IsCancellationRequested, "IsCancellationRequested");

context.Dispose();
}
Expand Down Expand Up @@ -71,7 +69,6 @@ public async Task Server_TokenRegisteredAfterResponseSent_Success()
var ct = context.DisconnectToken;
Assert.False(ct.CanBeCanceled, "CanBeCanceled");
ct.Register(() => canceled.SetResult(0));
Assert.False(ct.WaitHandle.WaitOne(interval));
Assert.False(ct.IsCancellationRequested, "IsCancellationRequested");

Assert.False(canceled.Task.IsCompleted, "canceled");
Expand Down
2 changes: 1 addition & 1 deletion src/Servers/HttpSys/test/FunctionalTests/ServerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,7 @@ public async Task Server_ClientDisconnects_CallCanceled()
ct.Register(() => canceled.SetResult(0));
received.SetResult(0);
await aborted.Task.TimeoutAfter(interval);
Assert.True(ct.WaitHandle.WaitOne(interval), "CT Wait");
await canceled.Task.TimeoutAfter(interval);
Assert.True(ct.IsCancellationRequested, "IsCancellationRequested");
}))
{
Expand Down