Example #1
0
    private void AdvertizeSupportedEncodings(HttpContext context, RequestDecompressionOptions decompressionOptions)
    {
        _decompressionProviders ??= CreateDecompressionProviders(decompressionOptions.Providers);
        _acceptEncodingHeader ??= CreateAcceptEncodingHeader(_decompressionProviders);

        context.Response.Headers.AcceptEncoding = _acceptEncodingHeader;
    }
Example #2
0
    public async Task InvokeCodingRelaxed(string encodingIn, string messageIn, string encodingOut, string messageOut, long?contentLength, int statusCode)
    {
        Task NextRequestDelegate(HttpContext httpContext)
        {
            Assert.AreEqual(encodingOut, httpContext.Request.Headers.ContentEncoding.ToString());
            Assert.AreEqual(contentLength, httpContext.Request.Headers.ContentLength);
            Assert.AreEqual(messageOut, AsString(httpContext.Request.Body));
            Assert.AreEqual(statusCode, httpContext.Response.StatusCode);

            return(Task.CompletedTask);
        }

        var options     = new RequestDecompressionOptions();
        var logger      = NullLogger <RequestDecompressionMiddleware> .Instance;
        var httpContext = new DefaultHttpContext();

        options.Providers.Add <TestDecompressionProviderA>();
        options.AllowUnsupportedEncodings = true;

        httpContext.Request.Headers.ContentEncoding = new(encodingIn.Split('+', StringSplitOptions.RemoveEmptyEntries));
        httpContext.Request.Headers.ContentLength   = 1L;
        httpContext.Request.Body = new MemoryStream(Encoding.UTF8.GetBytes(messageIn));

        var middleware = new RequestDecompressionMiddleware(Options.Create(options), logger);

        await middleware.InvokeAsync(httpContext, NextRequestDelegate);

        Assert.AreEqual("", httpContext.Response.Headers.AcceptEncoding.ToString());
    }
    public void Options_InitializedWithDefaultProviders()
    {
        // Arrange
        var defaultProviderCount = 3;

        // Act
        var options = new RequestDecompressionOptions();

        // Assert
        var providers = options.DecompressionProviders;

        Assert.Equal(defaultProviderCount, providers.Count);

        var brotliProvider = Assert.Contains("br", providers);

        Assert.IsType <BrotliDecompressionProvider>(brotliProvider);

        var deflateProvider = Assert.Contains("deflate", providers);

        Assert.IsType <DeflateDecompressionProvider>(deflateProvider);

        var gzipProvider = Assert.Contains("gzip", providers);

        Assert.IsType <GZipDecompressionProvider>(gzipProvider);
    }
Example #4
0
        public void AddProviderWithTypeWhenTypeDoesNotImplementInterface()
        {
            var options = new RequestDecompressionOptions();

            Assert.ThrowsException <ArgumentException>(() =>
                                                       options.Providers.Add(typeof(TestDecompressionProvider01)));
        }
Example #5
0
        public void AddProviderWithTypeWhenTypeIsNull()
        {
            var options = new RequestDecompressionOptions();

            Assert.ThrowsException <ArgumentNullException>(() =>
                                                           options.Providers.Add(null));
        }
Example #6
0
        public void AddProviderWithTypeWhenTypeDoesNotHaveAttribute()
        {
            var options = new RequestDecompressionOptions();

            Assert.ThrowsException <ArgumentException>(() =>
                                                       options.Providers.Add(typeof(TestDecompressionProvider00)));
        }
Example #7
0
        public async Task InvokeAsyncWhenRequestHasContentRangeHeader()
        {
            var options = new RequestDecompressionOptions();

            options.Providers.Add <TestDecompressionProvider10>();

            var serviceProviderMock = new Mock <IServiceProvider>(MockBehavior.Strict);
            var optionsMock         = new Mock <IOptions <RequestDecompressionOptions> >(MockBehavior.Strict);

            optionsMock
            .Setup(o => o.Value)
            .Returns(options);

            var loggerMock = new Mock <ILogger <RequestDecompressionMiddleware> >(MockBehavior.Loose);

            loggerMock
            .Setup(o => o.IsEnabled(It.IsAny <LogLevel>()))
            .Returns(true);

            var middleware   = new RequestDecompressionMiddleware(serviceProviderMock.Object, optionsMock.Object, loggerMock.Object);
            var content      = "Hello World!";
            var contentBytes = Encoding.UTF8.GetBytes(content);
            var httpContext  = new DefaultHttpContext();

            httpContext.Request.Method = HttpMethods.Post;
            httpContext.Request.Headers.Add(HeaderNames.ContentEncoding, "encoding");
            httpContext.Request.Headers.Add(HeaderNames.ContentRange, "0-*/*");
            httpContext.Request.Body = new TestRequestStream(contentBytes);

            await middleware.InvokeAsync(httpContext, c => Task.CompletedTask);

            Assert.AreEqual(0, httpContext.Response.Body.Length);
        }
Example #8
0
        public void Constructor()
        {
            var options = new RequestDecompressionOptions();

            Assert.IsTrue(options.SkipUnsupportedEncodings);
            Assert.IsNotNull(options.Providers);
            Assert.AreEqual(0, options.Providers.Count);
        }
