Skip to content

Commit 77200a2

Browse files
committed
Use ZLibStream as the deflate impl in net6+
1 parent 62559e4 commit 77200a2

File tree

1 file changed

+45
-2
lines changed

1 file changed

+45
-2
lines changed

src/ServiceStack.Client/StreamCompressors.cs

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,10 @@ public static class StreamCompressors
1616
{
1717
#if NET6_0_OR_GREATER
1818
{ "br", BrotliCompressor.Instance }, //CompressionTypes.Brotli
19-
#endif
19+
{ CompressionTypes.Deflate, ZLibCompressor.Instance },
20+
#else
2021
{ CompressionTypes.Deflate, DeflateCompressor.Instance },
22+
#endif
2123
{ CompressionTypes.GZip, GZipCompressor.Instance },
2224
};
2325

@@ -93,8 +95,49 @@ public byte[] DecompressBytes(byte[] zipBuffer)
9395
return zipStream.ReadFully();
9496
}
9597
}
96-
#endif
9798

99+
public class ZLibCompressor : IStreamCompressor
100+
{
101+
public string Encoding => CompressionTypes.Deflate;
102+
public static ZLibCompressor Instance { get; } = new();
103+
104+
public byte[] Compress(string text, Encoding? encoding = null) => Compress((encoding ?? System.Text.Encoding.UTF8).GetBytes(text));
105+
106+
public byte[] Compress(byte[] bytes)
107+
{
108+
// In .NET FX incompatible, you can't access compressed bytes without closing DeflateStream
109+
// Which means we must use MemoryStream since you have to use ToArray() on a closed Stream
110+
using var ms = new MemoryStream();
111+
using var zipStream = new ZLibStream(ms, CompressionMode.Compress);
112+
zipStream.Write(bytes, 0, bytes.Length);
113+
zipStream.Close();
114+
115+
return ms.ToArray();
116+
}
117+
118+
public Stream Compress(Stream outputStream, bool leaveOpen=false) =>
119+
new ZLibStream(outputStream, CompressionMode.Compress, leaveOpen);
120+
121+
public string Decompress(byte[] zipBuffer, Encoding? encoding = null)
122+
{
123+
using var uncompressedStream = MemoryStreamFactory.GetStream();
124+
using var compressedStream = MemoryStreamFactory.GetStream(zipBuffer);
125+
using var zipStream = new ZLibStream(compressedStream, CompressionMode.Decompress);
126+
zipStream.CopyTo(uncompressedStream);
127+
return uncompressedStream.ReadToEnd(encoding ?? System.Text.Encoding.UTF8);
128+
}
129+
130+
public Stream Decompress(Stream zipBuffer, bool leaveOpen=false) =>
131+
new DeflateStream(zipBuffer, CompressionMode.Decompress, leaveOpen);
132+
133+
public byte[] DecompressBytes(byte[] zipBuffer)
134+
{
135+
using var compressedStream = zipBuffer.InMemoryStream();
136+
using var zipStream = new ZLibStream(compressedStream, CompressionMode.Decompress);
137+
return zipStream.ReadFully();
138+
}
139+
}
140+
#endif
98141

99142
public class DeflateCompressor : IStreamCompressor
100143
{

0 commit comments

Comments
 (0)