diff --git a/binding/binding_test.go b/binding/binding_test.go index efe87669..395934f4 100644 --- a/binding/binding_test.go +++ b/binding/binding_test.go @@ -14,6 +14,7 @@ import ( "testing" "time" + "github.com/gin-gonic/gin/internal" "github.com/gin-gonic/gin/testdata/protoexample" "github.com/golang/protobuf/proto" "github.com/stretchr/testify/assert" @@ -645,6 +646,19 @@ func TestExistsFails(t *testing.T) { assert.Error(t, err) } +func testUriBinding(t *testing.T, method, path, badPath, body, badBody string) { + b := Uri + assert.Equal(t, "uri", b.Name()) + + type Tag struct { + Name string `uri:"name"` + } + var tag Tag + params := internal.Params{internal.Param{Key: "name", Value: "thinkerou"}} + assert.Nil(t, b.BindUri(params, &tag)) + assert.Equal(t, "thinkerou", tag.Name) +} + func testFormBinding(t *testing.T, method, path, badPath, body, badBody string) { b := Form assert.Equal(t, "form", b.Name()) diff --git a/binding/form_mapping.go b/binding/form_mapping.go index 7a695c5f..4c90a516 100644 --- a/binding/form_mapping.go +++ b/binding/form_mapping.go @@ -15,10 +15,19 @@ import ( ) func mapUri(ptr interface{}, ps internal.Params) error { - return nil + var m map[string][]string + m = make(map[string][]string) + for _, v := range ps { + m[v.Key] = []string{v.Value} + } + return mapFormByTag(ptr, m, "uri") } func mapForm(ptr interface{}, form map[string][]string) error { + return mapFormByTag(ptr, form, "form") +} + +func mapFormByTag(ptr interface{}, form map[string][]string, tag string) error { typ := reflect.TypeOf(ptr).Elem() val := reflect.ValueOf(ptr).Elem() for i := 0; i < typ.NumField(); i++ { @@ -29,7 +38,7 @@ func mapForm(ptr interface{}, form map[string][]string) error { } structFieldKind := structField.Kind() - inputFieldName := typeField.Tag.Get("form") + inputFieldName := typeField.Tag.Get(tag) inputFieldNameList := strings.Split(inputFieldName, ",") inputFieldName = inputFieldNameList[0] var defaultValue string