Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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);
        }