@@ -406,28 +406,30 @@ func (c *Ctx) BodyParser(out interface{}) error {
406406 k := c .app .getString (key )
407407 v := c .app .getString (val )
408408
409- if strings .Contains (k , "[" ) {
410- k , err = parseParamSquareBrackets (k )
411- }
412-
413- if c .app .config .EnableSplittingOnParsers && strings .Contains (v , "," ) && equalFieldType (out , reflect .Slice , k , bodyTag ) {
414- values := strings .Split (v , "," )
415- for i := 0 ; i < len (values ); i ++ {
416- data [k ] = append (data [k ], values [i ])
417- }
418- } else {
419- data [k ] = append (data [k ], v )
420- }
409+ err = formatParserData (out , data , bodyTag , k , v , c .app .config .EnableSplittingOnParsers , true )
421410 })
422411
412+ if err != nil {
413+ return err
414+ }
415+
423416 return c .parseToStruct (bodyTag , out , data )
424417 }
425418 if strings .HasPrefix (ctype , MIMEMultipartForm ) {
426- data , err := c .fasthttp .MultipartForm ()
419+ multipartForm , err := c .fasthttp .MultipartForm ()
427420 if err != nil {
428421 return err
429422 }
430- return c .parseToStruct (bodyTag , out , data .Value )
423+
424+ data := make (map [string ][]string )
425+ for key , values := range multipartForm .Value {
426+ err = formatParserData (out , data , bodyTag , key , values , c .app .config .EnableSplittingOnParsers , true )
427+ if err != nil {
428+ return err
429+ }
430+ }
431+
432+ return c .parseToStruct (bodyTag , out , data )
431433 }
432434 if strings .HasPrefix (ctype , MIMETextXML ) || strings .HasPrefix (ctype , MIMEApplicationXML ) {
433435 if err := xml .Unmarshal (c .Body (), out ); err != nil {
@@ -531,18 +533,7 @@ func (c *Ctx) CookieParser(out interface{}) error {
531533 k := c .app .getString (key )
532534 v := c .app .getString (val )
533535
534- if strings .Contains (k , "[" ) {
535- k , err = parseParamSquareBrackets (k )
536- }
537-
538- if c .app .config .EnableSplittingOnParsers && strings .Contains (v , "," ) && equalFieldType (out , reflect .Slice , k , cookieTag ) {
539- values := strings .Split (v , "," )
540- for i := 0 ; i < len (values ); i ++ {
541- data [k ] = append (data [k ], values [i ])
542- }
543- } else {
544- data [k ] = append (data [k ], v )
545- }
536+ err = formatParserData (out , data , cookieTag , k , v , c .app .config .EnableSplittingOnParsers , true )
546537 })
547538 if err != nil {
548539 return err
@@ -1283,18 +1274,7 @@ func (c *Ctx) QueryParser(out interface{}) error {
12831274 k := c .app .getString (key )
12841275 v := c .app .getString (val )
12851276
1286- if strings .Contains (k , "[" ) {
1287- k , err = parseParamSquareBrackets (k )
1288- }
1289-
1290- if c .app .config .EnableSplittingOnParsers && strings .Contains (v , "," ) && equalFieldType (out , reflect .Slice , k , queryTag ) {
1291- values := strings .Split (v , "," )
1292- for i := 0 ; i < len (values ); i ++ {
1293- data [k ] = append (data [k ], values [i ])
1294- }
1295- } else {
1296- data [k ] = append (data [k ], v )
1297- }
1277+ err = formatParserData (out , data , queryTag , k , v , c .app .config .EnableSplittingOnParsers , true )
12981278 })
12991279
13001280 if err != nil {
@@ -1342,6 +1322,40 @@ func parseParamSquareBrackets(k string) (string, error) {
13421322 return bb .String (), nil
13431323}
13441324
1325+ func formatParserData (out interface {}, data map [string ][]string , aliasTag , key string , value interface {}, enableSplitting , supportBracketNotation bool ) error { //nolint:revive // it's okay
1326+ var err error
1327+ if supportBracketNotation && strings .Contains (key , "[" ) {
1328+ key , err = parseParamSquareBrackets (key )
1329+ if err != nil {
1330+ return err
1331+ }
1332+ }
1333+
1334+ switch v := value .(type ) {
1335+ case string :
1336+ assignBindData (out , data , aliasTag , key , v , enableSplitting )
1337+ case []string :
1338+ for _ , val := range v {
1339+ assignBindData (out , data , aliasTag , key , val , enableSplitting )
1340+ }
1341+ default :
1342+ return fmt .Errorf ("unsupported value type: %T" , value )
1343+ }
1344+
1345+ return err
1346+ }
1347+
1348+ func assignBindData (out interface {}, data map [string ][]string , aliasTag , key , value string , enableSplitting bool ) { //nolint:revive // it's okay
1349+ if enableSplitting && strings .Contains (value , "," ) && equalFieldType (out , reflect .Slice , key , aliasTag ) {
1350+ values := strings .Split (value , "," )
1351+ for i := 0 ; i < len (values ); i ++ {
1352+ data [key ] = append (data [key ], values [i ])
1353+ }
1354+ } else {
1355+ data [key ] = append (data [key ], value )
1356+ }
1357+ }
1358+
13451359// ReqHeaderParser binds the request header strings to a struct.
13461360func (c * Ctx ) ReqHeaderParser (out interface {}) error {
13471361 data := make (map [string ][]string )
0 commit comments