diff --git a/binding/form_mapping.go b/binding/form_mapping.go index 7b84e2ea..3549a9bc 100644 --- a/binding/form_mapping.go +++ b/binding/form_mapping.go @@ -7,6 +7,7 @@ package binding import ( "errors" "fmt" + "net/textproto" "reflect" "strconv" "strings" @@ -106,6 +107,7 @@ func mapping(value reflect.Value, field reflect.StructField, setter setter, tag type setOptions struct { isDefaultExists bool + isHeader bool defaultValue string } @@ -127,6 +129,7 @@ func tryToSetValue(value reflect.Value, field reflect.StructField, setter setter } var opt string + setOpt.isHeader = tag == "header" for len(opts) > 0 { opt, opts = head(opts, ",") @@ -140,7 +143,17 @@ func tryToSetValue(value reflect.Value, field reflect.StructField, setter setter } func setByForm(value reflect.Value, field reflect.StructField, form map[string][]string, tagValue string, opt setOptions) (isSetted bool, err error) { - vs, ok := form[tagValue] + var ( + vs []string + ok bool + ) + + if opt.isHeader { + vs, ok = form[textproto.CanonicalMIMEHeaderKey(tagValue)] + } else { + vs, ok = form[tagValue] + } + if !ok && !opt.isDefaultExists { return false, nil } diff --git a/context_test.go b/context_test.go index a893ef25..439e8ee6 100644 --- a/context_test.go +++ b/context_test.go @@ -1443,15 +1443,18 @@ func TestContextBindHeader(t *testing.T) { c.Request, _ = http.NewRequest("POST", "/", nil) c.Request.Header.Add("rate", "8000") c.Request.Header.Add("domain", "music") + c.Request.Header.Add("limit", "1000") var testHeader struct { Rate int `header:"Rate"` Domain string `header:"Domain"` + Limit int `header:"limit"` } assert.NoError(t, c.BindHeader(&testHeader)) assert.Equal(t, 8000, testHeader.Rate) assert.Equal(t, "music", testHeader.Domain) + assert.Equal(t, 1000, testHeader.Limit) assert.Equal(t, 0, w.Body.Len()) } @@ -1569,15 +1572,18 @@ func TestContextShouldBindHeader(t *testing.T) { c.Request, _ = http.NewRequest("POST", "/", nil) c.Request.Header.Add("rate", "8000") c.Request.Header.Add("domain", "music") + c.Request.Header.Add("limit", "1000") var testHeader struct { Rate int `header:"Rate"` Domain string `header:"Domain"` + Limit int `header:"limit"` } assert.NoError(t, c.ShouldBindHeader(&testHeader)) assert.Equal(t, 8000, testHeader.Rate) assert.Equal(t, "music", testHeader.Domain) + assert.Equal(t, 1000, testHeader.Limit) assert.Equal(t, 0, w.Body.Len()) }