Skip to content

Commit

Permalink
Serialize directly into compression stream when making compressed result
Browse files Browse the repository at this point in the history
  • Loading branch information
BlakeRaymond-AI committed Oct 10, 2015
1 parent 41eaaeb commit 2ec3652
Show file tree
Hide file tree
Showing 5 changed files with 40 additions and 6 deletions.
4 changes: 4 additions & 0 deletions src/ServiceStack.Client/Support/NetDeflateProvider.cs
Expand Up @@ -34,6 +34,10 @@ public string Inflate(byte[] gzBuffer)
}
}

public Stream GetDeflateStream(Stream outputStream)
{
return new DeflateStream(outputStream, CompressionMode.Compress);
}
}
}
#endif
5 changes: 5 additions & 0 deletions src/ServiceStack.Client/Support/NetGZipProvider.cs
Expand Up @@ -32,6 +32,11 @@ public string GUnzip(byte[] gzBuffer)
return Encoding.UTF8.GetString(utf8Bytes, 0, utf8Bytes.Length);
}
}

public Stream GetGZipCompressionStream(Stream outputStream)
{
return new GZipStream(outputStream, CompressionMode.Compress);
}
}
}
#endif
4 changes: 4 additions & 0 deletions src/ServiceStack.Interfaces/Caching/IDeflateProvider.cs
@@ -1,9 +1,13 @@
using System.IO;

namespace ServiceStack.Caching
{
public interface IDeflateProvider
{
byte[] Deflate(string text);

string Inflate(byte[] gzBuffer);

Stream GetDeflateStream(Stream outputStream);
}
}
4 changes: 4 additions & 0 deletions src/ServiceStack.Interfaces/Caching/IGZipProvider.cs
@@ -1,9 +1,13 @@
using System.IO;

namespace ServiceStack.Caching
{
public interface IGZipProvider
{
byte[] GZip(string text);

string GUnzip(byte[] gzBuffer);

Stream GetGZipCompressionStream(Stream outputStream);
}
}
29 changes: 23 additions & 6 deletions src/ServiceStack/RequestExtensions.cs
@@ -1,4 +1,5 @@
using System;
using System.IO;
using ServiceStack.Caching;
using ServiceStack.Host;
using ServiceStack.Web;
Expand Down Expand Up @@ -49,16 +50,32 @@ public static object ToOptimizedResult<T>(this IRequest request, T dto)
{
request.Response.Dto = dto;

string serializedDto = HostContext.ContentTypes.SerializeToString(request, dto);
var compressionType = request.GetCompressionType();
if (compressionType == null)
return (object)serializedDto;
return (object)HostContext.ContentTypes.SerializeToString(request, dto);

byte[] compressedBytes = serializedDto.Compress(compressionType);
return new CompressedResult(compressedBytes, compressionType, request.ResponseContentType)
using (var ms = new MemoryStream())
using (var compressionStream = GetCompressionStream(ms, compressionType))
{
Status = request.Response.StatusCode
};
HostContext.ContentTypes.SerializeToStream(request, dto, compressionStream);
compressionStream.Close();

var compressedBytes = ms.ToArray();
return new CompressedResult(compressedBytes, compressionType, request.ResponseContentType)
{
Status = request.Response.StatusCode
};
}
}

private static Stream GetCompressionStream(Stream outputStream, string compressionType)
{
if (compressionType == CompressionTypes.Deflate)
return StreamExt.DeflateProvider.GetDeflateStream(outputStream);
if (compressionType == CompressionTypes.GZip)
return StreamExt.GZipProvider.GetGZipCompressionStream(outputStream);

throw new NotSupportedException(compressionType);
}

/// <summary>
Expand Down

0 comments on commit 2ec3652

Please sign in to comment.