package middleware import ( "bytes" "compress/gzip" "io" "net/http" "net/http/httptest" "testing" "github.com/andybalholm/brotli" "github.com/gin-gonic/gin" "github.com/stretchr/testify/require" ) func TestDecompressRequestMiddlewareExposesGzipAndBrotliPayload(t *testing.T) { gin.SetMode(gin.TestMode) for _, encoding := range []string{"gzip", "br"} { t.Run(encoding, func(t *testing.T) { var compressed bytes.Buffer var writer io.WriteCloser if encoding == "gzip" { writer = gzip.NewWriter(&compressed) } else { writer = brotli.NewWriter(&compressed) } _, err := writer.Write([]byte(`{"message":"hello"}`)) require.NoError(t, err) require.NoError(t, writer.Close()) router := gin.New() router.Use(DecompressRequestMiddleware()) router.POST("/", func(c *gin.Context) { body, err := io.ReadAll(c.Request.Body) require.NoError(t, err) require.Equal(t, `{"message":"hello"}`, string(body)) require.Empty(t, c.GetHeader("Content-Encoding")) c.Status(http.StatusNoContent) }) request := httptest.NewRequest(http.MethodPost, "/", &compressed) request.Header.Set("Content-Encoding", encoding) response := httptest.NewRecorder() router.ServeHTTP(response, request) require.Equal(t, http.StatusNoContent, response.Code) }) } } func TestDecompressRequestMiddlewareRejectsMalformedGzip(t *testing.T) { gin.SetMode(gin.TestMode) reachedHandler := false router := gin.New() router.Use(DecompressRequestMiddleware()) router.POST("/", func(c *gin.Context) { reachedHandler = true }) request := httptest.NewRequest(http.MethodPost, "/", bytes.NewBufferString("not-gzip")) request.Header.Set("Content-Encoding", "gzip") response := httptest.NewRecorder() router.ServeHTTP(response, request) require.Equal(t, http.StatusBadRequest, response.Code) require.False(t, reachedHandler) }