@@ -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 {
@@ -1304,61 +1284,26 @@ func (c *Ctx) QueryParser(out interface{}) error {
13041284 return c .parseToStruct (queryTag , out , data )
13051285}
13061286
1307- func parseParamSquareBrackets (k string ) (string , error ) {
1308- bb := bytebufferpool .Get ()
1309- defer bytebufferpool .Put (bb )
1310-
1311- kbytes := []byte (k )
1312- openBracketsCount := 0
1313-
1314- for i , b := range kbytes {
1315- if b == '[' {
1316- openBracketsCount ++
1317- if i + 1 < len (kbytes ) && kbytes [i + 1 ] != ']' {
1318- if err := bb .WriteByte ('.' ); err != nil {
1319- return "" , fmt .Errorf ("failed to write: %w" , err )
1320- }
1321- }
1322- continue
1323- }
1324-
1325- if b == ']' {
1326- openBracketsCount --
1327- if openBracketsCount < 0 {
1328- return "" , errors .New ("unmatched brackets" )
1329- }
1330- continue
1331- }
1332-
1333- if err := bb .WriteByte (b ); err != nil {
1334- return "" , fmt .Errorf ("failed to write: %w" , err )
1335- }
1336- }
1337-
1338- if openBracketsCount > 0 {
1339- return "" , errors .New ("unmatched brackets" )
1340- }
1341-
1342- return bb .String (), nil
1343- }
1344-
13451287// ReqHeaderParser binds the request header strings to a struct.
13461288func (c * Ctx ) ReqHeaderParser (out interface {}) error {
13471289 data := make (map [string ][]string )
1290+ var err error
1291+
13481292 c .fasthttp .Request .Header .VisitAll (func (key , val []byte ) {
1293+ if err != nil {
1294+ return
1295+ }
1296+
13491297 k := c .app .getString (key )
13501298 v := c .app .getString (val )
13511299
1352- if c .app .config .EnableSplittingOnParsers && strings .Contains (v , "," ) && equalFieldType (out , reflect .Slice , k , reqHeaderTag ) {
1353- values := strings .Split (v , "," )
1354- for i := 0 ; i < len (values ); i ++ {
1355- data [k ] = append (data [k ], values [i ])
1356- }
1357- } else {
1358- data [k ] = append (data [k ], v )
1359- }
1300+ err = formatParserData (out , data , reqHeaderTag , k , v , c .app .config .EnableSplittingOnParsers , false )
13601301 })
13611302
1303+ if err != nil {
1304+ return err
1305+ }
1306+
13621307 return c .parseToStruct (reqHeaderTag , out , data )
13631308}
13641309
0 commit comments