Skip to content

Commit

Permalink
Merge pull request labstack#200 from tylerb/master
Browse files Browse the repository at this point in the history
Add sync.Pool to gzip middleware
vishr committed Sep 13, 2015

Unverified

This commit is not signed, but one or more authors requires that any commit attributed to them is signed.
2 parents dce83db + 1d04096 commit f27440f
Showing 2 changed files with 36 additions and 2 deletions.
16 changes: 14 additions & 2 deletions middleware/compress.go
Original file line number Diff line number Diff line change
@@ -4,9 +4,11 @@ import (
"bufio"
"compress/gzip"
"io"
"io/ioutil"
"net"
"net/http"
"strings"
"sync"

"github.com/labstack/echo"
)
@@ -37,6 +39,12 @@ func (w *gzipWriter) CloseNotify() <-chan bool {
return w.ResponseWriter.(http.CloseNotifier).CloseNotify()
}

var writerPool = sync.Pool{
New: func() interface{} {
return gzip.NewWriter(ioutil.Discard)
},
}

// Gzip returns a middleware which compresses HTTP response using gzip compression
// scheme.
func Gzip() echo.MiddlewareFunc {
@@ -46,8 +54,12 @@ func Gzip() echo.MiddlewareFunc {
return func(c *echo.Context) error {
c.Response().Header().Add(echo.Vary, echo.AcceptEncoding)
if strings.Contains(c.Request().Header.Get(echo.AcceptEncoding), scheme) {
w := gzip.NewWriter(c.Response().Writer())
defer w.Close()
w := writerPool.Get().(*gzip.Writer)
w.Reset(c.Response().Writer())
defer func() {
w.Close()
writerPool.Put(w)
}()
gw := gzipWriter{Writer: w, ResponseWriter: c.Response().Writer()}
c.Response().Header().Set(echo.ContentEncoding, scheme)
c.Response().SetWriter(gw)
22 changes: 22 additions & 0 deletions middleware/compress_test.go
Original file line number Diff line number Diff line change
@@ -119,3 +119,25 @@ func TestGzipCloseNotify(t *testing.T) {

assert.Equal(t, closed, true)
}

func BenchmarkGzip(b *testing.B) {

b.StopTimer()
b.ReportAllocs()

h := func(c *echo.Context) error {
c.Response().Write([]byte("test")) // For Content-Type sniffing
return nil
}
req, _ := http.NewRequest(echo.GET, "/", nil)
req.Header.Set(echo.AcceptEncoding, "gzip")

b.StartTimer()

for i := 0; i < b.N; i++ {
rec := httptest.NewRecorder()
c := echo.NewContext(req, echo.NewResponse(rec), echo.New())
Gzip()(h)(c)
}

}

0 comments on commit f27440f

Please sign in to comment.