Use one http response recorder per external http call (#16938)

This commit is contained in:
Anis Eleuch
2023-03-31 17:37:29 +01:00
committed by GitHub
parent 216a471bbb
commit d90d0c8931
5 changed files with 32 additions and 21 deletions

View File

@@ -24,6 +24,7 @@ import (
"strconv"
"time"
"github.com/minio/minio/internal/http/stats"
internalAudit "github.com/minio/minio/internal/logger/message/audit"
"github.com/minio/pkg/logger/message/audit"
@@ -96,20 +97,27 @@ func AuditLog(ctx context.Context, w http.ResponseWriter, r *http.Request, reqCl
)
var st *xhttp.ResponseRecorder
switch v := w.(type) {
case *xhttp.ResponseRecorder:
st = v
case *gzhttp.GzipResponseWriter:
// the writer may be obscured by gzip response writer
if rw, ok := v.ResponseWriter.(*xhttp.ResponseRecorder); ok {
st = rw
}
case *gzhttp.NoGzipResponseWriter:
// the writer may be obscured by no-gzip response writer
if rw, ok := v.ResponseWriter.(*xhttp.ResponseRecorder); ok {
st = rw
for {
switch v := w.(type) {
case *gzhttp.GzipResponseWriter:
// the writer may be obscured by gzip response writer
w = v.ResponseWriter
case *gzhttp.NoGzipResponseWriter:
// the writer may be obscured by no-gzip response writer
w = v.ResponseWriter
case *stats.OutgoingTrafficMeter:
// the writer may be obscured by http stats response writer
w = v.ResponseWriter
case *xhttp.ResponseRecorder:
st = v
goto exit
default:
goto exit
}
}
exit:
if st != nil {
statusCode = st.StatusCode
timeToResponse = time.Now().UTC().Sub(st.StartTime)