diff --git a/api/client/attach.go b/api/client/attach.go index 8ab3248ace..5404e829d1 100644 --- a/api/client/attach.go +++ b/api/client/attach.go @@ -26,7 +26,7 @@ func (cli *DockerCli) CmdAttach(args ...string) error { cmd.ParseFlags(args, true) name := cmd.Arg(0) - stream, _, err := cli.call("GET", "/containers/"+name+"/json", nil, nil) + stream, _, _, err := cli.call("GET", "/containers/"+name+"/json", nil, nil) if err != nil { return err } diff --git a/api/client/commit.go b/api/client/commit.go index dd1d24f13b..09816dc71e 100644 --- a/api/client/commit.go +++ b/api/client/commit.go @@ -66,7 +66,7 @@ func (cli *DockerCli) CmdCommit(args ...string) error { return err } } - stream, _, err := cli.call("POST", "/commit?"+v.Encode(), config, nil) + stream, _, _, err := cli.call("POST", "/commit?"+v.Encode(), config, nil) if err != nil { return err } diff --git a/api/client/cp.go b/api/client/cp.go index d195601ba6..e40af890a1 100644 --- a/api/client/cp.go +++ b/api/client/cp.go @@ -31,7 +31,7 @@ func (cli *DockerCli) CmdCp(args ...string) error { cfg := &types.CopyConfig{ Resource: info[1], } - stream, statusCode, err := cli.call("POST", "/containers/"+info[0]+"/copy", cfg, nil) + stream, _, statusCode, err := cli.call("POST", "/containers/"+info[0]+"/copy", cfg, nil) if stream != nil { defer stream.Close() } diff --git a/api/client/create.go b/api/client/create.go index 475c50660a..0d0f66a5c8 100644 --- a/api/client/create.go +++ b/api/client/create.go @@ -95,7 +95,7 @@ func (cli *DockerCli) createContainer(config *runconfig.Config, hostConfig *runc } //create the container - stream, statusCode, err := cli.call("POST", "/containers/create?"+containerValues.Encode(), mergedConfig, nil) + stream, _, statusCode, err := cli.call("POST", "/containers/create?"+containerValues.Encode(), mergedConfig, nil) //if image not found try to pull it if statusCode == 404 && strings.Contains(err.Error(), config.Image) { repo, tag := parsers.ParseRepositoryTag(config.Image) @@ -109,7 +109,7 @@ func (cli *DockerCli) createContainer(config *runconfig.Config, hostConfig *runc return nil, err } // Retry - if stream, _, err = cli.call("POST", "/containers/create?"+containerValues.Encode(), mergedConfig, nil); err != nil { + if stream, _, _, err = cli.call("POST", "/containers/create?"+containerValues.Encode(), mergedConfig, nil); err != nil { return nil, err } } else if err != nil { diff --git a/api/client/diff.go b/api/client/diff.go index 6000c6b388..16528d7f21 100644 --- a/api/client/diff.go +++ b/api/client/diff.go @@ -25,7 +25,7 @@ func (cli *DockerCli) CmdDiff(args ...string) error { return fmt.Errorf("Container name cannot be empty") } - rdr, _, err := cli.call("GET", "/containers/"+cmd.Arg(0)+"/changes", nil, nil) + rdr, _, _, err := cli.call("GET", "/containers/"+cmd.Arg(0)+"/changes", nil, nil) if err != nil { return err } diff --git a/api/client/exec.go b/api/client/exec.go index f247ec5217..be03cbaf8a 100644 --- a/api/client/exec.go +++ b/api/client/exec.go @@ -23,7 +23,7 @@ func (cli *DockerCli) CmdExec(args ...string) error { return StatusError{StatusCode: 1} } - stream, _, err := cli.call("POST", "/containers/"+execConfig.Container+"/exec", execConfig, nil) + stream, _, _, err := cli.call("POST", "/containers/"+execConfig.Container+"/exec", execConfig, nil) if err != nil { return err } diff --git a/api/client/history.go b/api/client/history.go index 31b8535031..d9345801f9 100644 --- a/api/client/history.go +++ b/api/client/history.go @@ -24,7 +24,7 @@ func (cli *DockerCli) CmdHistory(args ...string) error { cmd.Require(flag.Exact, 1) cmd.ParseFlags(args, true) - rdr, _, err := cli.call("GET", "/images/"+cmd.Arg(0)+"/history", nil, nil) + rdr, _, _, err := cli.call("GET", "/images/"+cmd.Arg(0)+"/history", nil, nil) if err != nil { return err } diff --git a/api/client/images.go b/api/client/images.go index e39c473749..6def371a67 100644 --- a/api/client/images.go +++ b/api/client/images.go @@ -61,7 +61,7 @@ func (cli *DockerCli) CmdImages(args ...string) error { v.Set("all", "1") } - rdr, _, err := cli.call("GET", "/images/json?"+v.Encode(), nil, nil) + rdr, _, _, err := cli.call("GET", "/images/json?"+v.Encode(), nil, nil) if err != nil { return err } diff --git a/api/client/info.go b/api/client/info.go index b3bdc26d57..52147429c6 100644 --- a/api/client/info.go +++ b/api/client/info.go @@ -18,7 +18,7 @@ func (cli *DockerCli) CmdInfo(args ...string) error { cmd.Require(flag.Exact, 0) cmd.ParseFlags(args, true) - rdr, _, err := cli.call("GET", "/info", nil, nil) + rdr, _, _, err := cli.call("GET", "/info", nil, nil) if err != nil { return err } diff --git a/api/client/login.go b/api/client/login.go index d7da1de2b0..832c5bb476 100644 --- a/api/client/login.go +++ b/api/client/login.go @@ -113,7 +113,7 @@ func (cli *DockerCli) CmdLogin(args ...string) error { authconfig.ServerAddress = serverAddress cli.configFile.AuthConfigs[serverAddress] = authconfig - stream, statusCode, err := cli.call("POST", "/auth", cli.configFile.AuthConfigs[serverAddress], nil) + stream, _, statusCode, err := cli.call("POST", "/auth", cli.configFile.AuthConfigs[serverAddress], nil) if statusCode == 401 { delete(cli.configFile.AuthConfigs, serverAddress) if err2 := cli.configFile.Save(); err2 != nil { diff --git a/api/client/logs.go b/api/client/logs.go index c7e48bb5a9..0309144ba6 100644 --- a/api/client/logs.go +++ b/api/client/logs.go @@ -28,7 +28,7 @@ func (cli *DockerCli) CmdLogs(args ...string) error { name := cmd.Arg(0) - stream, _, err := cli.call("GET", "/containers/"+name+"/json", nil, nil) + stream, _, _, err := cli.call("GET", "/containers/"+name+"/json", nil, nil) if err != nil { return err } diff --git a/api/client/port.go b/api/client/port.go index 4c39314706..1721bc123f 100644 --- a/api/client/port.go +++ b/api/client/port.go @@ -18,7 +18,7 @@ func (cli *DockerCli) CmdPort(args ...string) error { cmd.Require(flag.Min, 1) cmd.ParseFlags(args, true) - stream, _, err := cli.call("GET", "/containers/"+cmd.Arg(0)+"/json", nil, nil) + stream, _, _, err := cli.call("GET", "/containers/"+cmd.Arg(0)+"/json", nil, nil) if err != nil { return err } diff --git a/api/client/ps.go b/api/client/ps.go index 6c40c6867b..5d241db3e2 100644 --- a/api/client/ps.go +++ b/api/client/ps.go @@ -86,7 +86,7 @@ func (cli *DockerCli) CmdPs(args ...string) error { v.Set("filters", filterJSON) } - rdr, _, err := cli.call("GET", "/containers/json?"+v.Encode(), nil, nil) + rdr, _, _, err := cli.call("GET", "/containers/json?"+v.Encode(), nil, nil) if err != nil { return err } diff --git a/api/client/rmi.go b/api/client/rmi.go index 36f2036d13..0f773f1071 100644 --- a/api/client/rmi.go +++ b/api/client/rmi.go @@ -31,7 +31,7 @@ func (cli *DockerCli) CmdRmi(args ...string) error { var errNames []string for _, name := range cmd.Args() { - rdr, _, err := cli.call("DELETE", "/images/"+name+"?"+v.Encode(), nil, nil) + rdr, _, _, err := cli.call("DELETE", "/images/"+name+"?"+v.Encode(), nil, nil) if err != nil { fmt.Fprintf(cli.err, "%s\n", err) errNames = append(errNames, name) diff --git a/api/client/start.go b/api/client/start.go index 40f84d7cf3..22786effac 100644 --- a/api/client/start.go +++ b/api/client/start.go @@ -61,7 +61,7 @@ func (cli *DockerCli) CmdStart(args ...string) error { return fmt.Errorf("You cannot start and attach multiple containers at once.") } - stream, _, err := cli.call("GET", "/containers/"+cmd.Arg(0)+"/json", nil, nil) + stream, _, _, err := cli.call("GET", "/containers/"+cmd.Arg(0)+"/json", nil, nil) if err != nil { return err } diff --git a/api/client/stats.go b/api/client/stats.go index 592da553c1..3dd05b3fb7 100644 --- a/api/client/stats.go +++ b/api/client/stats.go @@ -35,7 +35,7 @@ func (s *containerStats) Collect(cli *DockerCli, streamStats bool) { } else { v.Set("stream", "0") } - stream, _, err := cli.call("GET", "/containers/"+s.Name+"/stats?"+v.Encode(), nil, nil) + stream, _, _, err := cli.call("GET", "/containers/"+s.Name+"/stats?"+v.Encode(), nil, nil) if err != nil { s.mu.Lock() s.err = err diff --git a/api/client/top.go b/api/client/top.go index ee16fdbf60..a5ffee034a 100644 --- a/api/client/top.go +++ b/api/client/top.go @@ -25,7 +25,7 @@ func (cli *DockerCli) CmdTop(args ...string) error { val.Set("ps_args", strings.Join(cmd.Args()[1:], " ")) } - stream, _, err := cli.call("GET", "/containers/"+cmd.Arg(0)+"/top?"+val.Encode(), nil, nil) + stream, _, _, err := cli.call("GET", "/containers/"+cmd.Arg(0)+"/top?"+val.Encode(), nil, nil) if err != nil { return err } diff --git a/api/client/utils.go b/api/client/utils.go index fab4c3ce85..b9d8f27c44 100644 --- a/api/client/utils.go +++ b/api/client/utils.go @@ -48,14 +48,14 @@ func (cli *DockerCli) encodeData(data interface{}) (*bytes.Buffer, error) { return params, nil } -func (cli *DockerCli) clientRequest(method, path string, in io.Reader, headers map[string][]string) (io.ReadCloser, string, int, error) { +func (cli *DockerCli) clientRequest(method, path string, in io.Reader, headers map[string][]string) (io.ReadCloser, http.Header, int, error) { expectedPayload := (method == "POST" || method == "PUT") if expectedPayload && in == nil { in = bytes.NewReader([]byte{}) } req, err := http.NewRequest(method, fmt.Sprintf("/v%s%s", api.APIVERSION, path), in) if err != nil { - return nil, "", -1, err + return nil, nil, -1, err } // Add CLI Config's HTTP Headers BEFORE we set the Docker headers @@ -85,27 +85,27 @@ func (cli *DockerCli) clientRequest(method, path string, in io.Reader, headers m } if err != nil { if strings.Contains(err.Error(), "connection refused") { - return nil, "", statusCode, errConnectionRefused + return nil, nil, statusCode, errConnectionRefused } if cli.tlsConfig == nil { - return nil, "", statusCode, fmt.Errorf("%v. Are you trying to connect to a TLS-enabled daemon without TLS?", err) + return nil, nil, statusCode, fmt.Errorf("%v. Are you trying to connect to a TLS-enabled daemon without TLS?", err) } - return nil, "", statusCode, fmt.Errorf("An error occurred trying to connect: %v", err) + return nil, nil, statusCode, fmt.Errorf("An error occurred trying to connect: %v", err) } if statusCode < 200 || statusCode >= 400 { body, err := ioutil.ReadAll(resp.Body) if err != nil { - return nil, "", statusCode, err + return nil, nil, statusCode, err } if len(body) == 0 { - return nil, "", statusCode, fmt.Errorf("Error: request returned %s for API route and version %s, check if the server supports the requested API version", http.StatusText(statusCode), req.URL) + return nil, nil, statusCode, fmt.Errorf("Error: request returned %s for API route and version %s, check if the server supports the requested API version", http.StatusText(statusCode), req.URL) } - return nil, "", statusCode, fmt.Errorf("Error response from daemon: %s", bytes.TrimSpace(body)) + return nil, nil, statusCode, fmt.Errorf("Error response from daemon: %s", bytes.TrimSpace(body)) } - return resp.Body, resp.Header.Get("Content-Type"), statusCode, nil + return resp.Body, resp.Header, statusCode, nil } func (cli *DockerCli) clientRequestAttemptLogin(method, path string, in io.Reader, out io.Writer, index *registry.IndexInfo, cmdName string) (io.ReadCloser, int, error) { @@ -119,13 +119,13 @@ func (cli *DockerCli) clientRequestAttemptLogin(method, path string, in io.Reade } // begin the request - body, contentType, statusCode, err := cli.clientRequest(method, path, in, map[string][]string{ + body, hdr, statusCode, err := cli.clientRequest(method, path, in, map[string][]string{ "X-Registry-Auth": registryAuthHeader, }) if err == nil && out != nil { // If we are streaming output, complete the stream since // errors may not appear until later. - err = cli.streamBody(body, contentType, true, out, nil) + err = cli.streamBody(body, hdr.Get("Content-Type"), true, out, nil) } if err != nil { // Since errors in a stream appear after status 200 has been written, @@ -153,10 +153,10 @@ func (cli *DockerCli) clientRequestAttemptLogin(method, path string, in io.Reade return body, statusCode, err } -func (cli *DockerCli) call(method, path string, data interface{}, headers map[string][]string) (io.ReadCloser, int, error) { +func (cli *DockerCli) call(method, path string, data interface{}, headers map[string][]string) (io.ReadCloser, http.Header, int, error) { params, err := cli.encodeData(data) if err != nil { - return nil, -1, err + return nil, nil, -1, err } if data != nil { @@ -166,8 +166,8 @@ func (cli *DockerCli) call(method, path string, data interface{}, headers map[st headers["Content-Type"] = []string{"application/json"} } - body, _, statusCode, err := cli.clientRequest(method, path, params, headers) - return body, statusCode, err + body, hdr, statusCode, err := cli.clientRequest(method, path, params, headers) + return body, hdr, statusCode, err } type streamOpts struct { @@ -179,11 +179,11 @@ type streamOpts struct { } func (cli *DockerCli) stream(method, path string, opts *streamOpts) error { - body, contentType, _, err := cli.clientRequest(method, path, opts.in, opts.headers) + body, hdr, _, err := cli.clientRequest(method, path, opts.in, opts.headers) if err != nil { return err } - return cli.streamBody(body, contentType, opts.rawTerminal, opts.out, opts.err) + return cli.streamBody(body, hdr.Get("Content-Type"), opts.rawTerminal, opts.out, opts.err) } func (cli *DockerCli) streamBody(body io.ReadCloser, contentType string, rawTerminal bool, stdout, stderr io.Writer) error { @@ -228,7 +228,7 @@ func (cli *DockerCli) resizeTty(id string, isExec bool) { } func waitForExit(cli *DockerCli, containerID string) (int, error) { - stream, _, err := cli.call("POST", "/containers/"+containerID+"/wait", nil, nil) + stream, _, _, err := cli.call("POST", "/containers/"+containerID+"/wait", nil, nil) if err != nil { return -1, err } @@ -244,7 +244,7 @@ func waitForExit(cli *DockerCli, containerID string) (int, error) { // getExitCode perform an inspect on the container. It returns // the running state and the exit code. func getExitCode(cli *DockerCli, containerID string) (bool, int, error) { - stream, _, err := cli.call("GET", "/containers/"+containerID+"/json", nil, nil) + stream, _, _, err := cli.call("GET", "/containers/"+containerID+"/json", nil, nil) if err != nil { // If we can't connect, then the daemon probably died. if err != errConnectionRefused { @@ -264,7 +264,7 @@ func getExitCode(cli *DockerCli, containerID string) (bool, int, error) { // getExecExitCode perform an inspect on the exec command. It returns // the running state and the exit code. func getExecExitCode(cli *DockerCli, execID string) (bool, int, error) { - stream, _, err := cli.call("GET", "/exec/"+execID+"/json", nil, nil) + stream, _, _, err := cli.call("GET", "/exec/"+execID+"/json", nil, nil) if err != nil { // If we can't connect, then the daemon probably died. if err != errConnectionRefused { @@ -330,7 +330,7 @@ func (cli *DockerCli) getTtySize() (int, int) { return int(ws.Height), int(ws.Width) } -func readBody(stream io.ReadCloser, statusCode int, err error) ([]byte, int, error) { +func readBody(stream io.ReadCloser, hdr http.Header, statusCode int, err error) ([]byte, int, error) { if stream != nil { defer stream.Close() } diff --git a/api/client/version.go b/api/client/version.go index 29e714da8b..a111f8f095 100644 --- a/api/client/version.go +++ b/api/client/version.go @@ -36,7 +36,7 @@ func (cli *DockerCli) CmdVersion(args ...string) error { fmt.Fprintf(cli.out, "Experimental (client): true\n") } - stream, _, err := cli.call("GET", "/version", nil, nil) + stream, _, _, err := cli.call("GET", "/version", nil, nil) if err != nil { return err }