7
7
"encoding/json"
8
8
"errors"
9
9
"fmt"
10
+ "mime/multipart"
10
11
"net/http/httptest"
11
12
"reflect"
12
13
"testing"
@@ -988,6 +989,48 @@ func Test_Bind_Body(t *testing.T) {
988
989
Data []Demo `query:"data"`
989
990
}
990
991
992
+ t .Run ("MultipartCollectionQueryDotNotation" , func (t * testing.T ) {
993
+ c := app .AcquireCtx (& fasthttp.RequestCtx {})
994
+ c .Request ().Reset ()
995
+
996
+ buf := & bytes.Buffer {}
997
+ writer := multipart .NewWriter (buf )
998
+ writer .WriteField ("data.0.name" , "john" )
999
+ writer .WriteField ("data.1.name" , "doe" )
1000
+ writer .Close ()
1001
+
1002
+ c .Request ().Header .SetContentType (writer .FormDataContentType ())
1003
+ c .Request ().SetBody (buf .Bytes ())
1004
+ c .Request ().Header .SetContentLength (len (c .Body ()))
1005
+
1006
+ cq := new (CollectionQuery )
1007
+ require .NoError (t , c .Bind ().Body (cq ))
1008
+ require .Len (t , cq .Data , 2 )
1009
+ require .Equal (t , "john" , cq .Data [0 ].Name )
1010
+ require .Equal (t , "doe" , cq .Data [1 ].Name )
1011
+ })
1012
+
1013
+ t .Run ("MultipartCollectionQuerySquareBrackets" , func (t * testing.T ) {
1014
+ c := app .AcquireCtx (& fasthttp.RequestCtx {})
1015
+ c .Request ().Reset ()
1016
+
1017
+ buf := & bytes.Buffer {}
1018
+ writer := multipart .NewWriter (buf )
1019
+ writer .WriteField ("data[0][name]" , "john" )
1020
+ writer .WriteField ("data[1][name]" , "doe" )
1021
+ writer .Close ()
1022
+
1023
+ c .Request ().Header .SetContentType (writer .FormDataContentType ())
1024
+ c .Request ().SetBody (buf .Bytes ())
1025
+ c .Request ().Header .SetContentLength (len (c .Body ()))
1026
+
1027
+ cq := new (CollectionQuery )
1028
+ require .NoError (t , c .Bind ().Body (cq ))
1029
+ require .Len (t , cq .Data , 2 )
1030
+ require .Equal (t , "john" , cq .Data [0 ].Name )
1031
+ require .Equal (t , "doe" , cq .Data [1 ].Name )
1032
+ })
1033
+
991
1034
t .Run ("CollectionQuerySquareBrackets" , func (t * testing.T ) {
992
1035
c := app .AcquireCtx (& fasthttp.RequestCtx {})
993
1036
c .Request ().Reset ()
@@ -1180,13 +1223,69 @@ func Benchmark_Bind_Body_MultipartForm(b *testing.B) {
1180
1223
app := New ()
1181
1224
c := app .AcquireCtx (& fasthttp.RequestCtx {})
1182
1225
1226
+ type Person struct {
1227
+ Name string `form:"name"`
1228
+ Age int `form:"age"`
1229
+ }
1230
+
1183
1231
type Demo struct {
1232
+ Name string `form:"name"`
1233
+ Persons []Person `form:"persons"`
1234
+ }
1235
+
1236
+ buf := & bytes.Buffer {}
1237
+ writer := multipart .NewWriter (buf )
1238
+ writer .WriteField ("name" , "john" )
1239
+
1240
+ writer .Close ()
1241
+ body := buf .Bytes ()
1242
+
1243
+ c .Request ().SetBody (body )
1244
+ c .Request ().Header .SetContentType (MIMEMultipartForm + `;boundary=` + writer .Boundary ())
1245
+ c .Request ().Header .SetContentLength (len (body ))
1246
+ d := new (Demo )
1247
+
1248
+ b .ReportAllocs ()
1249
+ b .ResetTimer ()
1250
+
1251
+ for n := 0 ; n < b .N ; n ++ {
1252
+ err = c .Bind ().Body (d )
1253
+ }
1254
+
1255
+ require .NoError (b , err )
1256
+ require .Equal (b , "john" , d .Name )
1257
+ }
1258
+
1259
+ // go test -v -run=^$ -bench=Benchmark_Bind_Body_MultipartForm_Nested -benchmem -count=4
1260
+ func Benchmark_Bind_Body_MultipartForm_Nested (b * testing.B ) {
1261
+ var err error
1262
+
1263
+ app := New ()
1264
+ c := app .AcquireCtx (& fasthttp.RequestCtx {})
1265
+
1266
+ type Person struct {
1184
1267
Name string `form:"name"`
1268
+ Age int `form:"age"`
1269
+ }
1270
+
1271
+ type Demo struct {
1272
+ Name string `form:"name"`
1273
+ Persons []Person `form:"persons"`
1185
1274
}
1186
1275
1187
- body := []byte ("--b\r \n Content-Disposition: form-data; name=\" name\" \r \n \r \n john\r \n --b--" )
1276
+ buf := & bytes.Buffer {}
1277
+ writer := multipart .NewWriter (buf )
1278
+ writer .WriteField ("name" , "john" )
1279
+ writer .WriteField ("persons.0.name" , "john" )
1280
+ writer .WriteField ("persons[0][age]" , "10" )
1281
+ writer .WriteField ("persons[1][name]" , "doe" )
1282
+ writer .WriteField ("persons.1.age" , "20" )
1283
+
1284
+ writer .Close ()
1285
+ body := buf .Bytes ()
1286
+
1188
1287
c .Request ().SetBody (body )
1189
- c .Request ().Header .SetContentType (MIMEMultipartForm + `;boundary="b"` )
1288
+ c .Request ().Header .SetContentType (MIMEMultipartForm + `;boundary=` + writer . Boundary () )
1190
1289
c .Request ().Header .SetContentLength (len (body ))
1191
1290
d := new (Demo )
1192
1291
@@ -1196,8 +1295,13 @@ func Benchmark_Bind_Body_MultipartForm(b *testing.B) {
1196
1295
for n := 0 ; n < b .N ; n ++ {
1197
1296
err = c .Bind ().Body (d )
1198
1297
}
1298
+
1199
1299
require .NoError (b , err )
1200
1300
require .Equal (b , "john" , d .Name )
1301
+ require .Equal (b , "john" , d .Persons [0 ].Name )
1302
+ require .Equal (b , 10 , d .Persons [0 ].Age )
1303
+ require .Equal (b , "doe" , d .Persons [1 ].Name )
1304
+ require .Equal (b , 20 , d .Persons [1 ].Age )
1201
1305
}
1202
1306
1203
1307
// go test -v -run=^$ -bench=Benchmark_Bind_Body_Form_Map -benchmem -count=4
0 commit comments