From b8b31526d7a61e3d43e9ae02aeed8a4ea6adf775 Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Mon, 6 Jun 2016 14:15:34 +0300 Subject: [PATCH] Do not compress already compressed response in CompressHandler --- server.go | 6 ++++++ server_test.go | 23 +++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/server.go b/server.go index 924dabd..2d8e859 100644 --- a/server.go +++ b/server.go @@ -330,6 +330,12 @@ func CompressHandler(h RequestHandler) RequestHandler { func CompressHandlerLevel(h RequestHandler, level int) RequestHandler { return func(ctx *RequestCtx) { h(ctx) + ce := ctx.Response.Header.PeekBytes(strContentEncoding) + if len(ce) > 0 { + // Do not compress responses with non-empty + // Content-Encoding. + return + } if ctx.Request.Header.HasAcceptEncodingBytes(strGzip) { ctx.Response.gzipBody(level) } else if ctx.Request.Header.HasAcceptEncodingBytes(strDeflate) { diff --git a/server_test.go b/server_test.go index 74ca344..caec00e 100644 --- a/server_test.go +++ b/server_test.go @@ -1145,6 +1145,29 @@ func TestCompressHandler(t *testing.T) { t.Fatalf("unexpected body %q. Expecting %q", body, expectedBody) } + // an attempt to compress already compressed response + ctx.Request.Reset() + ctx.Response.Reset() + ctx.Request.Header.Set("Accept-Encoding", "gzip, deflate, sdhc") + hh := CompressHandler(h) + hh(&ctx) + s = ctx.Response.String() + br = bufio.NewReader(bytes.NewBufferString(s)) + if err := resp.Read(br); err != nil { + t.Fatalf("unexpected error: %s", err) + } + ce = resp.Header.Peek("Content-Encoding") + if string(ce) != "gzip" { + t.Fatalf("unexpected Content-Encoding: %q. Expecting %q", ce, "gzip") + } + body, err = resp.BodyGunzip() + if err != nil { + t.Fatalf("unexpected error: %s", err) + } + if string(body) != expectedBody { + t.Fatalf("unexpected body %q. Expecting %q", body, expectedBody) + } + // verify deflate-compressed response ctx.Request.Reset() ctx.Response.Reset()