podman-client-dotnet/src/PodmanClient/Internal/PodmanOwnedResponseStream.cs

52 lines
1.9 KiB
C#

namespace MaksIT.PodmanClientDotNet.Internal;
/// <summary>
/// Wraps a response stream and disposes the underlying <see cref="HttpResponseMessage"/> when done.
/// </summary>
internal sealed class PodmanOwnedResponseStream : Stream {
private readonly Stream _inner;
private readonly HttpResponseMessage _response;
private bool _disposed;
public PodmanOwnedResponseStream(Stream inner, HttpResponseMessage response) {
_inner = inner;
_response = response;
}
public override bool CanRead => _inner.CanRead;
public override bool CanSeek => _inner.CanSeek;
public override bool CanWrite => _inner.CanWrite;
public override long Length => _inner.Length;
public override long Position { get => _inner.Position; set => _inner.Position = value; }
public override void Flush() => _inner.Flush();
public override int Read(byte[] buffer, int offset, int count) => _inner.Read(buffer, offset, count);
public override long Seek(long offset, SeekOrigin origin) => _inner.Seek(offset, origin);
public override void SetLength(long value) => _inner.SetLength(value);
public override void Write(byte[] buffer, int offset, int count) => _inner.Write(buffer, offset, count);
public override Task<int> ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) =>
_inner.ReadAsync(buffer, offset, count, cancellationToken);
public override ValueTask<int> ReadAsync(Memory<byte> buffer, CancellationToken cancellationToken = default) =>
_inner.ReadAsync(buffer, cancellationToken);
protected override void Dispose(bool disposing) {
if (!_disposed && disposing) {
_inner.Dispose();
_response.Dispose();
_disposed = true;
}
base.Dispose(disposing);
}
public override async ValueTask DisposeAsync() {
if (!_disposed) {
await _inner.DisposeAsync().ConfigureAwait(false);
_response.Dispose();
_disposed = true;
}
await base.DisposeAsync().ConfigureAwait(false);
}
}