fix: bug on form data with slices (#4040)

This commit is contained in:
Kevin Wan 2024-04-04 20:28:54 +08:00 committed by GitHub
parent f138cc792e
commit 64d430d424
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 33 additions and 27 deletions

View File

@ -15,25 +15,37 @@ import (
)
func TestParseForm(t *testing.T) {
var v struct {
Name string `form:"name"`
Age int `form:"age"`
Percent float64 `form:"percent,optional"`
Statuses []string `form:"statuses,optional"`
NoValue string `form:"noValue,optional"`
}
t.Run("slice", func(t *testing.T) {
var v struct {
Name string `form:"name"`
Age int `form:"age"`
Percent float64 `form:"percent,optional"`
}
r, err := http.NewRequest(
http.MethodGet,
"/a?name=hello&age=18&percent=3.4&statuses=try&statuses=done",
http.NoBody)
assert.Nil(t, err)
assert.Nil(t, Parse(r, &v))
assert.Equal(t, "hello", v.Name)
assert.Equal(t, 18, v.Age)
assert.Equal(t, 3.4, v.Percent)
assert.EqualValues(t, []string{"try", "done"}, v.Statuses)
assert.Equal(t, 0, len(v.NoValue))
r, err := http.NewRequest(
http.MethodGet,
"/a?name=hello&age=18&percent=3.4",
http.NoBody)
assert.Nil(t, err)
assert.Nil(t, Parse(r, &v))
assert.Equal(t, "hello", v.Name)
assert.Equal(t, 18, v.Age)
assert.Equal(t, 3.4, v.Percent)
})
t.Run("no value", func(t *testing.T) {
var v struct {
NoValue string `form:"noValue,optional"`
}
r, err := http.NewRequest(
http.MethodGet,
"/a?name=hello&age=18&percent=3.4&statuses=try&statuses=done&singleValue=one",
http.NoBody)
assert.Nil(t, err)
assert.Nil(t, Parse(r, &v))
assert.Equal(t, 0, len(v.NoValue))
})
}
func TestParseForm_Error(t *testing.T) {

View File

@ -21,15 +21,9 @@ func GetFormValues(r *http.Request) (map[string]any, error) {
params := make(map[string]any, len(r.Form))
for name := range r.Form {
switch len(r.Form[name]) {
case 1:
formValue := r.Form.Get(name)
if len(formValue) > 0 {
params[name] = formValue
}
default:
// len(r.Form[name]) > 1, never be 0
params[name] = r.Form[name]
formValue := r.Form.Get(name)
if len(formValue) > 0 {
params[name] = formValue
}
}