|
@@ -171,10 +171,20 @@ 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, http.Header, int, error) {
|
|
|
+func (cli *DockerCli) callWrapper(method, path string, data interface{}, headers map[string][]string) (io.ReadCloser, http.Header, int, error) {
|
|
|
+ sr, err := cli.call(method, path, data, headers)
|
|
|
+ return sr.body, sr.header, sr.statusCode, err
|
|
|
+}
|
|
|
+
|
|
|
+func (cli *DockerCli) call(method, path string, data interface{}, headers map[string][]string) (*serverResponse, error) {
|
|
|
params, err := cli.encodeData(data)
|
|
|
if err != nil {
|
|
|
- return nil, nil, -1, err
|
|
|
+ sr := &serverResponse{
|
|
|
+ body: nil,
|
|
|
+ header: nil,
|
|
|
+ statusCode: -1,
|
|
|
+ }
|
|
|
+ return sr, nil
|
|
|
}
|
|
|
|
|
|
if data != nil {
|
|
@@ -185,7 +195,7 @@ func (cli *DockerCli) call(method, path string, data interface{}, headers map[st
|
|
|
}
|
|
|
|
|
|
serverResp, err := cli.clientRequest(method, path, params, headers)
|
|
|
- return serverResp.body, serverResp.header, serverResp.statusCode, err
|
|
|
+ return serverResp, err
|
|
|
}
|
|
|
|
|
|
type streamOpts struct {
|
|
@@ -246,15 +256,15 @@ 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)
|
|
|
+ serverResp, err := cli.call("POST", "/containers/"+containerID+"/wait", nil, nil)
|
|
|
if err != nil {
|
|
|
return -1, err
|
|
|
}
|
|
|
|
|
|
- defer stream.Close()
|
|
|
+ defer serverResp.body.Close()
|
|
|
|
|
|
var res types.ContainerWaitResponse
|
|
|
- if err := json.NewDecoder(stream).Decode(&res); err != nil {
|
|
|
+ if err := json.NewDecoder(serverResp.body).Decode(&res); err != nil {
|
|
|
return -1, err
|
|
|
}
|
|
|
|
|
@@ -264,7 +274,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)
|
|
|
+ serverResp, 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 {
|
|
@@ -273,10 +283,10 @@ func getExitCode(cli *DockerCli, containerID string) (bool, int, error) {
|
|
|
return false, -1, nil
|
|
|
}
|
|
|
|
|
|
- defer stream.Close()
|
|
|
+ defer serverResp.body.Close()
|
|
|
|
|
|
var c types.ContainerJSON
|
|
|
- if err := json.NewDecoder(stream).Decode(&c); err != nil {
|
|
|
+ if err := json.NewDecoder(serverResp.body).Decode(&c); err != nil {
|
|
|
return false, -1, err
|
|
|
}
|
|
|
|
|
@@ -286,7 +296,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)
|
|
|
+ serverResp, 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 {
|
|
@@ -295,7 +305,7 @@ func getExecExitCode(cli *DockerCli, execID string) (bool, int, error) {
|
|
|
return false, -1, nil
|
|
|
}
|
|
|
|
|
|
- defer stream.Close()
|
|
|
+ defer serverResp.body.Close()
|
|
|
|
|
|
//TODO: Should we reconsider having a type in api/types?
|
|
|
//this is a response to exex/id/json not container
|
|
@@ -304,7 +314,7 @@ func getExecExitCode(cli *DockerCli, execID string) (bool, int, error) {
|
|
|
ExitCode int
|
|
|
}
|
|
|
|
|
|
- if err := json.NewDecoder(stream).Decode(&c); err != nil {
|
|
|
+ if err := json.NewDecoder(serverResp.body).Decode(&c); err != nil {
|
|
|
return false, -1, err
|
|
|
}
|
|
|
|
|
@@ -354,16 +364,16 @@ func (cli *DockerCli) getTtySize() (int, int) {
|
|
|
return int(ws.Height), int(ws.Width)
|
|
|
}
|
|
|
|
|
|
-func readBody(stream io.ReadCloser, hdr http.Header, statusCode int, err error) ([]byte, int, error) {
|
|
|
- if stream != nil {
|
|
|
- defer stream.Close()
|
|
|
+func readBody(serverResp *serverResponse, err error) ([]byte, int, error) {
|
|
|
+ if serverResp.body != nil {
|
|
|
+ defer serverResp.body.Close()
|
|
|
}
|
|
|
if err != nil {
|
|
|
- return nil, statusCode, err
|
|
|
+ return nil, serverResp.statusCode, err
|
|
|
}
|
|
|
- body, err := ioutil.ReadAll(stream)
|
|
|
+ body, err := ioutil.ReadAll(serverResp.body)
|
|
|
if err != nil {
|
|
|
return nil, -1, err
|
|
|
}
|
|
|
- return body, statusCode, nil
|
|
|
+ return body, serverResp.statusCode, nil
|
|
|
}
|