< Summary

Information
Class: System.Net.Http.HttpConnectionResponseContent
Assembly: System.Net.Http
File(s): D:\runner\runtime\src\libraries\System.Net.Http\src\System\Net\Http\SocketsHttpHandler\HttpConnectionResponseContent.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 50
Coverable lines: 50
Total lines: 97
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 8
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
SetStream(...)100%110%
ConsumeStream()0%440%
SerializeToStream(...)100%110%
SerializeToStreamAsync(...)100%110%
SerializeToStreamAsync(...)100%110%
Impl()100%110%
TryComputeLength(...)100%110%
CreateContentReadStream(...)100%110%
CreateContentReadStreamAsync()100%110%
TryCreateContentReadStream()100%110%
Dispose(...)0%440%

File(s)

D:\runner\runtime\src\libraries\System.Net.Http\src\System\Net\Http\SocketsHttpHandler\HttpConnectionResponseContent.cs

#LineLine coverage
 1// Licensed to the .NET Foundation under one or more agreements.
 2// The .NET Foundation licenses this file to you under the MIT license.
 3
 4using System.Diagnostics;
 5using System.IO;
 6using System.Threading;
 7using System.Threading.Tasks;
 8
 9namespace System.Net.Http
 10{
 11    internal sealed class HttpConnectionResponseContent : HttpContent
 12    {
 13        private Stream? _stream;
 14        private bool _consumedStream; // separate from _stream so that Dispose can drain _stream
 15
 16        public void SetStream(Stream stream)
 017        {
 018            Debug.Assert(stream != null);
 019            Debug.Assert(stream.CanRead);
 020            Debug.Assert(!_consumedStream);
 21
 022            _stream = stream;
 023        }
 24
 25        private Stream ConsumeStream()
 026        {
 027            if (_consumedStream || _stream == null)
 028            {
 029                throw new InvalidOperationException(SR.net_http_content_stream_already_read);
 30            }
 031            _consumedStream = true;
 32
 033            return _stream;
 034        }
 35
 36        protected override void SerializeToStream(Stream stream, TransportContext? context,
 37            CancellationToken cancellationToken)
 038        {
 039            ArgumentNullException.ThrowIfNull(stream);
 40
 041            using (Stream contentStream = ConsumeStream())
 042            {
 43                const int BufferSize = 8192;
 044                contentStream.CopyTo(stream, BufferSize);
 045            }
 046        }
 47
 48        protected sealed override Task SerializeToStreamAsync(Stream stream, TransportContext? context) =>
 049            SerializeToStreamAsync(stream, context, CancellationToken.None);
 50
 51        protected sealed override Task SerializeToStreamAsync(Stream stream, TransportContext? context, CancellationToke
 052        {
 053            ArgumentNullException.ThrowIfNull(stream);
 054            return Impl(stream, cancellationToken);
 55
 56            async Task Impl(Stream stream, CancellationToken cancellationToken)
 057            {
 058                using (Stream contentStream = ConsumeStream())
 059                {
 60                    const int BufferSize = 8192;
 061                    await contentStream.CopyToAsync(stream, BufferSize, cancellationToken).ConfigureAwait(false);
 062                }
 063            }
 064        }
 65
 66        protected internal sealed override bool TryComputeLength(out long length)
 067        {
 068            length = 0;
 069            return false;
 070        }
 71
 72        protected sealed override Stream CreateContentReadStream(CancellationToken cancellationToken) =>
 073            ConsumeStream();
 74
 75        protected sealed override Task<Stream> CreateContentReadStreamAsync() =>
 076            Task.FromResult<Stream>(ConsumeStream());
 77
 78        internal sealed override Stream TryCreateContentReadStream() =>
 079            ConsumeStream();
 80
 081        internal override bool AllowDuplex => false;
 82
 83        protected sealed override void Dispose(bool disposing)
 084        {
 085            if (disposing)
 086            {
 087                if (_stream != null)
 088                {
 089                    _stream.Dispose();
 090                    _stream = null;
 091                }
 092            }
 93
 094            base.Dispose(disposing);
 095        }
 96    }
 97}