Browse Source

fix content-type for job.Stdout.Add

Docker-DCO-1.1-Signed-off-by: Victor Vieux <victor.vieux@docker.com> (github: vieux)
Victor Vieux 11 năm trước cách đây
mục cha
commit
4611a6bdd3
1 tập tin đã thay đổi với 41 bổ sung22 xóa
  1. 41 22
      api/api.go

+ 41 - 22
api/api.go

@@ -108,6 +108,15 @@ func writeJSON(w http.ResponseWriter, code int, v engine.Env) error {
 	return v.Encode(w)
 }
 
+func streamJSON(job *engine.Job, w http.ResponseWriter, flush bool) {
+	w.Header().Set("Content-Type", "application/json")
+	if flush {
+		job.Stdout.Add(utils.NewWriteFlusher(w))
+	} else {
+		job.Stdout.Add(w)
+	}
+}
+
 func getBoolParam(value string) (bool, error) {
 	if value == "" {
 		return false, nil
@@ -214,7 +223,7 @@ func getImagesJSON(eng *engine.Engine, version float64, w http.ResponseWriter, r
 	job.Setenv("all", r.Form.Get("all"))
 
 	if version >= 1.7 {
-		job.Stdout.Add(w)
+		streamJSON(job, w, false)
 	} else if outs, err = job.Stdout.AddListTable(); err != nil {
 		return err
 	}
@@ -265,9 +274,8 @@ func getEvents(eng *engine.Engine, version float64, w http.ResponseWriter, r *ht
 		return err
 	}
 
-	w.Header().Set("Content-Type", "application/json")
 	var job = eng.Job("events", r.RemoteAddr)
-	job.Stdout.Add(utils.NewWriteFlusher(w))
+	streamJSON(job, w, true)
 	job.Setenv("since", r.Form.Get("since"))
 	return job.Run()
 }
@@ -278,7 +286,7 @@ func getImagesHistory(eng *engine.Engine, version float64, w http.ResponseWriter
 	}
 
 	var job = eng.Job("history", vars["name"])
-	job.Stdout.Add(w)
+	streamJSON(job, w, false)
 
 	if err := job.Run(); err != nil {
 		return err
@@ -291,7 +299,7 @@ func getContainersChanges(eng *engine.Engine, version float64, w http.ResponseWr
 		return fmt.Errorf("Missing parameter")
 	}
 	var job = eng.Job("changes", vars["name"])
-	job.Stdout.Add(w)
+	streamJSON(job, w, false)
 
 	return job.Run()
 }
@@ -308,7 +316,7 @@ func getContainersTop(eng *engine.Engine, version float64, w http.ResponseWriter
 	}
 
 	job := eng.Job("top", vars["name"], r.Form.Get("ps_args"))
-	job.Stdout.Add(w)
+	streamJSON(job, w, false)
 	return job.Run()
 }
 
@@ -329,8 +337,7 @@ func getContainersJSON(eng *engine.Engine, version float64, w http.ResponseWrite
 	job.Setenv("limit", r.Form.Get("limit"))
 
 	if version >= 1.5 {
-		w.Header().Set("Content-Type", "application/json")
-		job.Stdout.Add(w)
+		streamJSON(job, w, false)
 	} else if outs, err = job.Stdout.AddTable(); err != nil {
 		return err
 	}
@@ -435,8 +442,12 @@ func postImagesCreate(eng *engine.Engine, version float64, w http.ResponseWriter
 		job.Stdin.Add(r.Body)
 	}
 
-	job.SetenvBool("json", version > 1.0)
-	job.Stdout.Add(utils.NewWriteFlusher(w))
+	if version > 1.0 {
+		job.SetenvBool("json", true)
+		streamJSON(job, w, true)
+	} else {
+		job.Stdout.Add(utils.NewWriteFlusher(w))
+	}
 	if err := job.Run(); err != nil {
 		if !job.Stdout.Used() {
 			return err
@@ -475,7 +486,7 @@ func getImagesSearch(eng *engine.Engine, version float64, w http.ResponseWriter,
 	var job = eng.Job("search", r.Form.Get("term"))
 	job.SetenvJson("metaHeaders", metaHeaders)
 	job.SetenvJson("authConfig", authConfig)
-	job.Stdout.Add(w)
+	streamJSON(job, w, false)
 
 	return job.Run()
 }
@@ -492,8 +503,12 @@ func postImagesInsert(eng *engine.Engine, version float64, w http.ResponseWriter
 	}
 
 	job := eng.Job("insert", vars["name"], r.Form.Get("url"), r.Form.Get("path"))
-	job.SetenvBool("json", version > 1.0)
-	job.Stdout.Add(w)
+	if version > 1.0 {
+		job.SetenvBool("json", true)
+		streamJSON(job, w, false)
+	} else {
+		job.Stdout.Add(w)
+	}
 	if err := job.Run(); err != nil {
 		if !job.Stdout.Used() {
 			return err
@@ -542,8 +557,12 @@ func postImagesPush(eng *engine.Engine, version float64, w http.ResponseWriter,
 	job := eng.Job("push", vars["name"])
 	job.SetenvJson("metaHeaders", metaHeaders)
 	job.SetenvJson("authConfig", authConfig)
-	job.SetenvBool("json", version > 1.0)
-	job.Stdout.Add(utils.NewWriteFlusher(w))
+	if version > 1.0 {
+		job.SetenvBool("json", true)
+		streamJSON(job, w, true)
+	} else {
+		job.Stdout.Add(utils.NewWriteFlusher(w))
+	}
 
 	if err := job.Run(); err != nil {
 		if !job.Stdout.Used() {
@@ -645,7 +664,7 @@ func deleteImages(eng *engine.Engine, version float64, w http.ResponseWriter, r
 		return fmt.Errorf("Missing parameter")
 	}
 	var job = eng.Job("image_delete", vars["name"])
-	job.Stdout.Add(w)
+	streamJSON(job, w, false)
 	job.SetenvBool("autoPrune", version > 1.1)
 
 	return job.Run()
@@ -825,7 +844,7 @@ func getContainersByName(eng *engine.Engine, version float64, w http.ResponseWri
 		return fmt.Errorf("Missing parameter")
 	}
 	var job = eng.Job("inspect", vars["name"], "container")
-	job.Stdout.Add(w)
+	streamJSON(job, w, false)
 	job.SetenvBool("conflict", true) //conflict=true to detect conflict between containers and images in the job
 	return job.Run()
 }
@@ -835,7 +854,7 @@ func getImagesByName(eng *engine.Engine, version float64, w http.ResponseWriter,
 		return fmt.Errorf("Missing parameter")
 	}
 	var job = eng.Job("inspect", vars["name"], "image")
-	job.Stdout.Add(w)
+	streamJSON(job, w, false)
 	job.SetenvBool("conflict", true) //conflict=true to detect conflict between containers and images in the job
 	return job.Run()
 }
@@ -875,11 +894,11 @@ func postBuild(eng *engine.Engine, version float64, w http.ResponseWriter, r *ht
 	}
 
 	if version >= 1.8 {
-		w.Header().Set("Content-Type", "application/json")
 		job.SetenvBool("json", true)
+		streamJSON(job, w, true)
+	} else {
+		job.Stdout.Add(utils.NewWriteFlusher(w))
 	}
-
-	job.Stdout.Add(utils.NewWriteFlusher(w))
 	job.Stdin.Add(r.Body)
 	job.Setenv("remote", r.FormValue("remote"))
 	job.Setenv("t", r.FormValue("t"))
@@ -920,7 +939,7 @@ func postContainersCopy(eng *engine.Engine, version float64, w http.ResponseWrit
 	}
 
 	job := eng.Job("container_copy", vars["name"], copyData.Get("Resource"))
-	job.Stdout.Add(w)
+	streamJSON(job, w, false)
 	if err := job.Run(); err != nil {
 		utils.Errorf("%s", err.Error())
 	}