diff --git a/api/client/utils.go b/api/client/utils.go index b1fec647c4..19e280614e 100644 --- a/api/client/utils.go +++ b/api/client/utils.go @@ -167,7 +167,7 @@ func (cli *DockerCli) streamHelper(method, path string, setRawTerminal bool, in return fmt.Errorf("Error: %s", bytes.TrimSpace(body)) } - if api.MatchesContentType(resp.Header.Get("Content-Type"), "application/json") { + if api.MatchesContentType(resp.Header.Get("Content-Type"), "application/json") || api.MatchesContentType(resp.Header.Get("Content-Type"), "application/x-json-stream") { return utils.DisplayJSONMessagesStream(resp.Body, stdout, cli.terminalFd, cli.isTerminal) } if stdout != nil || stderr != nil { diff --git a/api/server/server.go b/api/server/server.go index 74bebfde1d..61774fc680 100644 --- a/api/server/server.go +++ b/api/server/server.go @@ -102,6 +102,10 @@ func writeJSON(w http.ResponseWriter, code int, v engine.Env) error { func streamJSON(job *engine.Job, w http.ResponseWriter, flush bool) { w.Header().Set("Content-Type", "application/json") + if job.GetenvBool("lineDelim") { + w.Header().Set("Content-Type", "application/x-json-stream") + } + if flush { job.Stdout.Add(utils.NewWriteFlusher(w)) } else { @@ -976,6 +980,7 @@ func postBuild(eng *engine.Engine, version version.Version, w http.ResponseWrite job.Setenv("q", r.FormValue("q")) job.Setenv("nocache", r.FormValue("nocache")) job.Setenv("forcerm", r.FormValue("forcerm")) + job.SetenvBool("lineDelim", version.GreaterThanOrEqualTo("1.15")) job.SetenvJson("authConfig", authConfig) job.SetenvJson("configFile", configFile) diff --git a/api/server/server_unit_test.go b/api/server/server_unit_test.go index 519652f377..b433cc7683 100644 --- a/api/server/server_unit_test.go +++ b/api/server/server_unit_test.go @@ -275,7 +275,7 @@ func TestGetEvents(t *testing.T) { if !called { t.Fatal("handler was not called") } - assertContentType(r, "application/json", t) + assertContentType(r, "application/x-json-stream", t) var stdout_json struct { Since int Until int diff --git a/docs/sources/reference/api/docker_remote_api.md b/docs/sources/reference/api/docker_remote_api.md index 10ee44d9a9..fb53283a1b 100644 --- a/docs/sources/reference/api/docker_remote_api.md +++ b/docs/sources/reference/api/docker_remote_api.md @@ -37,6 +37,12 @@ You can still call an old version of the API using ### What's new +`POST /build` +`GET /events` + +**New!** +Now has header: `Content-Type: application/x-json-stream`. + ## v1.14 ### Full Documentation diff --git a/docs/sources/reference/api/docker_remote_api_v1.15.md b/docs/sources/reference/api/docker_remote_api_v1.15.md index 71ec43179c..7563fed1e6 100644 --- a/docs/sources/reference/api/docker_remote_api_v1.15.md +++ b/docs/sources/reference/api/docker_remote_api_v1.15.md @@ -1052,7 +1052,7 @@ Build an image from Dockerfile via stdin **Example response**: HTTP/1.1 200 OK - Content-Type: application/json + Content-Type: application/x-json-stream {"stream":"Step 1..."} {"stream":"..."} @@ -1279,7 +1279,7 @@ via polling (using since) **Example response**: HTTP/1.1 200 OK - Content-Type: application/json + Content-Type: application/x-json-stream {"status":"create","id":"dfdf82bd3881","from":"base:latest","time":1374067924} {"status":"start","id":"dfdf82bd3881","from":"base:latest","time":1374067924}