|
- 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)
- }
|