diff --git a/go.mod b/go.mod index e618de5..a911d14 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/basecamp/thruster go 1.26 require ( - github.com/klauspost/compress v1.18.2 + github.com/klauspost/compress v1.18.4 github.com/stretchr/testify v1.8.4 golang.org/x/crypto v0.46.0 golang.org/x/net v0.48.0 diff --git a/go.sum b/go.sum index af9bfa8..53822fa 100644 --- a/go.sum +++ b/go.sum @@ -3,6 +3,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/klauspost/compress v1.18.2 h1:iiPHWW0YrcFgpBYhsA6D1+fqHssJscY/Tm/y2Uqnapk= github.com/klauspost/compress v1.18.2/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4= +github.com/klauspost/compress v1.18.4 h1:RPhnKRAQ4Fh8zU2FY/6ZFDwTVTxgJ/EMydqSTzE9a2c= +github.com/klauspost/compress v1.18.4/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= diff --git a/internal/compression_handler_test.go b/internal/compression_handler_test.go index 4717897..b7b3730 100644 --- a/internal/compression_handler_test.go +++ b/internal/compression_handler_test.go @@ -8,6 +8,7 @@ import ( "strings" "testing" + "github.com/klauspost/compress/zstd" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -21,7 +22,7 @@ func TestCompressionHandler(t *testing.T) { require.NoError(t, err) }) - t.Run("compresses responses", func(t *testing.T) { + t.Run("compresses responses with gzip", func(t *testing.T) { handler := NewCompressionHandler(0, false, upstream) req := httptest.NewRequest("GET", "/", nil) @@ -40,6 +41,37 @@ func TestCompressionHandler(t *testing.T) { assert.Equal(t, largeBody, string(body)) }) + t.Run("compresses responses with zstd", func(t *testing.T) { + handler := NewCompressionHandler(0, false, upstream) + + req := httptest.NewRequest("GET", "/", nil) + req.Header.Set("Accept-Encoding", "zstd") + rr := httptest.NewRecorder() + + handler.ServeHTTP(rr, req) + + assert.Equal(t, "zstd", rr.Header().Get("Content-Encoding")) + + reader, err := zstd.NewReader(rr.Body) + require.NoError(t, err) + defer reader.Close() + body, err := io.ReadAll(reader) + require.NoError(t, err) + assert.Equal(t, largeBody, string(body)) + }) + + t.Run("prefers zstd when client accepts both", func(t *testing.T) { + handler := NewCompressionHandler(0, false, upstream) + + req := httptest.NewRequest("GET", "/", nil) + req.Header.Set("Accept-Encoding", "gzip, zstd") + rr := httptest.NewRecorder() + + handler.ServeHTTP(rr, req) + + assert.Equal(t, "zstd", rr.Header().Get("Content-Encoding")) + }) + t.Run("applies jitter when configured", func(t *testing.T) { handler := NewCompressionHandler(32, false, upstream)