public void OnWrite_AppendsAcceptEncodingToVaryHeader_IfNotPresent(string providedVaryHeader, string expectedVaryHeader)
        {
            var httpContext = new DefaultHttpContext();

            httpContext.Response.Headers[HeaderNames.Vary] = providedVaryHeader;
            var stream = new BodyWrapperStream(httpContext, new MemoryStream(), new MockResponseCompressionProvider(flushable: true), null, null);

            stream.Write(new byte[] { }, 0, 0);


            Assert.Equal(expectedVaryHeader, httpContext.Response.Headers[HeaderNames.Vary]);
        }
Пример #2
0
        public async Task WriteAsync_IsPassedToUnderlyingStream_WhenDisableResponseBuffering(bool flushable)
        {
            var buffer = new byte[] { 1 };

            var memoryStream = new MemoryStream();
            var stream       = new BodyWrapperStream(new DefaultHttpContext(), memoryStream, new MockResponseCompressionProvider(flushable), null, null, null);

            stream.DisableResponseBuffering();
            await stream.WriteAsync(buffer, 0, buffer.Length);

            Assert.Equal(buffer, memoryStream.ToArray());
        }
Пример #3
0
        public async Task SendFileAsync_IsPassedToUnderlyingStream_WhenDisableResponseBuffering()
        {
            var memoryStream = new MemoryStream();

            var stream = new BodyWrapperStream(new DefaultHttpContext(), memoryStream, new MockResponseCompressionProvider(true), null, null, null);

            stream.DisableResponseBuffering();

            var path = "testfile1kb.txt";
            await stream.SendFileAsync(path, 0, null, CancellationToken.None);

            Assert.Equal(File.ReadAllBytes(path), memoryStream.ToArray());
        }
        public async Task Invoke(HttpContext context)
        {
            bool useMinification = _options.IsMinificationEnabled() && _minificationManagers.Count > 0;
            bool useCompression  = _options.IsCompressionEnabled() && _compressionManager != null;

            if (!useMinification && !useCompression)
            {
                await _next.Invoke(context);

                return;
            }
            else
            {
                HttpResponse       response = context.Response;
                IFeatureCollection features = context.Features;

                Stream originalStream = response.Body;
                IHttpBufferingFeature originalBufferFeature = features.Get <IHttpBufferingFeature>();
                BodyWrapperStream     bodyWrapperStream     = new BodyWrapperStream(context, originalStream, _options,
                                                                                    useMinification ? _minificationManagers : new List <IMarkupMinificationManager>(),
                                                                                    useCompression ? _compressionManager : null,
                                                                                    originalBufferFeature);

                response.Body = bodyWrapperStream;
                features.Set <IHttpBufferingFeature>(bodyWrapperStream);

                try
                {
                    await _next(context);

                    await bodyWrapperStream.Finish();
                }
                finally
                {
#if NETCOREAPP3_0
                    await bodyWrapperStream.DisposeAsync();
#else
                    bodyWrapperStream.Dispose();
#endif

                    response.Body = originalStream;
                    features.Set(originalBufferFeature);
                }
            }
        }
        public void Write_IsPassedToUnderlyingStream_WhenDisableResponseBuffering(bool flushable)
        {
            var buffer = new byte[] { 1 };

            byte[] written = null;

            var mock = new Mock <Stream>();

            mock.SetupGet(s => s.CanWrite).Returns(true);
            mock.Setup(s => s.Write(It.IsAny <byte[]>(), It.IsAny <int>(), It.IsAny <int>()))
            .Callback <byte[], int, int>((b, o, c) =>
            {
                written = new ArraySegment <byte>(b, 0, c).ToArray();
            });

            var stream = new BodyWrapperStream(new DefaultHttpContext(), mock.Object, new MockResponseCompressionProvider(flushable), null, null);

            stream.DisableResponseBuffering();
            stream.Write(buffer, 0, buffer.Length);

            Assert.Equal(buffer, written);
        }
        public async Task SendFileAsync_IsPassedToUnderlyingStream_WhenDisableResponseBuffering()
        {
            byte[] written = null;

            var mock = new Mock <Stream>();

            mock.SetupGet(s => s.CanWrite).Returns(true);
            mock.Setup(s => s.WriteAsync(It.IsAny <byte[]>(), It.IsAny <int>(), It.IsAny <int>(), It.IsAny <CancellationToken>()))
            .Callback <byte[], int, int, CancellationToken>((b, o, c, t) =>
            {
                written = new ArraySegment <byte>(b, 0, c).ToArray();
            })
            .Returns(Task.FromResult(0));

            var stream = new BodyWrapperStream(new DefaultHttpContext(), mock.Object, new MockResponseCompressionProvider(true), null, null);

            stream.DisableResponseBuffering();

            var path = "testfile1kb.txt";
            await stream.SendFileAsync(path, 0, null, CancellationToken.None);

            Assert.Equal(File.ReadAllBytes(path), written);
        }