From c946fe1cac58b584f154ccc99d7330de9bbeb9d3 Mon Sep 17 00:00:00 2001 From: Nao Yonashiro Date: Thu, 15 Jul 2021 00:18:58 +0900 Subject: [PATCH 1/4] Fixed a problem that returned wrong content-encoding when the gzip compressed content was empty --- middleware/compress.go | 6 ++++-- middleware/compress_test.go | 21 +++++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/middleware/compress.go b/middleware/compress.go index 6ae197453..101083d46 100644 --- a/middleware/compress.go +++ b/middleware/compress.go @@ -27,6 +27,7 @@ type ( gzipResponseWriter struct { io.Writer http.ResponseWriter + wroteHeader bool } ) @@ -78,8 +79,9 @@ func GzipWithConfig(config GzipConfig) echo.MiddlewareFunc { } rw := res.Writer w.Reset(rw) + grw := &gzipResponseWriter{Writer: w, ResponseWriter: rw} defer func() { - if res.Size == 0 { + if res.Size == 0 && !grw.wroteHeader { if res.Header().Get(echo.HeaderContentEncoding) == gzipScheme { res.Header().Del(echo.HeaderContentEncoding) } @@ -92,7 +94,6 @@ func GzipWithConfig(config GzipConfig) echo.MiddlewareFunc { w.Close() pool.Put(w) }() - grw := &gzipResponseWriter{Writer: w, ResponseWriter: rw} res.Writer = grw } return next(c) @@ -112,6 +113,7 @@ func (w *gzipResponseWriter) Write(b []byte) (int, error) { if w.Header().Get(echo.HeaderContentType) == "" { w.Header().Set(echo.HeaderContentType, http.DetectContentType(b)) } + w.wroteHeader = true return w.Writer.Write(b) } diff --git a/middleware/compress_test.go b/middleware/compress_test.go index d16ffca43..b62bffef5 100644 --- a/middleware/compress_test.go +++ b/middleware/compress_test.go @@ -106,6 +106,27 @@ func TestGzipNoContent(t *testing.T) { } } +func TestGzipEmpty(t *testing.T) { + e := echo.New() + req := httptest.NewRequest(http.MethodGet, "/", nil) + req.Header.Set(echo.HeaderAcceptEncoding, gzipScheme) + rec := httptest.NewRecorder() + c := e.NewContext(req, rec) + h := Gzip()(func(c echo.Context) error { + return c.String(http.StatusOK, "") + }) + if assert.NoError(t, h(c)) { + assert.Equal(t, gzipScheme, rec.Header().Get(echo.HeaderContentEncoding)) + assert.Equal(t, "text/plain; charset=UTF-8", rec.Header().Get(echo.HeaderContentType)) + r, err := gzip.NewReader(rec.Body) + if assert.NoError(t, err) { + var buf bytes.Buffer + buf.ReadFrom(r) + assert.Equal(t, "", buf.String()) + } + } +} + func TestGzipErrorReturned(t *testing.T) { e := echo.New() e.Use(Gzip()) From 62d09b43f7a1ae5e215892741fe30c716bc741b3 Mon Sep 17 00:00:00 2001 From: Nao Yonashiro Date: Sun, 5 Dec 2021 11:30:47 +0900 Subject: [PATCH 2/4] refactor: rename writeHeader to writeBody --- middleware/compress.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/middleware/compress.go b/middleware/compress.go index 101083d46..a750170da 100644 --- a/middleware/compress.go +++ b/middleware/compress.go @@ -27,7 +27,7 @@ type ( gzipResponseWriter struct { io.Writer http.ResponseWriter - wroteHeader bool + wroteBody bool } ) @@ -81,7 +81,7 @@ func GzipWithConfig(config GzipConfig) echo.MiddlewareFunc { w.Reset(rw) grw := &gzipResponseWriter{Writer: w, ResponseWriter: rw} defer func() { - if res.Size == 0 && !grw.wroteHeader { + if res.Size == 0 && !grw.wroteBody { if res.Header().Get(echo.HeaderContentEncoding) == gzipScheme { res.Header().Del(echo.HeaderContentEncoding) } @@ -113,7 +113,7 @@ func (w *gzipResponseWriter) Write(b []byte) (int, error) { if w.Header().Get(echo.HeaderContentType) == "" { w.Header().Set(echo.HeaderContentType, http.DetectContentType(b)) } - w.wroteHeader = true + w.wroteBody = true return w.Writer.Write(b) } From 354c9c25042f48795dd472f2f3212368cddf5609 Mon Sep 17 00:00:00 2001 From: Nao Yonashiro Date: Sun, 5 Dec 2021 11:57:03 +0900 Subject: [PATCH 3/4] refactor: remove unnecessary http.StatusNoContent check from WriteHeader --- middleware/compress.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/middleware/compress.go b/middleware/compress.go index a750170da..ea37a593d 100644 --- a/middleware/compress.go +++ b/middleware/compress.go @@ -102,9 +102,6 @@ func GzipWithConfig(config GzipConfig) echo.MiddlewareFunc { } func (w *gzipResponseWriter) WriteHeader(code int) { - if code == http.StatusNoContent { // Issue #489 - w.ResponseWriter.Header().Del(echo.HeaderContentEncoding) - } w.Header().Del(echo.HeaderContentLength) // Issue #444 w.ResponseWriter.WriteHeader(code) } From 73a266db071b10ee734479f679b0ded9973ed8e8 Mon Sep 17 00:00:00 2001 From: Nao Yonashiro Date: Sun, 5 Dec 2021 20:09:52 +0900 Subject: [PATCH 4/4] refactor: simplify the condition --- middleware/compress.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/middleware/compress.go b/middleware/compress.go index ea37a593d..ac6672e9d 100644 --- a/middleware/compress.go +++ b/middleware/compress.go @@ -81,7 +81,7 @@ func GzipWithConfig(config GzipConfig) echo.MiddlewareFunc { w.Reset(rw) grw := &gzipResponseWriter{Writer: w, ResponseWriter: rw} defer func() { - if res.Size == 0 && !grw.wroteBody { + if !grw.wroteBody { if res.Header().Get(echo.HeaderContentEncoding) == gzipScheme { res.Header().Del(echo.HeaderContentEncoding) }