public void PreserveReturnsResponseStream()
        {
            var mockStream = new Mock <Stream>();
            var response   = new MockResponse(200);

            response.ContentStream = mockStream.Object;

            HttpPipelineMessage message = new HttpPipelineMessage(new MockRequest(), new ResponseClassifier());

            message.Response = response;

            Stream stream  = message.ExtractResponseContent();
            Stream stream2 = message.ExtractResponseContent();

            Assert.AreSame(mockStream.Object, stream);
            Assert.AreSame(stream2, stream);
        }
        public void PreserveReturnsNullWhenContentIsNull()
        {
            var response = new MockResponse(200);

            response.ContentStream = null;

            HttpPipelineMessage message = new HttpPipelineMessage(new MockRequest(), new ResponseClassifier());

            message.Response = response;

            Stream stream = message.ExtractResponseContent();

            Assert.AreSame(null, stream);
        }
        public void PreserveSetsResponseContentToThrowingStream()
        {
            var mockStream = new Mock <Stream>();
            var response   = new MockResponse(200);

            response.ContentStream = mockStream.Object;

            HttpPipelineMessage message = new HttpPipelineMessage(new MockRequest(), new ResponseClassifier());

            message.Response = response;

            Stream stream = message.ExtractResponseContent();

            Assert.AreSame(mockStream.Object, stream);
            InvalidOperationException exception = Assert.Throws <InvalidOperationException>(() => response.ContentStream.Read(Array.Empty <byte>(), 0, 0));

            Assert.AreEqual("The operation has called ExtractResponseContent and will provide the stream as part of its response type.", exception.Message);
        }
        public async Task NonBufferedExtractedStreamReadableAfterMessageDisposed()
        {
            byte[] buffer = { 0 };

            HttpPipeline httpPipeline = HttpPipelineBuilder.Build(new TestOptions());

            using TestServer testServer = new TestServer(
                      async context =>
            {
                for (int i = 0; i < 1000; i++)
                {
                    await context.Response.Body.WriteAsync(buffer, 0, 1);
                }
            });

            // Make sure we dispose things correctly and not exhaust the connection pool
            for (int i = 0; i < 100; i++)
            {
                Stream extractedStream;
                using (HttpPipelineMessage message = httpPipeline.CreateMessage())
                {
                    message.Request.Uri.Assign(testServer.Address);
                    message.BufferResponse = false;

                    await httpPipeline.SendAsync(message, CancellationToken.None);

                    Assert.AreEqual(message.Response.ContentStream.CanSeek, false);

                    extractedStream = message.ExtractResponseContent();
                }

                var memoryStream = new MemoryStream();
                await extractedStream.CopyToAsync(memoryStream);

                Assert.AreEqual(memoryStream.Length, 1000);
                extractedStream.Dispose();
            }
        }