Skip to content

Commit

Permalink
Exclude GRPC from compress
Browse files Browse the repository at this point in the history
  • Loading branch information
ldez authored and traefiker committed Nov 10, 2017
1 parent 2f62ec3 commit 5c119fe
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 1 deletion.
8 changes: 7 additions & 1 deletion middlewares/compress.go
Expand Up @@ -3,6 +3,7 @@ package middlewares
import (
"compress/gzip"
"net/http"
"strings"

"github.com/NYTimes/gziphandler"
"github.com/containous/traefik/log"
Expand All @@ -13,7 +14,12 @@ type Compress struct{}

// ServerHTTP is a function used by Negroni
func (c *Compress) ServeHTTP(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
gzipHandler(next).ServeHTTP(rw, r)
contentType := r.Header.Get("Content-Type")
if strings.HasPrefix(contentType, "application/grpc") {
next.ServeHTTP(rw, r)
} else {
gzipHandler(next).ServeHTTP(rw, r)
}
}

func gzipHandler(h http.Handler) http.Handler {
Expand Down
21 changes: 21 additions & 0 deletions middlewares/compress_test.go
Expand Up @@ -16,6 +16,7 @@ import (
const (
acceptEncodingHeader = "Accept-Encoding"
contentEncodingHeader = "Content-Encoding"
contentTypeHeader = "Content-Type"
varyHeader = "Vary"
gzipValue = "gzip"
)
Expand Down Expand Up @@ -81,6 +82,26 @@ func TestShouldNotCompressWhenNoAcceptEncodingHeader(t *testing.T) {
assert.EqualValues(t, rw.Body.Bytes(), fakeBody)
}

func TestShouldNotCompressWhenGRPC(t *testing.T) {
handler := &Compress{}

req := testhelpers.MustNewRequest(http.MethodGet, "http://localhost", nil)
req.Header.Add(acceptEncodingHeader, gzipValue)
req.Header.Add(contentTypeHeader, "application/grpc")

baseBody := generateBytes(gziphandler.DefaultMinSize)
next := func(rw http.ResponseWriter, r *http.Request) {
rw.Write(baseBody)
}

rw := httptest.NewRecorder()
handler.ServeHTTP(rw, req, next)

assert.Empty(t, rw.Header().Get(acceptEncodingHeader))
assert.Empty(t, rw.Header().Get(contentEncodingHeader))
assert.EqualValues(t, rw.Body.Bytes(), baseBody)
}

func TestIntegrationShouldNotCompress(t *testing.T) {
fakeCompressedBody := generateBytes(100000)
comp := &Compress{}
Expand Down

0 comments on commit 5c119fe

Please sign in to comment.