Expose SharpCompressStream to allow ringbuffer to be used on non-seekable streams

This commit is contained in:
Adam Hathcock
2026-02-14 10:16:01 +00:00
parent 18eb140017
commit a2a1b2e8fd
5 changed files with 46 additions and 3 deletions

View File

@@ -5,7 +5,7 @@ using System.Threading.Tasks;
namespace SharpCompress.IO;
internal partial class SharpCompressStream
public partial class SharpCompressStream
{
public override Task<int> ReadAsync(
byte[] buffer,

View File

@@ -4,7 +4,7 @@ using SharpCompress.Common;
namespace SharpCompress.IO;
internal partial class SharpCompressStream
public partial class SharpCompressStream
{
/// <summary>
/// Creates a SharpCompressStream that acts as a passthrough wrapper.

View File

@@ -4,7 +4,7 @@ using SharpCompress.Common;
namespace SharpCompress.IO;
internal partial class SharpCompressStream : Stream, IStreamStack
public partial class SharpCompressStream : Stream, IStreamStack
{
public virtual Stream BaseStream() => stream;

View File

@@ -1,6 +1,7 @@
using System.IO;
using System.Threading.Tasks;
using SharpCompress.Compressors.Xz;
using SharpCompress.IO;
using SharpCompress.Test.Mocks;
using Xunit;
@@ -34,4 +35,24 @@ public class XzStreamAsyncTests : XzTestsBase
var uncompressed = await sr.ReadToEndAsync().ConfigureAwait(false);
Assert.Equal(OriginalIndexed, uncompressed);
}
[Fact]
public async ValueTask CanReadNonSeekableStreamAsync()
{
var nonSeekable = new ForwardOnlyStream(new MemoryStream(Compressed));
var xz = new XZStream(SharpCompressStream.Create(nonSeekable));
using var sr = new StreamReader(new AsyncOnlyStream(xz));
var uncompressed = await sr.ReadToEndAsync().ConfigureAwait(false);
Assert.Equal(Original, uncompressed);
}
[Fact]
public async ValueTask CanReadNonSeekableEmptyStreamAsync()
{
var nonSeekable = new ForwardOnlyStream(new MemoryStream(CompressedEmpty));
var xz = new XZStream(SharpCompressStream.Create(nonSeekable));
using var sr = new StreamReader(new AsyncOnlyStream(xz));
var uncompressed = await sr.ReadToEndAsync().ConfigureAwait(false);
Assert.Equal(OriginalEmpty, uncompressed);
}
}

View File

@@ -1,5 +1,7 @@
using System.IO;
using SharpCompress.Compressors.Xz;
using SharpCompress.IO;
using SharpCompress.Test.Mocks;
using Xunit;
namespace SharpCompress.Test.Xz;
@@ -32,4 +34,24 @@ public class XzStreamTests : XzTestsBase
var uncompressed = sr.ReadToEnd();
Assert.Equal(OriginalIndexed, uncompressed);
}
[Fact]
public void CanReadNonSeekableStream()
{
var nonSeekable = new ForwardOnlyStream(new MemoryStream(Compressed));
var xz = new XZStream(SharpCompressStream.Create(nonSeekable));
using var sr = new StreamReader(xz);
var uncompressed = sr.ReadToEnd();
Assert.Equal(Original, uncompressed);
}
[Fact]
public void CanReadNonSeekableEmptyStream()
{
var nonSeekable = new ForwardOnlyStream(new MemoryStream(CompressedEmpty));
var xz = new XZStream(SharpCompressStream.Create(nonSeekable));
using var sr = new StreamReader(xz);
var uncompressed = sr.ReadToEnd();
Assert.Equal(OriginalEmpty, uncompressed);
}
}