From 713187fcbaa5e54ca831afdb69d9ed543a441ccf Mon Sep 17 00:00:00 2001 From: davidmdm Date: Wed, 3 Nov 2021 20:03:50 -0400 Subject: [PATCH] stream decompression instead of buffering --- middleware/decompress.go | 62 +++++++++++++++++++++++++--------------- 1 file changed, 39 insertions(+), 23 deletions(-) diff --git a/middleware/decompress.go b/middleware/decompress.go index c046359a2..b6dde7b81 100644 --- a/middleware/decompress.go +++ b/middleware/decompress.go @@ -86,35 +86,51 @@ func DecompressWithConfig(config DecompressConfig) echo.MiddlewareFunc { if config.Skipper(c) { return next(c) } - switch c.Request().Header.Get(echo.HeaderContentEncoding) { - case GZIPEncoding: - b := c.Request().Body - - i := pool.Get() - gr, ok := i.(*gzip.Reader) - if !ok { - return echo.NewHTTPError(http.StatusInternalServerError, i.(error).Error()) - } - if err := gr.Reset(b); err != nil { - pool.Put(gr) - if err == io.EOF { //ignore if body is empty - return next(c) - } - return err - } - var buf bytes.Buffer - io.Copy(&buf, gr) + if c.Request().Header.Get(echo.HeaderContentEncoding) != GZIPEncoding { + return next(c) + } - gr.Close() - pool.Put(gr) + b := c.Request().Body + + i := pool.Get() + gr, ok := i.(*gzip.Reader) + if !ok { + return echo.NewHTTPError(http.StatusInternalServerError, i.(error).Error()) + } - b.Close() // http.Request.Body is closed by the Server, but because we are replacing it, it must be closed here + if err := gr.Reset(b); err != nil { + pool.Put(gr) + if err == io.EOF { //ignore if body is empty + return next(c) + } + return err + } - r := ioutil.NopCloser(&buf) - c.Request().Body = r + c.Request().Body = readCloserCustom{ + gr, + func() error { + gr.Close() + b.Close() + pool.Put(gr) + return nil + }, } + return next(c) } + + } +} + +type readCloserCustom struct { + io.Reader + closeFunc func() error +} + +func (rc readCloserCustom) Close() error { + if rc.closeFunc == nil { + return nil } + return rc.closeFunc() }