@@ -22,6 +22,8 @@ import (
22
22
"fmt"
23
23
"io"
24
24
"net/http"
25
+ "os"
26
+ "path/filepath"
25
27
"strconv"
26
28
"strings"
27
29
"time"
@@ -206,10 +208,11 @@ func (r *simpleTestCaseRunner) RunTestCase(testcase *testing.TestCase, dataConte
206
208
207
209
respType := util .GetFirstHeaderValue (resp .Header , util .ContentType )
208
210
211
+ r .withSimpleResponseRecord (resp )
209
212
if isNonBinaryContent (respType ) {
210
213
var responseBodyData []byte
211
214
var rErr error
212
- if responseBodyData , rErr = r .withResponseRecord (resp ); rErr != nil {
215
+ if responseBodyData , rErr = r .withResponseBodyRecord (resp ); rErr != nil {
213
216
err = errors .Join (err , rErr )
214
217
return
215
218
}
@@ -224,13 +227,49 @@ func (r *simpleTestCaseRunner) RunTestCase(testcase *testing.TestCase, dataConte
224
227
225
228
err = errors .Join (err , jsonSchemaValidation (testcase .Expect .Schema , responseBodyData ))
226
229
} else {
230
+ switch respType {
231
+ case util .OctetStream , util .Image :
232
+ var data []byte
233
+ if data , err = io .ReadAll (resp .Body ); err == nil {
234
+ r .simpleResponse .RawBody = data
235
+ r .simpleResponse , err = HandleLargeResponseBody (r .simpleResponse , testcase .Group , testcase .Name )
236
+ }
237
+ }
227
238
r .log .Debug ("skip to read the body due to it is not struct content: %q\n " , respType )
228
239
}
229
240
230
241
r .cookies = append (r .cookies , resp .Cookies ()... )
231
242
return
232
243
}
233
244
245
+ func HandleLargeResponseBody (resp SimpleResponse , suite string , caseName string ) (SimpleResponse , error ) {
246
+ const maxSize = 5120
247
+ prefix := "isFilePath-" + strings .Join ([]string {suite , caseName }, "-" )
248
+ if len (resp .Body ) > 0 {
249
+ resp .RawBody = []byte (resp .Body )
250
+ }
251
+
252
+ if len (resp .RawBody ) > maxSize {
253
+ fmt .Println ("response body is too large, will be saved to file" , "size" , len (resp .RawBody ))
254
+ tmpFile , err := os .CreateTemp ("" , prefix + "-" )
255
+ defer tmpFile .Close ()
256
+ if err != nil {
257
+ return resp , fmt .Errorf ("failed to create file: %w" , err )
258
+ }
259
+
260
+ if _ , err = tmpFile .Write (resp .RawBody ); err != nil {
261
+ return resp , fmt .Errorf ("failed to write response body to file: %w" , err )
262
+ }
263
+ absFilePath , err := filepath .Abs (tmpFile .Name ())
264
+ if err != nil {
265
+ return resp , fmt .Errorf ("failed to get absolute file path: %w" , err )
266
+ }
267
+ resp .Body = filepath .Base (absFilePath )
268
+ return resp , nil
269
+ }
270
+ return resp , nil
271
+ }
272
+
234
273
func ammendHeaders (headers http.Header , body []byte ) {
235
274
// add content-length if it's missing
236
275
if val := headers .Get (util .ContentLength ); val == "" {
@@ -300,19 +339,23 @@ func generateRandomValue(param spec.Parameter) interface{} {
300
339
}
301
340
}
302
341
303
- func (r * simpleTestCaseRunner ) withResponseRecord (resp * http.Response ) (responseBodyData []byte , err error ) {
304
- responseBodyData , err = io .ReadAll (resp .Body )
342
+ func (r * simpleTestCaseRunner ) withSimpleResponseRecord (resp * http.Response ) {
305
343
r .simpleResponse = SimpleResponse {
306
344
StatusCode : resp .StatusCode ,
307
345
Header : make (map [string ]string ),
308
- Body : string (responseBodyData ),
309
346
}
310
347
311
- // add some headers for convienience
312
- ammendHeaders (resp .Header , responseBodyData )
313
348
for key := range resp .Header {
314
349
r .simpleResponse .Header [key ] = resp .Header .Get (key )
315
350
}
351
+ }
352
+
353
+ func (r * simpleTestCaseRunner ) withResponseBodyRecord (resp * http.Response ) (responseBodyData []byte , err error ) {
354
+ responseBodyData , err = io .ReadAll (resp .Body )
355
+ r .simpleResponse .Body = string (responseBodyData )
356
+
357
+ // add some headers for convenience
358
+ ammendHeaders (resp .Header , responseBodyData )
316
359
return
317
360
}
318
361
0 commit comments