diff options
author | Jarkko Pöyry <jpoyry@google.com> | 2015-04-07 13:31:45 -0700 |
---|---|---|
committer | Jarkko Poyry <jpoyry@google.com> | 2015-04-10 00:45:11 +0000 |
commit | d17ce40133e19edd03bd71de4f1f3ea70f8f3227 (patch) | |
tree | afe08513a72985a4bfa08df82055916ff9de42f1 /server.go | |
parent | 25092e56aded73d3ed0b76b86c9d37c8ebba8c1f (diff) | |
download | cherry-d17ce40133e19edd03bd71de4f1f3ea70f8f3227.tar.gz |
Support multifile import.
Change-Id: I21c130f1f68f2d7c6d4886f491fc94fd30f72a12
Diffstat (limited to 'server.go')
-rw-r--r-- | server.go | 49 |
1 files changed, 43 insertions, 6 deletions
@@ -250,13 +250,50 @@ func importHandler (response http.ResponseWriter, request *http.Request) { return } + parts, err := request.MultipartReader() + if err != nil { + http.Error(response, "Expected a multipart upload", 400) + return + } + log.Printf("[import] Received request with Content-Length %d\n", request.ContentLength) - startTime := time.Now() - batchResultId := startTime.Format(time.RFC3339) - batchResultDefaultName := startTime.Format("2006-Jan-02 15:04:05") - testRunner.ImportBatch(batchResultId, batchResultDefaultName, request.Body, request.ContentLength) - response.WriteHeader(http.StatusOK) - log.Printf("[import] Finished\n") + + anyImportSucceeded := false + anyImportFailed := false + + for { + file, err := parts.NextPart(); + if err != nil { + break + } + + startTime := time.Now() + batchResultId := startTime.Format(time.RFC3339) + batchResultDefaultName := startTime.Format("2006-Jan-02 15:04:05") + err = testRunner.ImportBatch(batchResultId, batchResultDefaultName, file, request.ContentLength) + if err != nil { + log.Printf("[import] Import failed with error %v\n", err) + anyImportFailed = true + } else { + log.Printf("[import] Single import finished\n") + anyImportSucceeded = true + } + + file.Close() + } + + request.Body.Close() + + if !anyImportFailed { + // no failures + response.WriteHeader(http.StatusOK) + } else if !anyImportSucceeded { + // no successes + http.Error(response, "Import failed", 500) + } else { + // both failures and successes + http.Error(response, "Partial failure", 207) + } } // Mapping of third party locations to desired server locations |