Есть вариант использовать httptest.ResponseRecorder, я его использовал ранее для написания тестов.
https://pkg.go.dev/net/http/httptest#ResponseRecorder
Пример будет примерно таким
func (m *LoggingMiddleware) LogBody(next http.Handler) http.Handler {
fn := func(w http.ResponseWriter, r *http.Request) {
wRecorder := httptest.NewRecorder()
next.ServeHTTP(wRecorder, r)
resp := wRecorder.Result()
body, _ := io.ReadAll(resp.Body)
// не забыть записать ответ в w
}
return http.HandlerFunc(fn)
}
Пример его использования из официальной документации
https://pkg.go.dev/net/http/httptest#example-Respo...
Или, можно сделать свой responseWriter, в handler передавать свой writer, а потом, после обработки, записать полученный ответ сервера в оригинальный responseWriter
Что-то типа такого
func (m *LoggingMiddleware) LogBody(next http.Handler) http.Handler {
fn := func(w http.ResponseWriter, r *http.Request) {
var buf bytes.Buffer
logWriter := NewLogToConsoleResponseWriter(&b)
next.ServeHTTP(logWriter, r)
// тут у вас в buf будет ответ сервера, с которым можно работать
// главное потом не забыть записать его в `w`
}
return http.HandlerFunc(fn)
}