diff --git a/api/api.go b/api/api.go index e0077a94e3..efab08ab3d 100644 --- a/api/api.go +++ b/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()) }