You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

65 lines
1.8 KiB

  1. package middleware
  2. import (
  3. "bytes"
  4. "compress/gzip"
  5. "io"
  6. "net/http"
  7. "net/http/httptest"
  8. "testing"
  9. "github.com/andybalholm/brotli"
  10. "github.com/gin-gonic/gin"
  11. "github.com/stretchr/testify/require"
  12. )
  13. func TestDecompressRequestMiddlewareExposesGzipAndBrotliPayload(t *testing.T) {
  14. gin.SetMode(gin.TestMode)
  15. for _, encoding := range []string{"gzip", "br"} {
  16. t.Run(encoding, func(t *testing.T) {
  17. var compressed bytes.Buffer
  18. var writer io.WriteCloser
  19. if encoding == "gzip" {
  20. writer = gzip.NewWriter(&compressed)
  21. } else {
  22. writer = brotli.NewWriter(&compressed)
  23. }
  24. _, err := writer.Write([]byte(`{"message":"hello"}`))
  25. require.NoError(t, err)
  26. require.NoError(t, writer.Close())
  27. router := gin.New()
  28. router.Use(DecompressRequestMiddleware())
  29. router.POST("/", func(c *gin.Context) {
  30. body, err := io.ReadAll(c.Request.Body)
  31. require.NoError(t, err)
  32. require.Equal(t, `{"message":"hello"}`, string(body))
  33. require.Empty(t, c.GetHeader("Content-Encoding"))
  34. c.Status(http.StatusNoContent)
  35. })
  36. request := httptest.NewRequest(http.MethodPost, "/", &compressed)
  37. request.Header.Set("Content-Encoding", encoding)
  38. response := httptest.NewRecorder()
  39. router.ServeHTTP(response, request)
  40. require.Equal(t, http.StatusNoContent, response.Code)
  41. })
  42. }
  43. }
  44. func TestDecompressRequestMiddlewareRejectsMalformedGzip(t *testing.T) {
  45. gin.SetMode(gin.TestMode)
  46. reachedHandler := false
  47. router := gin.New()
  48. router.Use(DecompressRequestMiddleware())
  49. router.POST("/", func(c *gin.Context) { reachedHandler = true })
  50. request := httptest.NewRequest(http.MethodPost, "/", bytes.NewBufferString("not-gzip"))
  51. request.Header.Set("Content-Encoding", "gzip")
  52. response := httptest.NewRecorder()
  53. router.ServeHTTP(response, request)
  54. require.Equal(t, http.StatusBadRequest, response.Code)
  55. require.False(t, reachedHandler)
  56. }