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.
This commit is contained in:
Anis Elleuch 2018-08-08 20:34:42 +01:00 committed by kannappanr
parent 98bce72295
commit 6df20734f9

View File

@ -91,20 +91,15 @@ func (r *recordResponseWriter) WriteHeader(i int) {
func (r *recordResponseWriter) Write(p []byte) (n int, err error) { func (r *recordResponseWriter) Write(p []byte) (n int, err error) {
n, err = r.ResponseWriter.Write(p) 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 { 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()) writeHeaders(&r.headers, http.StatusOK, r.ResponseWriter.Header())
r.headersLogged = true r.headersLogged = true
} }
if r.statusCode != http.StatusOK && r.statusCode != http.StatusNoContent && r.statusCode != 0 { if (r.statusCode != http.StatusOK && r.statusCode != http.StatusPartialContent && r.statusCode != 0) || r.logBody {
// We always log error responses. // Always logging error responses.
r.body.Write(p) r.body.Write(p)
return
}
if r.logBody {
r.body.Write(p)
return
} }
return n, err return n, err
} }
@ -180,6 +175,10 @@ func TraceReqHandlerFunc(f http.HandlerFunc, output io.Writer, logBody bool) htt
b.Write(respBodyRecorder.Headers()) b.Write(respBodyRecorder.Headers())
fmt.Fprintf(b, "\n") 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() bodyContents := respBodyRecorder.Body()
if bodyContents != nil { if bodyContents != nil {
b.Write(bodyContents) b.Write(bodyContents)