From 129ebbd685293997a9b3314fdece4f9c70ef8d93 Mon Sep 17 00:00:00 2001 From: Krishnan Parthasarathi Date: Thu, 16 Jun 2016 09:01:06 +0530 Subject: [PATCH] object layer: Send 200 OK and whitespace chars (#1897) --- api-response.go | 10 +++++++--- object-handlers.go | 35 ++++++++++++++++++++++++++++++----- 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/api-response.go b/api-response.go index 690da75e9..8216e8025 100644 --- a/api-response.go +++ b/api-response.go @@ -497,13 +497,17 @@ func writeSuccessNoContent(w http.ResponseWriter) { // writeErrorRespone write error headers func writeErrorResponse(w http.ResponseWriter, req *http.Request, errorCode APIErrorCode, resource string) { error := getAPIError(errorCode) - // generate error response - errorResponse := getAPIErrorResponse(error, resource) - encodedErrorResponse := encodeResponse(errorResponse) // set common headers setCommonHeaders(w) // write Header w.WriteHeader(error.HTTPStatusCode) + writeErrorResponseNoHeader(w, req, error, resource) +} + +func writeErrorResponseNoHeader(w http.ResponseWriter, req *http.Request, error APIError, resource string) { + // generate error response + errorResponse := getAPIErrorResponse(error, resource) + encodedErrorResponse := encodeResponse(errorResponse) // HEAD should have no body, do not attempt to write to it if req.Method != "HEAD" { // write error body diff --git a/object-handlers.go b/object-handlers.go index fc2757845..57287d563 100644 --- a/object-handlers.go +++ b/object-handlers.go @@ -843,6 +843,19 @@ func (api objectAPIHandlers) AbortMultipartUploadHandler(w http.ResponseWriter, writeSuccessNoContent(w) } +// Send whitespace character, once every 5secs, until CompleteMultipartUpload is done. +// CompleteMultipartUpload method of the object layer indicates that it's done via doneCh +func sendWhiteSpaceChars(w http.ResponseWriter, doneCh <-chan struct{}) { + for { + select { + case <-time.After(5 * time.Second): + w.Write([]byte(" ")) + case <-doneCh: + return + } + } +} + // ListObjectPartsHandler - List object parts func (api objectAPIHandlers) ListObjectPartsHandler(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) @@ -946,21 +959,33 @@ func (api objectAPIHandlers) CompleteMultipartUploadHandler(w http.ResponseWrite completeParts = append(completeParts, part) } // Complete multipart upload. - md5Sum, err = api.ObjectAPI.CompleteMultipartUpload(bucket, object, uploadID, completeParts) + // Send 200 OK + setCommonHeaders(w) + w.WriteHeader(http.StatusOK) + + doneCh := make(chan struct{}) + // Signal that completeMultipartUpload is over via doneCh + go func(doneCh chan<- struct{}) { + md5Sum, err = api.ObjectAPI.CompleteMultipartUpload(bucket, object, uploadID, completeParts) + doneCh <- struct{}{} + }(doneCh) + + sendWhiteSpaceChars(w, doneCh) + if err != nil { errorIf(err, "Unable to complete multipart upload.") - writeErrorResponse(w, r, toAPIErrorCode(err), r.URL.Path) + writeErrorResponseNoHeader(w, r, getAPIError(toAPIErrorCode(err)), r.URL.Path) return } + // Get object location. location := getLocation(r) // Generate complete multipart response. response := generateCompleteMultpartUploadResponse(bucket, object, location, md5Sum) encodedSuccessResponse := encodeResponse(response) - // Write headers. - setCommonHeaders(w) // write success response. - writeSuccessResponse(w, encodedSuccessResponse) + w.Write(encodedSuccessResponse) + w.(http.Flusher).Flush() } /// Delete objectAPIHandlers