Browse Source

limit http compression

Luke Pulverenti 8 years ago
parent
commit
009e860f6f
1 changed files with 33 additions and 38 deletions
  1. 33 38
      Emby.Server.Implementations/HttpServer/HttpResultFactory.cs

+ 33 - 38
Emby.Server.Implementations/HttpServer/HttpResultFactory.cs

@@ -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, compressionStream);
-                    compressionStream.Dispose();
-
-                    var compressedBytes = ms.ToArray();
+                ContentTypes.Instance.SerializeToStream(request, dto, ms);
+                ms.Position = 0;
 
 
-                    var httpResult = new StreamWriter(compressedBytes, request.ResponseContentType, _logger);
+                var responseHeaders = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
 
 
-                    //httpResult.Headers["Content-Length"] = compressedBytes.Length.ToString(UsCulture);
-                    httpResult.Headers["Content-Encoding"] = compressionType;
-
-                    return httpResult;
-                }
+                return GetCompressedResult(ms, compressionType, responseHeaders, false, request.ResponseContentType).Result;
             }
             }
         }
         }
 
 
@@ -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);
-            responseHeaders["Content-Encoding"] = requestedCompressionType;
+                if (isHeadRequest)
+                {
+                    return GetHttpResult(new byte[] { }, contentType, true);
+                }
 
 
-            if (isHeadRequest)
-            {
-                return GetHttpResult(new byte[] { }, contentType, true);
+                return GetHttpResult(content, contentType, true, responseHeaders);
             }
             }
-
-            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())