From 4ba77a916df0591685e326b7736c537570f04d9b Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Tue, 12 Feb 2019 23:48:11 -0800 Subject: [PATCH] Select should return early errors as XML (#7230) Currently, we were sending errors in Select binary format, which is incompatible with AWS S3 behavior, errors in binary are sent after HTTP status code is already 200 OK - i.e it happens during the evaluation of the record reader. --- cmd/object-handlers.go | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/cmd/object-handlers.go b/cmd/object-handlers.go index e63f8ede5..d0d6f0508 100644 --- a/cmd/object-handlers.go +++ b/cmd/object-handlers.go @@ -161,8 +161,16 @@ func (api objectAPIHandlers) SelectObjectContentHandler(w http.ResponseWriter, r s3Select, err := s3select.NewS3Select(r.Body) if err != nil { if serr, ok := err.(s3select.SelectError); ok { - w.WriteHeader(serr.HTTPStatusCode()) - w.Write(s3select.NewErrorMessage(serr.ErrorCode(), serr.ErrorMessage())) + encodedErrorResponse := encodeResponse(APIErrorResponse{ + Code: serr.ErrorCode(), + Message: serr.ErrorMessage(), + BucketName: bucket, + Key: object, + Resource: r.URL.Path, + RequestID: w.Header().Get(responseRequestIDKey), + HostID: w.Header().Get(responseDeploymentIDKey), + }) + writeResponse(w, serr.HTTPStatusCode(), encodedErrorResponse, mimeXML) } else { writeErrorResponse(w, toAPIError(ctx, err), r.URL, guessIsBrowserReq(r)) } @@ -195,8 +203,16 @@ func (api objectAPIHandlers) SelectObjectContentHandler(w http.ResponseWriter, r if err = s3Select.Open(getObject); err != nil { if serr, ok := err.(s3select.SelectError); ok { - w.WriteHeader(serr.HTTPStatusCode()) - w.Write(s3select.NewErrorMessage(serr.ErrorCode(), serr.ErrorMessage())) + encodedErrorResponse := encodeResponse(APIErrorResponse{ + Code: serr.ErrorCode(), + Message: serr.ErrorMessage(), + BucketName: bucket, + Key: object, + Resource: r.URL.Path, + RequestID: w.Header().Get(responseRequestIDKey), + HostID: w.Header().Get(responseDeploymentIDKey), + }) + writeResponse(w, serr.HTTPStatusCode(), encodedErrorResponse, mimeXML) } else { writeErrorResponse(w, toAPIError(ctx, err), r.URL, guessIsBrowserReq(r)) }