Преглед на файлове

Fill the multipart writer directly instead of using reader

Guillaume J. Charmes преди 12 години
родител
ревизия
2127f8d6ad
променени са 1 файла, в които са добавени 17 реда и са изтрити 5 реда
  1. 17 5
      commands.go

+ 17 - 5
commands.go

@@ -158,10 +158,12 @@ func (cli *DockerCli) CmdBuild(args ...string) error {
 		}
 		defer file.Close()
 	}
-	if _, err := w.CreateFormFile("Dockerfile", *fileName); err != nil {
+	if wField, err := w.CreateFormFile("Dockerfile", *fileName); err != nil {
 		return err
+	} else {
+		io.Copy(wField, file)
 	}
-	multipartBody = io.MultiReader(multipartBody, file)
+	multipartBody = io.MultiReader(multipartBody, boundary)
 
 	compression := Bzip2
 
@@ -172,20 +174,30 @@ func (cli *DockerCli) CmdBuild(args ...string) error {
 		if err != nil {
 			return err
 		}
-		if _, err := w.CreateFormFile("Context", cmd.Arg(0)+"."+compression.Extension()); err != nil {
+		// NOTE: Do this in case '.' or '..' is input
+		absPath, err := filepath.Abs(cmd.Arg(0))
+		if err != nil {
+			return err
+		}
+		if wField, err := w.CreateFormFile("Context", filepath.Base(absPath)+"."+compression.Extension()); err != nil {
 			return err
+		} else {
+			// FIXME: Find a way to have a progressbar for the upload too
+			io.Copy(wField, utils.ProgressReader(ioutil.NopCloser(context), -1, os.Stdout, "Caching Context %v/%v (%v)\r", false))
 		}
-		multipartBody = io.MultiReader(multipartBody, utils.ProgressReader(ioutil.NopCloser(context), -1, os.Stdout, "Uploading Context %v/%v (%v)\r", false))
+
+		multipartBody = io.MultiReader(multipartBody, boundary)
 	}
 
 	// Send the multipart request with correct content-type
-	req, err := http.NewRequest("POST", fmt.Sprintf("http://%s:%d%s", cli.host, cli.port, "/build"), io.MultiReader(multipartBody, boundary))
+	req, err := http.NewRequest("POST", fmt.Sprintf("http://%s:%d%s", cli.host, cli.port, "/build"), multipartBody)
 	if err != nil {
 		return err
 	}
 	req.Header.Set("Content-Type", w.FormDataContentType())
 	if cmd.Arg(0) != "" {
 		req.Header.Set("X-Docker-Context-Compression", compression.Flag())
+		fmt.Println("Uploading Context...")
 	}
 
 	resp, err := http.DefaultClient.Do(req)