Skip to content

Conversation

@ljluestc
Copy link

Implement body caching for form-urlencoded bindings so the request body can be read multiple times.

1. Cache-aware GetRawData()

Modified GetRawData in context.go to check for cached body bytes in the context (BodyBytesKey) before reading from the stream.

2. Body preservation in ShouldBindWith()

Modified ShouldBindWith in context.go to intercept form and form-urlencoded bindings:

  1. Read request body into memory.
  2. Cache body bytes in context (BodyBytesKey).
  3. Restore Request.Body with a fresh io.NopCloser buffer.
  4. Proceed with binding.

This ensures ParseForm works on the restored body, and GetRawData can retrieve the cached body.

3. Test Fixes

  • New Regression Test: Added TestContextGetRawDataAfterShouldBind to verify the fix.
  • Fixed TestRunEmpty: Updated this integration test to use a dynamic free port instead of hardcoded :8080, resolving local testing conflicts.

Testing

All tests pass:

$ go test ./...
ok      github.com/gin-gonic/gin                0.247s
ok      github.com/gin-gonic/gin/binding        (cached)
ok      github.com/gin-gonic/gin/render         (cached)

- Add Context.GetRequestBody() method that caches request body bytes
- Allows multiple reads of request body without consumption
- Integrates with existing ShouldBindBodyWith* caching mechanism
- Includes comprehensive tests and usage examples
- Addresses issue gin-gonic#1974: Wrap Request.Body for reuse by Gin, middlewares and app code
- Add 'Get Request Body' section to docs/doc.md
- Include usage examples and curl test commands
- Document the new API for reusable request body access
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant