|
|
@ -203,20 +203,12 @@ namespace Emby.Server.Implementations.HttpServer
|
|
|
|
// Do not use the memoryStreamFactory here, they don't place nice with compression
|
|
|
|
// Do not use the memoryStreamFactory here, they don't place nice with compression
|
|
|
|
using (var ms = new MemoryStream())
|
|
|
|
using (var ms = new MemoryStream())
|
|
|
|
{
|
|
|
|
{
|
|
|
|
using (var compressionStream = GetCompressionStream(ms, compressionType))
|
|
|
|
ContentTypes.Instance.SerializeToStream(request, dto, ms);
|
|
|
|
{
|
|
|
|
ms.Position = 0;
|
|
|
|
ContentTypes.Instance.SerializeToStream(request, dto, compressionStream);
|
|
|
|
|
|
|
|
compressionStream.Dispose();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var compressedBytes = ms.ToArray();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var httpResult = new StreamWriter(compressedBytes, request.ResponseContentType, _logger);
|
|
|
|
var responseHeaders = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
|
|
|
|
|
|
|
|
|
|
|
|
//httpResult.Headers["Content-Length"] = compressedBytes.Length.ToString(UsCulture);
|
|
|
|
return GetCompressedResult(ms, compressionType, responseHeaders, false, request.ResponseContentType).Result;
|
|
|
|
httpResult.Headers["Content-Encoding"] = compressionType;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return httpResult;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -591,45 +583,53 @@ namespace Emby.Server.Implementations.HttpServer
|
|
|
|
};
|
|
|
|
};
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
string content;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
using (var stream = await factoryFn().ConfigureAwait(false))
|
|
|
|
using (var stream = await factoryFn().ConfigureAwait(false))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
using (var reader = new StreamReader(stream))
|
|
|
|
return await GetCompressedResult(stream, requestedCompressionType, responseHeaders, isHeadRequest, contentType).ConfigureAwait(false);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private async Task<IHasHeaders> GetCompressedResult(Stream stream,
|
|
|
|
|
|
|
|
string requestedCompressionType,
|
|
|
|
|
|
|
|
IDictionary<string,string> responseHeaders,
|
|
|
|
|
|
|
|
bool isHeadRequest,
|
|
|
|
|
|
|
|
string contentType)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
using (var reader = new MemoryStream())
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
await stream.CopyToAsync(reader).ConfigureAwait(false);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
reader.Position = 0;
|
|
|
|
|
|
|
|
var content = reader.ToArray();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (content.Length >= 1024)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
content = await reader.ReadToEndAsync().ConfigureAwait(false);
|
|
|
|
content = Compress(content, requestedCompressionType);
|
|
|
|
|
|
|
|
responseHeaders["Content-Encoding"] = requestedCompressionType;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var contents = Compress(content, requestedCompressionType);
|
|
|
|
responseHeaders["Content-Length"] = content.Length.ToString(UsCulture);
|
|
|
|
|
|
|
|
|
|
|
|
responseHeaders["Content-Length"] = contents.Length.ToString(UsCulture);
|
|
|
|
if (isHeadRequest)
|
|
|
|
responseHeaders["Content-Encoding"] = requestedCompressionType;
|
|
|
|
{
|
|
|
|
|
|
|
|
return GetHttpResult(new byte[] { }, contentType, true);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (isHeadRequest)
|
|
|
|
return GetHttpResult(content, contentType, true, responseHeaders);
|
|
|
|
{
|
|
|
|
|
|
|
|
return GetHttpResult(new byte[] { }, contentType, true);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return GetHttpResult(contents, contentType, true, responseHeaders);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private byte[] Compress(string text, string compressionType)
|
|
|
|
private byte[] Compress(byte[] bytes, string compressionType)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (compressionType == "deflate")
|
|
|
|
if (compressionType == "deflate")
|
|
|
|
return Deflate(text);
|
|
|
|
return Deflate(bytes);
|
|
|
|
|
|
|
|
|
|
|
|
if (compressionType == "gzip")
|
|
|
|
if (compressionType == "gzip")
|
|
|
|
return GZip(text);
|
|
|
|
return GZip(bytes);
|
|
|
|
|
|
|
|
|
|
|
|
throw new NotSupportedException(compressionType);
|
|
|
|
throw new NotSupportedException(compressionType);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private byte[] Deflate(string text)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
return Deflate(Encoding.UTF8.GetBytes(text));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private byte[] Deflate(byte[] bytes)
|
|
|
|
private byte[] Deflate(byte[] bytes)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
// In .NET FX incompat-ville, you can't access compressed bytes without closing DeflateStream
|
|
|
|
// In .NET FX incompat-ville, you can't access compressed bytes without closing DeflateStream
|
|
|
@ -644,11 +644,6 @@ namespace Emby.Server.Implementations.HttpServer
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private byte[] GZip(string text)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
return GZip(Encoding.UTF8.GetBytes(text));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private byte[] GZip(byte[] buffer)
|
|
|
|
private byte[] GZip(byte[] buffer)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
using (var ms = new MemoryStream())
|
|
|
|
using (var ms = new MemoryStream())
|
|
|
|