add writable checks

This commit is contained in:
Adam Hathcock
2026-04-23 11:19:09 +01:00
parent 5d14c96fb0
commit c9a68593ea
7 changed files with 54 additions and 4 deletions

View File

@@ -31,6 +31,18 @@ internal static class StreamValidationExtensions
return stream;
}
internal static Stream RequireWritable(this Stream stream)
{
stream.NotNull(nameof(stream));
if (!stream.CanWrite)
{
throw new ArgumentException("Stream must be writable", nameof(stream));
}
return stream;
}
internal static IReadOnlyList<Stream> RequireSeekable(this IReadOnlyList<Stream> streams)
{
streams.NotNull(nameof(streams));

View File

@@ -22,7 +22,7 @@ public partial class GZipWriter : IWriterOpenable<GZipWriterOptions>
public static IWriter OpenWriter(Stream stream, GZipWriterOptions writerOptions)
{
stream.NotNull(nameof(stream));
stream.RequireWritable();
return new GZipWriter(stream, writerOptions);
}

View File

@@ -36,7 +36,7 @@ public partial class SevenZipWriter : IWriterOpenable<SevenZipWriterOptions>
/// </summary>
public static IWriter OpenWriter(Stream stream, SevenZipWriterOptions writerOptions)
{
stream.NotNull(nameof(stream));
stream.RequireWritable();
return new SevenZipWriter(stream, writerOptions);
}

View File

@@ -22,7 +22,7 @@ public partial class TarWriter : IWriterOpenable<TarWriterOptions>
public static IWriter OpenWriter(Stream stream, TarWriterOptions writerOptions)
{
stream.NotNull(nameof(stream));
stream.RequireWritable();
return new TarWriter(stream, writerOptions);
}

View File

@@ -75,6 +75,8 @@ public static class WriterFactory
IWriterOptions writerOptions
)
{
stream.RequireWritable();
var factory = Factories
.Factory.Factories.OfType<IWriterFactory>()
.FirstOrDefault(item => item.KnownArchiveType == archiveType);
@@ -102,6 +104,8 @@ public static class WriterFactory
CancellationToken cancellationToken = default
)
{
stream.RequireWritable();
var factory = Factories
.Factory.Factories.OfType<IWriterFactory>()
.FirstOrDefault(item => item.KnownArchiveType == archiveType);

View File

@@ -22,7 +22,7 @@ public partial class ZipWriter : IWriterOpenable<ZipWriterOptions>
public static IWriter OpenWriter(Stream stream, ZipWriterOptions writerOptions)
{
stream.NotNull(nameof(stream));
stream.RequireWritable();
return new ZipWriter(stream, writerOptions);
}

View File

@@ -0,0 +1,34 @@
using System;
using System.IO;
using System.Threading.Tasks;
using SharpCompress.Common;
using SharpCompress.Test.Mocks;
using SharpCompress.Writers;
using Xunit;
namespace SharpCompress.Test;
public class WriterFactoryTests
{
[Fact]
public void OpenWriter_Stream_Throws_On_Unwritable_Stream()
{
using var unwritable = new TestStream(new MemoryStream(), true, false, true);
Assert.Throws<ArgumentException>(() =>
WriterFactory.OpenWriter(unwritable, ArchiveType.Zip, WriterOptions.ForZip())
);
}
[Fact]
public async ValueTask OpenAsyncWriter_Stream_Throws_On_Unwritable_Stream()
{
using var unwritable = new TestStream(new MemoryStream(), true, false, true);
await Assert.ThrowsAsync<ArgumentException>(() =>
WriterFactory
.OpenAsyncWriter(unwritable, ArchiveType.Zip, WriterOptions.ForZip())
.AsTask()
);
}
}