From 125e69da6d99f6f8a9d3eb8e06e0ab063b1e4a92 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Wed, 30 Jul 2014 21:41:35 -0700 Subject: [PATCH] Log error if gzip fails during response --- .../Extensions/Pipelines/GZipPipeline.cs | 60 ++++++++++++------- 1 file changed, 39 insertions(+), 21 deletions(-) diff --git a/src/NzbDrone.Api/Extensions/Pipelines/GZipPipeline.cs b/src/NzbDrone.Api/Extensions/Pipelines/GZipPipeline.cs index 6a2e93e84..29fb1a7de 100644 --- a/src/NzbDrone.Api/Extensions/Pipelines/GZipPipeline.cs +++ b/src/NzbDrone.Api/Extensions/Pipelines/GZipPipeline.cs @@ -1,13 +1,22 @@ -using System.IO; +using System; +using System.IO; using System.IO.Compression; using System.Linq; using Nancy; using Nancy.Bootstrapper; +using NLog; namespace NzbDrone.Api.Extensions.Pipelines { public class GzipCompressionPipeline : IRegisterNancyPipeline { + private readonly Logger _logger; + + public GzipCompressionPipeline(Logger logger) + { + _logger = logger; + } + public void Register(IPipelines pipelines) { pipelines.AfterRequest.AddItemToEndOfPipeline(c => CompressResponse(c.Request, c.Response)); @@ -15,34 +24,43 @@ namespace NzbDrone.Api.Extensions.Pipelines private Response CompressResponse(Request request, Response response) { - if (!response.ContentType.Contains("image") + try + { + if (!response.ContentType.Contains("image") && request.Headers.AcceptEncoding.Any(x => x.Contains("gzip")) && (!response.Headers.ContainsKey("Content-Encoding") || response.Headers["Content-Encoding"] != "gzip")) - { - var data = new MemoryStream(); - response.Contents.Invoke(data); - data.Position = 0; - if (data.Length < 1024) { - response.Contents = stream => + var data = new MemoryStream(); + response.Contents.Invoke(data); + data.Position = 0; + if (data.Length < 1024) { - data.CopyTo(stream); - stream.Flush(); - }; - } - else - { - response.Headers["Content-Encoding"] = "gzip"; - response.Contents = s => + response.Contents = stream => + { + data.CopyTo(stream); + stream.Flush(); + }; + } + else { - var gzip = new GZipStream(s, CompressionMode.Compress, true); - data.CopyTo(gzip); - gzip.Close(); - }; + response.Headers["Content-Encoding"] = "gzip"; + response.Contents = s => + { + var gzip = new GZipStream(s, CompressionMode.Compress, true); + data.CopyTo(gzip); + gzip.Close(); + }; + } } + + return response; } - return response; + catch (Exception ex) + { + _logger.ErrorException("Unable to gzip response", ex); + throw; + } } } } \ No newline at end of file