Skip to content

Commit 1f2561b

Browse files
authored
Merge pull request #152 from deploymenttheory/dev
Refactor response/success.go to improve response body logging
2 parents 73e3f3a + 825687b commit 1f2561b

File tree

1 file changed

+15
-23
lines changed

1 file changed

+15
-23
lines changed

response/success.go

Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
8779
func unmarshalJSON(reader io.Reader, out interface{}, log logger.Logger, mimeType string) error {
8880
decoder := json.NewDecoder(reader)

0 commit comments

Comments
 (0)