@@ -33,17 +33,27 @@ func HandleAPISuccessResponse(resp *http.Response, out interface{}, log logger.L
33
33
return handleDeleteRequest (resp , log )
34
34
}
35
35
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 )
39
49
40
50
mimeType , _ := ParseContentTypeHeader (resp .Header .Get ("Content-Type" ))
41
51
contentDisposition := resp .Header .Get ("Content-Disposition" )
42
52
43
53
if handler , ok := responseUnmarshallers [mimeType ]; ok {
44
- return handler (resp . Body , out , log , mimeType )
54
+ return handler (bodyReader , out , log , mimeType )
45
55
} else if isBinaryData (mimeType , contentDisposition ) {
46
- return handleBinaryData (resp . Body , log , out , mimeType , contentDisposition )
56
+ return handleBinaryData (bodyReader , log , out , mimeType , contentDisposition )
47
57
} else {
48
58
errMsg := fmt .Sprintf ("unexpected MIME type: %s" , mimeType )
49
59
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 {
65
75
return fmt .Errorf ("DELETE request failed, status code: %d" , resp .StatusCode )
66
76
}
67
77
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
-
86
78
// unmarshalJSON unmarshals JSON content from an io.Reader into the provided output structure.
87
79
func unmarshalJSON (reader io.Reader , out interface {}, log logger.Logger , mimeType string ) error {
88
80
decoder := json .NewDecoder (reader )
0 commit comments