public async Task UnhandledException_InMiddleware_PropagatesBackToInvoker() { // Arrange var expectedMessage = "Error!!!"; Pipeline1.ConfigurePipeline = (appBuilder) => { appBuilder.Use((httpContext, next) => { throw new InvalidOperationException(expectedMessage); }); }; var resourceFilter1 = new TestResourceFilter(TestResourceFilterAction.Passthrough); var middlewareResourceFilter = new MiddlewareFilter(GetMiddlewarePipeline(typeof(Pipeline1))); var exceptionThrowingResourceFilter = new TestResourceFilter(TestResourceFilterAction.ThrowException); var invoker = CreateInvoker( new IFilterMetadata[] { resourceFilter1, middlewareResourceFilter, exceptionThrowingResourceFilter, // This shouldn't run }, actionThrows: true); // The action won't run // Act var exception = await Assert.ThrowsAsync <InvalidOperationException>(async() => await invoker.InvokeAsync()); // Assert Assert.Equal(expectedMessage, exception.Message); }
public async Task ExceptionThrownInMiddleware_CanBeHandled_ByEarlierMiddleware() { // Arrange var expectedMessage = "Error!!!"; Pipeline1.ConfigurePipeline = (appBuilder) => { appBuilder.Use(async(httpContext, next) => { try { await next(); } catch { httpContext.Response.StatusCode = 500; httpContext.Response.Headers.Add("Error", "Error!!!!"); } }); }; Pipeline2.ConfigurePipeline = (appBuilder) => { appBuilder.Use((httpContext, next) => { throw new InvalidOperationException(expectedMessage); }); }; var resourceFilter1 = new TestResourceFilter(TestResourceFilterAction.Passthrough); var middlewareResourceFilter1 = new MiddlewareFilter(GetMiddlewarePipeline(typeof(Pipeline1))); var middlewareResourceFilter2 = new MiddlewareFilter(GetMiddlewarePipeline(typeof(Pipeline2))); var exceptionThrowingResourceFilter = new TestResourceFilter(TestResourceFilterAction.ThrowException); var invoker = CreateInvoker( new IFilterMetadata[] { resourceFilter1, middlewareResourceFilter1, middlewareResourceFilter2, exceptionThrowingResourceFilter, // This shouldn't run }, actionThrows: true); // The action won't run // Act var exception = await Assert.ThrowsAsync <InvalidOperationException>(async() => await invoker.InvokeAsync()); // Assert var resourceExecutedContext = resourceFilter1.ResourceExecutedContext; var response = resourceExecutedContext.HttpContext.Response; Assert.Equal(500, response.StatusCode); Assert.True(response.Headers.ContainsKey("Error")); Assert.False(invoker.ControllerFactory.CreateCalled); }
public async Task Multiple_MiddlewareFilters_ConcatsTheMiddlewarePipelines() { // Arrange var expectedHeader = "h1"; var expectedHeaderValue = "pipeline1-pipeline2"; Pipeline1.ConfigurePipeline = (appBuilder) => { appBuilder.Use((httpContext, next) => { httpContext.Response.Headers["h1"] = "pipeline1"; return(next()); }); }; Pipeline2.ConfigurePipeline = (appBuilder) => { appBuilder.Use((httpContext, next) => { httpContext.Response.Headers["h1"] = httpContext.Response.Headers["h1"] + "-pipeline2"; return(Task.FromResult(true)); // short circuits the request }); }; var resourceFilter1 = new TestResourceFilter(TestResourceFilterAction.Passthrough); var middlewareResourceFilter1 = new MiddlewareFilter(GetMiddlewarePipeline(typeof(Pipeline1))); var middlewareResourceFilter2 = new MiddlewareFilter(GetMiddlewarePipeline(typeof(Pipeline2))); var exceptionThrowingResourceFilter = new TestResourceFilter(TestResourceFilterAction.ThrowException); var invoker = CreateInvoker( new IFilterMetadata[] { resourceFilter1, // This filter will pass through middlewareResourceFilter1, // This filter will pass through middlewareResourceFilter2, // This filter will short circuit exceptionThrowingResourceFilter, // This shouldn't run }, actionThrows: true); // The action won't run // Act await invoker.InvokeAsync(); // Assert var resourceExecutedContext = resourceFilter1.ResourceExecutedContext; var response = resourceExecutedContext.HttpContext.Response; Assert.True(response.Headers.ContainsKey(expectedHeader)); Assert.Equal(expectedHeaderValue, response.Headers[expectedHeader]); Assert.True(resourceExecutedContext.Canceled); Assert.False(invoker.ControllerFactory.CreateCalled); }
public async Task OnMiddlewareShortCircuit_DoesNotExecute_RestOfFilterPipeline() { // Arrange var expectedHeader = "h1"; Pipeline1.ConfigurePipeline = (appBuilder) => { appBuilder.Use((httpContext, next) => { httpContext.Response.Headers.Add(expectedHeader, ""); return(Task.FromResult(true)); // short circuit the request }); }; var resourceFilter1 = new TestResourceFilter(TestResourceFilterAction.Passthrough); var middlewareResourceFilter = new MiddlewareFilter(GetMiddlewarePipeline(typeof(Pipeline1))); var exceptionThrowingResourceFilter = new TestResourceFilter(TestResourceFilterAction.ThrowException); var invoker = CreateInvoker( new IFilterMetadata[] { resourceFilter1, middlewareResourceFilter, exceptionThrowingResourceFilter, }, actionThrows: true); // The action won't run // Act await invoker.InvokeAsync(); // Assert var resourceExecutedContext = resourceFilter1.ResourceExecutedContext; Assert.True(resourceExecutedContext.HttpContext.Response.Headers.ContainsKey(expectedHeader)); Assert.True(resourceExecutedContext.Canceled); Assert.False(invoker.ControllerFactory.CreateCalled); }