@@ -33,17 +33,27 @@ func HandleAPISuccessResponse(resp *http.Response, out interface{}, log logger.L
3333 return handleDeleteRequest (resp , log )
3434 }
3535
36- // Log headers and set up deferred body logging.
37- deferBodyLog := logResponseDetails (resp , log )
38- defer deferBodyLog () // Ensure body logging happens at the end of this function.
36+ // Read the response body into a buffer
37+ bodyBytes , err := io .ReadAll (resp .Body )
38+ if err != nil {
39+ log .Error ("Failed to read response body" , zap .Error (err ))
40+ return err
41+ }
42+
43+ // After reading, reset resp.Body so it can be read again.
44+ log .Debug ("HTTP Response Headers" , zap .Any ("Headers" , resp .Header ))
45+ log .Debug ("Raw HTTP Response" , zap .String ("Body" , string (bodyBytes )))
46+
47+ // Use the buffer to create a new io.Reader for unmarshalling
48+ bodyReader := bytes .NewReader (bodyBytes )
3949
4050 mimeType , _ := ParseContentTypeHeader (resp .Header .Get ("Content-Type" ))
4151 contentDisposition := resp .Header .Get ("Content-Disposition" )
4252
4353 if handler , ok := responseUnmarshallers [mimeType ]; ok {
44- return handler (resp . Body , out , log , mimeType )
54+ return handler (bodyReader , out , log , mimeType )
4555 } else if isBinaryData (mimeType , contentDisposition ) {
46- return handleBinaryData (resp . Body , log , out , mimeType , contentDisposition )
56+ return handleBinaryData (bodyReader , log , out , mimeType , contentDisposition )
4757 } else {
4858 errMsg := fmt .Sprintf ("unexpected MIME type: %s" , mimeType )
4959 log .Error ("Unmarshal error" , zap .String ("content type" , mimeType ), zap .Error (errors .New (errMsg )))
@@ -65,24 +75,6 @@ func handleDeleteRequest(resp *http.Response, log logger.Logger) error {
6575 return fmt .Errorf ("DELETE request failed, status code: %d" , resp .StatusCode )
6676}
6777
68- // logResponseDetails logs the raw response details and returns a deferred function to log the response body.
69- func logResponseDetails (resp * http.Response , log logger.Logger ) func () {
70- log .Debug ("HTTP Response Headers" , zap .Any ("Headers" , resp .Header ))
71-
72- // Returning a deferred function to log the body.
73- return func () {
74- bodyBytes , err := io .ReadAll (resp .Body )
75- if err != nil {
76- log .Error ("Error reading response body for logging" , zap .Error (err ))
77- return
78- }
79- log .Debug ("Raw HTTP Response" , zap .String ("Body" , string (bodyBytes )))
80-
81- // After logging, reset resp.Body so it can be read again.
82- resp .Body = io .NopCloser (bytes .NewBuffer (bodyBytes ))
83- }
84- }
85-
8678// unmarshalJSON unmarshals JSON content from an io.Reader into the provided output structure.
8779func unmarshalJSON (reader io.Reader , out interface {}, log logger.Logger , mimeType string ) error {
8880 decoder := json .NewDecoder (reader )
0 commit comments