From 6df20734f9436a3b8c6b67f35ea9dec19cacc427 Mon Sep 17 00:00:00 2001 From: Anis Elleuch Date: Wed, 8 Aug 2018 20:34:42 +0100 Subject: [PATCH] Avoid logging the body of the http 206 response (#6258) When an S3 client issues a GET request with range specified, Minio server returns some partial data with 206 http code. The latter is sent in MINIO_HTTP_TRACE output which is incorrect. This PR fixes the issue. --- pkg/handlers/http-tracer.go | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/pkg/handlers/http-tracer.go b/pkg/handlers/http-tracer.go index 87f468ef4..56e606f0f 100644 --- a/pkg/handlers/http-tracer.go +++ b/pkg/handlers/http-tracer.go @@ -91,20 +91,15 @@ func (r *recordResponseWriter) WriteHeader(i int) { func (r *recordResponseWriter) Write(p []byte) (n int, err error) { n, err = r.ResponseWriter.Write(p) - // We log after calling ResponseWriter.Write() because this latter - // proactively prepares headers when WriteHeader is not called yet. if !r.headersLogged { + // We assume the response code to be '200 OK' when WriteHeader() is not called, + // that way following Golang HTTP response behavior. writeHeaders(&r.headers, http.StatusOK, r.ResponseWriter.Header()) r.headersLogged = true } - if r.statusCode != http.StatusOK && r.statusCode != http.StatusNoContent && r.statusCode != 0 { - // We always log error responses. + if (r.statusCode != http.StatusOK && r.statusCode != http.StatusPartialContent && r.statusCode != 0) || r.logBody { + // Always logging error responses. r.body.Write(p) - return - } - if r.logBody { - r.body.Write(p) - return } return n, err } @@ -180,6 +175,10 @@ func TraceReqHandlerFunc(f http.HandlerFunc, output io.Writer, logBody bool) htt b.Write(respBodyRecorder.Headers()) fmt.Fprintf(b, "\n") + + // recordResponseWriter{} is configured to record only + // responses with http code != 200 & != 206, we don't + // have to check for logBody value here. bodyContents := respBodyRecorder.Body() if bodyContents != nil { b.Write(bodyContents)