public void When_create_plain_http_context_And_http_context_not_empty_Then_throws_invalid_operation_exception()
        {
            //Arrange
            var plainHttpContext   = new PlainHttpContext();
            var defaultHttpContext = new DefaultHttpContext();

            defaultHttpContext.Features.Set(plainHttpContext);

            //Act
            //Assert
            Assert.Throws <InvalidOperationException>(() => HttpContextExtensions.CreatePlainHttpContext(defaultHttpContext));
        }
        public void When_get_plain_http_context_And_http_context_not_empty_Then_returns_plain_http_context()
        {
            //Arrange
            var plainHttpContext   = new PlainHttpContext();
            var defaultHttpContext = new DefaultHttpContext();

            defaultHttpContext.Features.Set(plainHttpContext);

            //Act
            var result = HttpContextExtensions.GetPlainHttpContext(defaultHttpContext);

            //Assert
            Assert.That(result, Is.Not.Null);
        }
        public async Task InvokeAsync(HttpContext context)
        {
            this.httpContext = context;

            await this.next(this.httpContext);

            this.plainHttpContext = this.httpContext.GetPlainHttpContext();

            this.SetStatusCode();

            this.SetHeaders();

            await this.CopyContent();

            this.LogResult();
        }
        /// <summary>
        /// Extension method for creating the <see cref="PlainHttpContext"/> for the current HTTP context.
        /// </summary>
        /// <param name="context">The <see cref="HttpContext"/> context.</param>
        /// <returns>The <see cref="PlainHttpContext"/>.</returns>
        public static PlainHttpContext CreatePlainHttpContext(this HttpContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            var plainHttpContext = context.Features.Get <PlainHttpContext>();

            if (plainHttpContext != null)
            {
                throw new InvalidOperationException("Plain HTTP context was already create for given HTTP context");
            }

            plainHttpContext = new PlainHttpContext();
            context.Features.Set(plainHttpContext);

            return(plainHttpContext);
        }