package main

import (
"bytes"
"fmt"
"github.com/gin-gonic/gin"
"net/http"
)

type bodyLogWriter struct {
gin.ResponseWriter
body *bytes.Buffer
}

func (w bodyLogWriter) Write(b []byte) (int, error) {
w.body.Write(b)
return w.ResponseWriter.Write(b)
}

func ginBodyLogMiddleware(c *gin.Context) {
blw := &bodyLogWriter{body: bytes.NewBufferString(""), ResponseWriter: c.Writer}
c.Writer = blw
c.Next()
statusCode := c.Writer.Status()
fmt.Println(statusCode)
//if statusCode >= 400 {
//ok this is an request with error, let's make a record for it
// now print body (or log in your preferred way)
fmt.Println("Response body: " + blw.body.String())
//}
}
func main() {
r := gin.Default()
r.Use(ginBodyLogMiddleware)

r.GET("/ping", func(c *gin.Context) {
c.String(http.StatusOK, "PONG")
})

r.GET("/status", func(c *gin.Context) {
c.Status(http.StatusOK)
})

r.GET("/hello", func(c *gin.Context) {
c.JSON(http.StatusOK,gin.H{"afa":232})
})

r.Run()
}