@@ -22,6 +22,8 @@ import (
2222 "fmt"
2323 "io"
2424 "net/http"
25+ "os"
26+ "path/filepath"
2527 "strconv"
2628 "strings"
2729 "time"
@@ -206,10 +208,11 @@ func (r *simpleTestCaseRunner) RunTestCase(testcase *testing.TestCase, dataConte
206208
207209 respType := util .GetFirstHeaderValue (resp .Header , util .ContentType )
208210
211+ r .withSimpleResponseRecord (resp )
209212 if isNonBinaryContent (respType ) {
210213 var responseBodyData []byte
211214 var rErr error
212- if responseBodyData , rErr = r .withResponseRecord (resp ); rErr != nil {
215+ if responseBodyData , rErr = r .withResponseBodyRecord (resp ); rErr != nil {
213216 err = errors .Join (err , rErr )
214217 return
215218 }
@@ -224,13 +227,49 @@ func (r *simpleTestCaseRunner) RunTestCase(testcase *testing.TestCase, dataConte
224227
225228 err = errors .Join (err , jsonSchemaValidation (testcase .Expect .Schema , responseBodyData ))
226229 } 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+ }
227238 r .log .Debug ("skip to read the body due to it is not struct content: %q\n " , respType )
228239 }
229240
230241 r .cookies = append (r .cookies , resp .Cookies ()... )
231242 return
232243}
233244
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+
234273func ammendHeaders (headers http.Header , body []byte ) {
235274 // add content-length if it's missing
236275 if val := headers .Get (util .ContentLength ); val == "" {
@@ -300,19 +339,23 @@ func generateRandomValue(param spec.Parameter) interface{} {
300339 }
301340}
302341
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 ) {
305343 r .simpleResponse = SimpleResponse {
306344 StatusCode : resp .StatusCode ,
307345 Header : make (map [string ]string ),
308- Body : string (responseBodyData ),
309346 }
310347
311- // add some headers for convienience
312- ammendHeaders (resp .Header , responseBodyData )
313348 for key := range resp .Header {
314349 r .simpleResponse .Header [key ] = resp .Header .Get (key )
315350 }
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 )
316359 return
317360}
318361
0 commit comments