| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- commit f6cda4fab73ff5d4594741cc5b34b58fa3d0e579
- Author: Chris Ross (ASP.NET) <[email protected]>
- Date: Fri Nov 16 16:39:50 2018 -0800
- Make TestServer handle exceptions from OnStarting #1594
- diff --git a/src/Microsoft.AspNetCore.TestHost/HttpContextBuilder.cs b/src/Microsoft.AspNetCore.TestHost/HttpContextBuilder.cs
- index 6886b1aac45..c576628b65c 100644
- --- a/src/Microsoft.AspNetCore.TestHost/HttpContextBuilder.cs
- +++ b/src/Microsoft.AspNetCore.TestHost/HttpContextBuilder.cs
- @@ -109,7 +109,16 @@ namespace Microsoft.AspNetCore.TestHost
- if (!_responseFeature.HasStarted)
- {
- // Sets HasStarted
- - await _responseFeature.FireOnSendingHeadersAsync();
- + try
- + {
- + await _responseFeature.FireOnSendingHeadersAsync();
- + }
- + catch (Exception ex)
- + {
- + Abort(ex);
- + return;
- + }
- +
- // Copy the feature collection so we're not multi-threading on the same collection.
- var newFeatures = new FeatureCollection();
- foreach (var pair in _httpContext.Features)
- diff --git a/test/Microsoft.AspNetCore.TestHost.Tests/ClientHandlerTests.cs b/test/Microsoft.AspNetCore.TestHost.Tests/ClientHandlerTests.cs
- index e90a79e97bd..7187f493dc5 100644
- --- a/test/Microsoft.AspNetCore.TestHost.Tests/ClientHandlerTests.cs
- +++ b/test/Microsoft.AspNetCore.TestHost.Tests/ClientHandlerTests.cs
- @@ -272,6 +272,63 @@ namespace Microsoft.AspNetCore.TestHost
- Assert.IsType<InvalidOperationException>(ex.GetBaseException());
- }
-
- + [Fact]
- + public Task ExceptionFromOnStartingFirstWriteIsReported()
- + {
- + var handler = new ClientHandler(PathString.Empty, new DummyApplication(context =>
- + {
- + context.Response.OnStarting(() =>
- + {
- + throw new InvalidOperationException(new string('a', 1024 * 32));
- + });
- + return context.Response.WriteAsync("Hello World");
- + }));
- + var httpClient = new HttpClient(handler);
- + return Assert.ThrowsAsync<InvalidOperationException>(() => httpClient.GetAsync("https://example.com/",
- + HttpCompletionOption.ResponseHeadersRead));
- + }
- +
- + [Fact]
- + public Task ExceptionFromOnStartingWithNoWriteIsReported()
- + {
- + var handler = new ClientHandler(PathString.Empty, new DummyApplication(context =>
- + {
- + context.Response.OnStarting(() =>
- + {
- + throw new InvalidOperationException(new string('a', 1024 * 32));
- + });
- + return Task.CompletedTask;
- + }));
- + var httpClient = new HttpClient(handler);
- + return Assert.ThrowsAsync<InvalidOperationException>(() => httpClient.GetAsync("https://example.com/",
- + HttpCompletionOption.ResponseHeadersRead));
- + }
- +
- + [Fact]
- + public Task ExceptionFromOnStartingWithErrorHandlerIsReported()
- + {
- + var handler = new ClientHandler(PathString.Empty, new DummyApplication(async context =>
- + {
- + context.Response.OnStarting(() =>
- + {
- + throw new InvalidOperationException(new string('a', 1024 * 32));
- + });
- + try
- + {
- + await context.Response.WriteAsync("Hello World");
- + }
- + catch (Exception ex)
- + {
- + // This is no longer the first write, so it doesn't trigger OnStarting again.
- + // The exception is large enough that it fills the pipe and stalls.
- + await context.Response.WriteAsync(ex.ToString());
- + }
- + }));
- + var httpClient = new HttpClient(handler);
- + return Assert.ThrowsAsync<InvalidOperationException>(() => httpClient.GetAsync("https://example.com/",
- + HttpCompletionOption.ResponseHeadersRead));
- + }
- +
- private class DummyApplication : IHttpApplication<Context>
- {
- RequestDelegate _application;
|