Merge cd9b91bb2ef67d3b409e8c2465c806a2d68f5178 into 9914178584e42458ff7d23891463a880f58c9d86

This commit is contained in:
SAURABH CHAUHAN 2026-01-10 04:57:05 +00:00 committed by GitHub
commit 6af3929e47
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 45 additions and 0 deletions

View File

@ -7,6 +7,7 @@ package binding
import (
"bytes"
"errors"
"fmt"
"io"
"net/http"
@ -50,7 +51,12 @@ func decodeJSON(r io.Reader, obj any) error {
decoder.DisallowUnknownFields()
}
if err := decoder.Decode(obj); err != nil {
if errors.Is(err, io.EOF) {
return fmt.Errorf("empty request body: %w", err)
}
return err
}
return validate(obj)
}

View File

@ -0,0 +1,39 @@
package binding_test
import (
"bytes"
"io"
"net/http"
"net/http/httptest"
"testing"
"github.com/gin-gonic/gin"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestJSONBindingEmptyBodyReturnsHelpfulError(t *testing.T) {
type Req struct {
Name string `json:"name" binding:"required"`
}
w := httptest.NewRecorder()
c, _ := gin.CreateTestContext(w)
req, err := http.NewRequest(http.MethodPost, "/", bytes.NewBuffer(nil))
require.NoError(t, err)
req.Header.Set("Content-Type", "application/json")
c.Request = req
var r Req
err = c.ShouldBindJSON(&r)
require.Error(t, err)
// Error message should be more descriptive than plain EOF,
// while still preserving io.EOF via wrapping.
assert.NotEqual(t, "EOF", err.Error())
assert.Contains(t, err.Error(), "empty request body")
assert.ErrorIs(t, err, io.EOF)
}