aboutsummaryrefslogtreecommitdiff
path: root/server.go
diff options
context:
space:
mode:
authorJarkko Pöyry <jpoyry@google.com>2015-04-07 13:31:45 -0700
committerJarkko Poyry <jpoyry@google.com>2015-04-10 00:45:11 +0000
commitd17ce40133e19edd03bd71de4f1f3ea70f8f3227 (patch)
treeafe08513a72985a4bfa08df82055916ff9de42f1 /server.go
parent25092e56aded73d3ed0b76b86c9d37c8ebba8c1f (diff)
downloadcherry-d17ce40133e19edd03bd71de4f1f3ea70f8f3227.tar.gz
Support multifile import.
Change-Id: I21c130f1f68f2d7c6d4886f491fc94fd30f72a12
Diffstat (limited to 'server.go')
-rw-r--r--server.go49
1 files changed, 43 insertions, 6 deletions
diff --git a/server.go b/server.go
index 639b34f..ca9b115 100644
--- a/server.go
+++ b/server.go
@@ -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