Example #9
0
        public void AddProviderWithType()
        {
            var options = new RequestDecompressionOptions();

            options.Providers.Add(typeof(TestDecompressionProvider10));

            Assert.IsNotNull(options.Providers);
            Assert.AreEqual(1, options.Providers.Count);
            Assert.IsTrue(options.Providers.Contains(typeof(TestDecompressionProvider10)));
        }
Example #10
0
    private static RequestDecompressionMiddleware CreateMiddleware(bool relax, bool advertize)
    {
        var options = new RequestDecompressionOptions();

        options.Providers.Add <TestRequestDecompressionProvider>();
        options.AllowUnsupportedEncodings   = relax;
        options.AdvertiseSupportedEncodings = advertize;

        return(new(Options.Create(options), NullLogger <RequestDecompressionMiddleware> .Instance));
    }
Example #11
0
    private static RequestDecompressionMiddleware CreateMiddleware(bool advertize, int encodings)
    {
        var options = new RequestDecompressionOptions();

        if (encodings > 0)
        {
            options.Providers.Add <TestRequestDecompressionProviderA>();
        }
        if (encodings > 1)
        {
            options.Providers.Add <TestRequestDecompressionProviderB>();
        }

        options.AdvertiseSupportedEncodings = advertize;

        return(new(Options.Create(options), NullLogger <RequestDecompressionMiddleware> .Instance));
    }
Example #12
0
        public void ConstructorWithDuplicateEncodings()
        {
            var options = new RequestDecompressionOptions();

            options.Providers.Add <TestDecompressionProvider20>();
            options.Providers.Add <TestDecompressionProvider21>();

            var serviceProviderMock = new Mock <IServiceProvider>(MockBehavior.Strict);
            var optionsMock         = new Mock <IOptions <RequestDecompressionOptions> >(MockBehavior.Strict);

            optionsMock
            .Setup(o => o.Value)
            .Returns(options);

            var loggerMock = new Mock <ILogger <RequestDecompressionMiddleware> >(MockBehavior.Loose);

            Assert.ThrowsException <InvalidOperationException>(() =>
                                                               new RequestDecompressionMiddleware(serviceProviderMock.Object, optionsMock.Object, loggerMock.Object));
        }
Example #13
0
 private static void PostConfigure(RequestDecompressionOptions options)
 {
     options.Providers.TrimExcess();
 }
Example #14
0
 private static void Configure(RequestDecompressionOptions options)
 {
     options.AllowUnsupportedEncodings = true;
     options.Providers.Add <GzipRequestDecompressionProvider>();
     options.Providers.Add <BrotliRequestDecompressionProvider>();
 }
Example #15
0
        public async Task InvokeAsync(string encoding1, string encoding2, bool skipUnsupportedEncodings, int statusCode)
        {
            var options = new RequestDecompressionOptions();

            options.Providers.Add <DeflateDecompressionProvider>();
            options.Providers.Add <GzipDecompressionProvider>();
            options.Providers.Add <BrotliDecompressionProvider>();
            options.SkipUnsupportedEncodings = skipUnsupportedEncodings;

            var loggerMock = new Mock <ILogger <RequestDecompressionMiddleware> >(MockBehavior.Loose);

            loggerMock
            .Setup(o => o.IsEnabled(It.IsAny <LogLevel>()))
            .Returns(true);

            var serviceProviderMock = new Mock <IServiceProvider>(MockBehavior.Strict);
            var optionsMock         = new Mock <IOptions <RequestDecompressionOptions> >(MockBehavior.Strict);

            optionsMock
            .Setup(o => o.Value)
            .Returns(options);

            var middleware = new RequestDecompressionMiddleware(serviceProviderMock.Object, optionsMock.Object, loggerMock.Object);
            var content    = "Hello World!";

            var contentBytes1 = Encoding.UTF8.GetBytes(content);
            var contentBytes2 = default(byte[]);

            var encoding1Values = new StringValues(encoding1.Split(' ', StringSplitOptions.RemoveEmptyEntries));
            var encoding2Values = new StringValues(encoding2.Split(' ', StringSplitOptions.RemoveEmptyEntries));

            foreach (var encoding in encoding1Values)
            {
                contentBytes1 = CompressionEncoder.Encode(contentBytes1, encoding);
            }

            var httpContext = new DefaultHttpContext();

            httpContext.Request.Method = HttpMethods.Post;
            httpContext.Request.Headers.Add(HeaderNames.ContentEncoding, encoding1Values);
            httpContext.Request.Body = new TestRequestStream(contentBytes1);

            await middleware.InvokeAsync(httpContext, c => Task.CompletedTask);

            if (statusCode == StatusCodes.Status200OK)
            {
                Assert.AreEqual(encoding2Values, httpContext.Request.Headers[HeaderNames.ContentEncoding]);

                if (encoding2 == "")
                {
                    if (httpContext.Request.Body is TestRequestStream)
                    {
                        contentBytes2 = ((TestRequestStream)httpContext.Request.Body).ToArray();
                    }
                    else
                    {
                        contentBytes2 = ((MemoryStream)httpContext.Request.Body).ToArray();
                    }


                    Assert.AreEqual(content, Encoding.UTF8.GetString(contentBytes2));
                }
            }

            Assert.AreEqual(statusCode, httpContext.Response.StatusCode);
        }