Selaa lähdekoodia

Merge pull request #19984 from calavera/vendor_engine_api_master

Vendor engine-api with client context changes.
Tibor Vass 9 vuotta sitten
vanhempi
commit
da58ee42bb
54 muutettua tiedostoa jossa 714 lisäystä ja 195 poistoa
  1. 11 9
      api/client/build.go
  2. 17 5
      api/client/cli.go
  3. 4 2
      api/client/cp.go
  4. 3 1
      api/client/create.go
  5. 3 1
      api/client/events.go
  6. 3 1
      api/client/export.go
  7. 3 1
      api/client/import.go
  8. 3 1
      api/client/load.go
  9. 3 1
      api/client/logs.go
  10. 3 1
      api/client/pull.go
  11. 3 1
      api/client/push.go
  12. 4 2
      api/client/run.go
  13. 3 1
      api/client/save.go
  14. 4 2
      api/client/stats.go
  15. 3 1
      api/client/wait.go
  16. 3 3
      hack/vendor.sh
  17. 1 1
      integration-cli/docker_utils.go
  18. 1 1
      pkg/plugins/client.go
  19. 1 1
      vendor/src/github.com/Microsoft/go-winio/sd.go
  20. 34 52
      vendor/src/github.com/docker/engine-api/client/client.go
  21. 1 1
      vendor/src/github.com/docker/engine-api/client/client_unix.go
  22. 4 2
      vendor/src/github.com/docker/engine-api/client/container_stats.go
  23. 6 4
      vendor/src/github.com/docker/engine-api/client/copy.go
  24. 4 2
      vendor/src/github.com/docker/engine-api/client/events.go
  25. 4 2
      vendor/src/github.com/docker/engine-api/client/export.go
  26. 6 2
      vendor/src/github.com/docker/engine-api/client/hijack.go
  27. 4 2
      vendor/src/github.com/docker/engine-api/client/image_build.go
  28. 6 4
      vendor/src/github.com/docker/engine-api/client/image_create.go
  29. 4 2
      vendor/src/github.com/docker/engine-api/client/image_import.go
  30. 9 2
      vendor/src/github.com/docker/engine-api/client/image_load.go
  31. 5 3
      vendor/src/github.com/docker/engine-api/client/image_pull.go
  32. 7 5
      vendor/src/github.com/docker/engine-api/client/image_push.go
  33. 4 2
      vendor/src/github.com/docker/engine-api/client/image_save.go
  34. 16 14
      vendor/src/github.com/docker/engine-api/client/interface.go
  35. 4 2
      vendor/src/github.com/docker/engine-api/client/logs.go
  36. 35 16
      vendor/src/github.com/docker/engine-api/client/request.go
  37. 23 0
      vendor/src/github.com/docker/engine-api/client/transport/cancellable/canceler.go
  38. 27 0
      vendor/src/github.com/docker/engine-api/client/transport/cancellable/canceler_go14.go
  39. 113 0
      vendor/src/github.com/docker/engine-api/client/transport/cancellable/cancellable.go
  40. 47 0
      vendor/src/github.com/docker/engine-api/client/transport/client.go
  41. 26 0
      vendor/src/github.com/docker/engine-api/client/transport/client_mock.go
  42. 57 0
      vendor/src/github.com/docker/engine-api/client/transport/transport.go
  43. 4 2
      vendor/src/github.com/docker/engine-api/client/wait.go
  44. 0 6
      vendor/src/github.com/docker/engine-api/types/container/hostconfig_unix.go
  45. 0 5
      vendor/src/github.com/docker/engine-api/types/container/hostconfig_windows.go
  46. 2 0
      vendor/src/github.com/docker/engine-api/types/types.go
  47. 89 0
      vendor/src/github.com/docker/go-connections/sockets/inmem_socket.go
  48. 35 0
      vendor/src/github.com/docker/go-connections/sockets/sockets.go
  49. 15 0
      vendor/src/github.com/docker/go-connections/sockets/sockets_unix.go
  50. 13 0
      vendor/src/github.com/docker/go-connections/sockets/sockets_windows.go
  51. 0 21
      vendor/src/github.com/docker/go-connections/sockets/tcp_socket.go
  52. 2 8
      vendor/src/github.com/docker/go-connections/tlsconfig/config.go
  53. 17 0
      vendor/src/github.com/docker/go-connections/tlsconfig/config_client_ciphers.go
  54. 15 0
      vendor/src/github.com/docker/go-connections/tlsconfig/config_legacy_client_ciphers.go

+ 11 - 9
api/client/build.go

@@ -14,6 +14,8 @@ import (
 	"runtime"
 	"runtime"
 	"strings"
 	"strings"
 
 
+	"golang.org/x/net/context"
+
 	"github.com/docker/docker/api"
 	"github.com/docker/docker/api"
 	"github.com/docker/docker/builder/dockerignore"
 	"github.com/docker/docker/builder/dockerignore"
 	Cli "github.com/docker/docker/cli"
 	Cli "github.com/docker/docker/cli"
@@ -77,8 +79,8 @@ func (cli *DockerCli) CmdBuild(args ...string) error {
 	cmd.ParseFlags(args, true)
 	cmd.ParseFlags(args, true)
 
 
 	var (
 	var (
-		context io.ReadCloser
-		err     error
+		ctx io.ReadCloser
+		err error
 	)
 	)
 
 
 	specifiedContext := cmd.Arg(0)
 	specifiedContext := cmd.Arg(0)
@@ -100,11 +102,11 @@ func (cli *DockerCli) CmdBuild(args ...string) error {
 
 
 	switch {
 	switch {
 	case specifiedContext == "-":
 	case specifiedContext == "-":
-		context, relDockerfile, err = getContextFromReader(cli.in, *dockerfileName)
+		ctx, relDockerfile, err = getContextFromReader(cli.in, *dockerfileName)
 	case urlutil.IsGitURL(specifiedContext):
 	case urlutil.IsGitURL(specifiedContext):
 		tempDir, relDockerfile, err = getContextFromGitURL(specifiedContext, *dockerfileName)
 		tempDir, relDockerfile, err = getContextFromGitURL(specifiedContext, *dockerfileName)
 	case urlutil.IsURL(specifiedContext):
 	case urlutil.IsURL(specifiedContext):
-		context, relDockerfile, err = getContextFromURL(progBuff, specifiedContext, *dockerfileName)
+		ctx, relDockerfile, err = getContextFromURL(progBuff, specifiedContext, *dockerfileName)
 	default:
 	default:
 		contextDir, relDockerfile, err = getContextFromLocalDir(specifiedContext, *dockerfileName)
 		contextDir, relDockerfile, err = getContextFromLocalDir(specifiedContext, *dockerfileName)
 	}
 	}
@@ -121,7 +123,7 @@ func (cli *DockerCli) CmdBuild(args ...string) error {
 		contextDir = tempDir
 		contextDir = tempDir
 	}
 	}
 
 
-	if context == nil {
+	if ctx == nil {
 		// And canonicalize dockerfile name to a platform-independent one
 		// And canonicalize dockerfile name to a platform-independent one
 		relDockerfile, err = archive.CanonicalTarNameForPath(relDockerfile)
 		relDockerfile, err = archive.CanonicalTarNameForPath(relDockerfile)
 		if err != nil {
 		if err != nil {
@@ -159,7 +161,7 @@ func (cli *DockerCli) CmdBuild(args ...string) error {
 			includes = append(includes, ".dockerignore", relDockerfile)
 			includes = append(includes, ".dockerignore", relDockerfile)
 		}
 		}
 
 
-		context, err = archive.TarWithOptions(contextDir, &archive.TarOptions{
+		ctx, err = archive.TarWithOptions(contextDir, &archive.TarOptions{
 			Compression:     archive.Uncompressed,
 			Compression:     archive.Uncompressed,
 			ExcludePatterns: excludes,
 			ExcludePatterns: excludes,
 			IncludeFiles:    includes,
 			IncludeFiles:    includes,
@@ -173,13 +175,13 @@ func (cli *DockerCli) CmdBuild(args ...string) error {
 	if isTrusted() {
 	if isTrusted() {
 		// Wrap the tar archive to replace the Dockerfile entry with the rewritten
 		// Wrap the tar archive to replace the Dockerfile entry with the rewritten
 		// Dockerfile which uses trusted pulls.
 		// Dockerfile which uses trusted pulls.
-		context = replaceDockerfileTarWrapper(context, relDockerfile, cli.trustedReference, &resolvedTags)
+		ctx = replaceDockerfileTarWrapper(ctx, relDockerfile, cli.trustedReference, &resolvedTags)
 	}
 	}
 
 
 	// Setup an upload progress bar
 	// Setup an upload progress bar
 	progressOutput := streamformatter.NewStreamFormatter().NewProgressOutput(progBuff, true)
 	progressOutput := streamformatter.NewStreamFormatter().NewProgressOutput(progBuff, true)
 
 
-	var body io.Reader = progress.NewProgressReader(context, progressOutput, 0, "", "Sending build context to Docker daemon")
+	var body io.Reader = progress.NewProgressReader(ctx, progressOutput, 0, "", "Sending build context to Docker daemon")
 
 
 	var memory int64
 	var memory int64
 	if *flMemoryString != "" {
 	if *flMemoryString != "" {
@@ -235,7 +237,7 @@ func (cli *DockerCli) CmdBuild(args ...string) error {
 		AuthConfigs:    cli.configFile.AuthConfigs,
 		AuthConfigs:    cli.configFile.AuthConfigs,
 	}
 	}
 
 
-	response, err := cli.client.ImageBuild(options)
+	response, err := cli.client.ImageBuild(context.Background(), options)
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}

+ 17 - 5
api/client/cli.go

@@ -15,6 +15,7 @@ import (
 	"github.com/docker/docker/opts"
 	"github.com/docker/docker/opts"
 	"github.com/docker/docker/pkg/term"
 	"github.com/docker/docker/pkg/term"
 	"github.com/docker/engine-api/client"
 	"github.com/docker/engine-api/client"
+	"github.com/docker/go-connections/sockets"
 	"github.com/docker/go-connections/tlsconfig"
 	"github.com/docker/go-connections/tlsconfig"
 )
 )
 
 
@@ -142,12 +143,12 @@ func NewDockerCli(in io.ReadCloser, out, err io.Writer, clientFlags *cli.ClientF
 			verStr = tmpStr
 			verStr = tmpStr
 		}
 		}
 
 
-		clientTransport, err := newClientTransport(clientFlags.Common.TLSOptions)
+		httpClient, err := newHTTPClient(host, clientFlags.Common.TLSOptions)
 		if err != nil {
 		if err != nil {
 			return err
 			return err
 		}
 		}
 
 
-		client, err := client.NewClient(host, verStr, clientTransport, customHeaders)
+		client, err := client.NewClient(host, verStr, httpClient, customHeaders)
 		if err != nil {
 		if err != nil {
 			return err
 			return err
 		}
 		}
@@ -180,16 +181,27 @@ func getServerHost(hosts []string, tlsOptions *tlsconfig.Options) (host string,
 	return
 	return
 }
 }
 
 
-func newClientTransport(tlsOptions *tlsconfig.Options) (*http.Transport, error) {
+func newHTTPClient(host string, tlsOptions *tlsconfig.Options) (*http.Client, error) {
 	if tlsOptions == nil {
 	if tlsOptions == nil {
-		return &http.Transport{}, nil
+		// let the api client configure the default transport.
+		return nil, nil
 	}
 	}
 
 
 	config, err := tlsconfig.Client(*tlsOptions)
 	config, err := tlsconfig.Client(*tlsOptions)
 	if err != nil {
 	if err != nil {
 		return nil, err
 		return nil, err
 	}
 	}
-	return &http.Transport{
+	tr := &http.Transport{
 		TLSClientConfig: config,
 		TLSClientConfig: config,
+	}
+	proto, addr, _, err := client.ParseHost(host)
+	if err != nil {
+		return nil, err
+	}
+
+	sockets.ConfigureTransport(tr, proto, addr)
+
+	return &http.Client{
+		Transport: tr,
 	}, nil
 	}, nil
 }
 }

+ 4 - 2
api/client/cp.go

@@ -7,6 +7,8 @@ import (
 	"path/filepath"
 	"path/filepath"
 	"strings"
 	"strings"
 
 
+	"golang.org/x/net/context"
+
 	Cli "github.com/docker/docker/cli"
 	Cli "github.com/docker/docker/cli"
 	"github.com/docker/docker/pkg/archive"
 	"github.com/docker/docker/pkg/archive"
 	flag "github.com/docker/docker/pkg/mflag"
 	flag "github.com/docker/docker/pkg/mflag"
@@ -165,7 +167,7 @@ func (cli *DockerCli) copyFromContainer(srcContainer, srcPath, dstPath string, c
 
 
 	}
 	}
 
 
-	content, stat, err := cli.client.CopyFromContainer(srcContainer, srcPath)
+	content, stat, err := cli.client.CopyFromContainer(context.Background(), srcContainer, srcPath)
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}
@@ -292,5 +294,5 @@ func (cli *DockerCli) copyToContainer(srcPath, dstContainer, dstPath string, cpP
 		AllowOverwriteDirWithFile: false,
 		AllowOverwriteDirWithFile: false,
 	}
 	}
 
 
-	return cli.client.CopyToContainer(options)
+	return cli.client.CopyToContainer(context.Background(), options)
 }
 }

+ 3 - 1
api/client/create.go

@@ -5,6 +5,8 @@ import (
 	"io"
 	"io"
 	"os"
 	"os"
 
 
+	"golang.org/x/net/context"
+
 	Cli "github.com/docker/docker/cli"
 	Cli "github.com/docker/docker/cli"
 	"github.com/docker/docker/pkg/jsonmessage"
 	"github.com/docker/docker/pkg/jsonmessage"
 	"github.com/docker/docker/reference"
 	"github.com/docker/docker/reference"
@@ -52,7 +54,7 @@ func (cli *DockerCli) pullImageCustomOut(image string, out io.Writer) error {
 		RegistryAuth: encodedAuth,
 		RegistryAuth: encodedAuth,
 	}
 	}
 
 
-	responseBody, err := cli.client.ImageCreate(options)
+	responseBody, err := cli.client.ImageCreate(context.Background(), options)
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}

+ 3 - 1
api/client/events.go

@@ -8,6 +8,8 @@ import (
 	"strings"
 	"strings"
 	"time"
 	"time"
 
 
+	"golang.org/x/net/context"
+
 	Cli "github.com/docker/docker/cli"
 	Cli "github.com/docker/docker/cli"
 	"github.com/docker/docker/opts"
 	"github.com/docker/docker/opts"
 	"github.com/docker/docker/pkg/jsonlog"
 	"github.com/docker/docker/pkg/jsonlog"
@@ -48,7 +50,7 @@ func (cli *DockerCli) CmdEvents(args ...string) error {
 		Filters: eventFilterArgs,
 		Filters: eventFilterArgs,
 	}
 	}
 
 
-	responseBody, err := cli.client.Events(options)
+	responseBody, err := cli.client.Events(context.Background(), options)
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}

+ 3 - 1
api/client/export.go

@@ -4,6 +4,8 @@ import (
 	"errors"
 	"errors"
 	"io"
 	"io"
 
 
+	"golang.org/x/net/context"
+
 	Cli "github.com/docker/docker/cli"
 	Cli "github.com/docker/docker/cli"
 	flag "github.com/docker/docker/pkg/mflag"
 	flag "github.com/docker/docker/pkg/mflag"
 )
 )
@@ -24,7 +26,7 @@ func (cli *DockerCli) CmdExport(args ...string) error {
 		return errors.New("Cowardly refusing to save to a terminal. Use the -o flag or redirect.")
 		return errors.New("Cowardly refusing to save to a terminal. Use the -o flag or redirect.")
 	}
 	}
 
 
-	responseBody, err := cli.client.ContainerExport(cmd.Arg(0))
+	responseBody, err := cli.client.ContainerExport(context.Background(), cmd.Arg(0))
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}

+ 3 - 1
api/client/import.go

@@ -5,6 +5,8 @@ import (
 	"io"
 	"io"
 	"os"
 	"os"
 
 
+	"golang.org/x/net/context"
+
 	Cli "github.com/docker/docker/cli"
 	Cli "github.com/docker/docker/cli"
 	"github.com/docker/docker/opts"
 	"github.com/docker/docker/opts"
 	"github.com/docker/docker/pkg/jsonmessage"
 	"github.com/docker/docker/pkg/jsonmessage"
@@ -70,7 +72,7 @@ func (cli *DockerCli) CmdImport(args ...string) error {
 		Changes:        changes,
 		Changes:        changes,
 	}
 	}
 
 
-	responseBody, err := cli.client.ImageImport(options)
+	responseBody, err := cli.client.ImageImport(context.Background(), options)
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}

+ 3 - 1
api/client/load.go

@@ -4,6 +4,8 @@ import (
 	"io"
 	"io"
 	"os"
 	"os"
 
 
+	"golang.org/x/net/context"
+
 	Cli "github.com/docker/docker/cli"
 	Cli "github.com/docker/docker/cli"
 	"github.com/docker/docker/pkg/jsonmessage"
 	"github.com/docker/docker/pkg/jsonmessage"
 	flag "github.com/docker/docker/pkg/mflag"
 	flag "github.com/docker/docker/pkg/mflag"
@@ -30,7 +32,7 @@ func (cli *DockerCli) CmdLoad(args ...string) error {
 		input = file
 		input = file
 	}
 	}
 
 
-	response, err := cli.client.ImageLoad(input)
+	response, err := cli.client.ImageLoad(context.Background(), input, true)
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}

+ 3 - 1
api/client/logs.go

@@ -4,6 +4,8 @@ import (
 	"fmt"
 	"fmt"
 	"io"
 	"io"
 
 
+	"golang.org/x/net/context"
+
 	Cli "github.com/docker/docker/cli"
 	Cli "github.com/docker/docker/cli"
 	flag "github.com/docker/docker/pkg/mflag"
 	flag "github.com/docker/docker/pkg/mflag"
 	"github.com/docker/docker/pkg/stdcopy"
 	"github.com/docker/docker/pkg/stdcopy"
@@ -48,7 +50,7 @@ func (cli *DockerCli) CmdLogs(args ...string) error {
 		Follow:      *follow,
 		Follow:      *follow,
 		Tail:        *tail,
 		Tail:        *tail,
 	}
 	}
-	responseBody, err := cli.client.ContainerLogs(options)
+	responseBody, err := cli.client.ContainerLogs(context.Background(), options)
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}

+ 3 - 1
api/client/pull.go

@@ -4,6 +4,8 @@ import (
 	"errors"
 	"errors"
 	"fmt"
 	"fmt"
 
 
+	"golang.org/x/net/context"
+
 	Cli "github.com/docker/docker/cli"
 	Cli "github.com/docker/docker/cli"
 	"github.com/docker/docker/pkg/jsonmessage"
 	"github.com/docker/docker/pkg/jsonmessage"
 	flag "github.com/docker/docker/pkg/mflag"
 	flag "github.com/docker/docker/pkg/mflag"
@@ -77,7 +79,7 @@ func (cli *DockerCli) imagePullPrivileged(authConfig types.AuthConfig, imageID,
 		RegistryAuth: encodedAuth,
 		RegistryAuth: encodedAuth,
 	}
 	}
 
 
-	responseBody, err := cli.client.ImagePull(options, requestPrivilege)
+	responseBody, err := cli.client.ImagePull(context.Background(), options, requestPrivilege)
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}

+ 3 - 1
api/client/push.go

@@ -4,6 +4,8 @@ import (
 	"errors"
 	"errors"
 	"io"
 	"io"
 
 
+	"golang.org/x/net/context"
+
 	Cli "github.com/docker/docker/cli"
 	Cli "github.com/docker/docker/cli"
 	"github.com/docker/docker/pkg/jsonmessage"
 	"github.com/docker/docker/pkg/jsonmessage"
 	flag "github.com/docker/docker/pkg/mflag"
 	flag "github.com/docker/docker/pkg/mflag"
@@ -70,5 +72,5 @@ func (cli *DockerCli) imagePushPrivileged(authConfig types.AuthConfig, imageID,
 		RegistryAuth: encodedAuth,
 		RegistryAuth: encodedAuth,
 	}
 	}
 
 
-	return cli.client.ImagePush(options, requestPrivilege)
+	return cli.client.ImagePush(context.Background(), options, requestPrivilege)
 }
 }

+ 4 - 2
api/client/run.go

@@ -7,6 +7,8 @@ import (
 	"runtime"
 	"runtime"
 	"strings"
 	"strings"
 
 
+	"golang.org/x/net/context"
+
 	"github.com/Sirupsen/logrus"
 	"github.com/Sirupsen/logrus"
 	Cli "github.com/docker/docker/cli"
 	Cli "github.com/docker/docker/cli"
 	derr "github.com/docker/docker/errors"
 	derr "github.com/docker/docker/errors"
@@ -269,7 +271,7 @@ func (cli *DockerCli) CmdRun(args ...string) error {
 
 
 		// Autoremove: wait for the container to finish, retrieve
 		// Autoremove: wait for the container to finish, retrieve
 		// the exit code and remove the container
 		// the exit code and remove the container
-		if status, err = cli.client.ContainerWait(createResponse.ID); err != nil {
+		if status, err = cli.client.ContainerWait(context.Background(), createResponse.ID); err != nil {
 			return runStartContainerErr(err)
 			return runStartContainerErr(err)
 		}
 		}
 		if _, status, err = getExitCode(cli, createResponse.ID); err != nil {
 		if _, status, err = getExitCode(cli, createResponse.ID); err != nil {
@@ -279,7 +281,7 @@ func (cli *DockerCli) CmdRun(args ...string) error {
 		// No Autoremove: Simply retrieve the exit code
 		// No Autoremove: Simply retrieve the exit code
 		if !config.Tty {
 		if !config.Tty {
 			// In non-TTY mode, we can't detach, so we must wait for container exit
 			// In non-TTY mode, we can't detach, so we must wait for container exit
-			if status, err = cli.client.ContainerWait(createResponse.ID); err != nil {
+			if status, err = cli.client.ContainerWait(context.Background(), createResponse.ID); err != nil {
 				return err
 				return err
 			}
 			}
 		} else {
 		} else {

+ 3 - 1
api/client/save.go

@@ -4,6 +4,8 @@ import (
 	"errors"
 	"errors"
 	"io"
 	"io"
 
 
+	"golang.org/x/net/context"
+
 	Cli "github.com/docker/docker/cli"
 	Cli "github.com/docker/docker/cli"
 	flag "github.com/docker/docker/pkg/mflag"
 	flag "github.com/docker/docker/pkg/mflag"
 )
 )
@@ -24,7 +26,7 @@ func (cli *DockerCli) CmdSave(args ...string) error {
 		return errors.New("Cowardly refusing to save to a terminal. Use the -o flag or redirect.")
 		return errors.New("Cowardly refusing to save to a terminal. Use the -o flag or redirect.")
 	}
 	}
 
 
-	responseBody, err := cli.client.ImageSave(cmd.Args())
+	responseBody, err := cli.client.ImageSave(context.Background(), cmd.Args())
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}

+ 4 - 2
api/client/stats.go

@@ -10,6 +10,8 @@ import (
 	"text/tabwriter"
 	"text/tabwriter"
 	"time"
 	"time"
 
 
+	"golang.org/x/net/context"
+
 	Cli "github.com/docker/docker/cli"
 	Cli "github.com/docker/docker/cli"
 	"github.com/docker/engine-api/types"
 	"github.com/docker/engine-api/types"
 	"github.com/docker/engine-api/types/events"
 	"github.com/docker/engine-api/types/events"
@@ -37,7 +39,7 @@ type stats struct {
 }
 }
 
 
 func (s *containerStats) Collect(cli *DockerCli, streamStats bool) {
 func (s *containerStats) Collect(cli *DockerCli, streamStats bool) {
-	responseBody, err := cli.client.ContainerStats(s.Name, streamStats)
+	responseBody, err := cli.client.ContainerStats(context.Background(), s.Name, streamStats)
 	if err != nil {
 	if err != nil {
 		s.mu.Lock()
 		s.mu.Lock()
 		s.err = err
 		s.err = err
@@ -195,7 +197,7 @@ func (cli *DockerCli) CmdStats(args ...string) error {
 			options := types.EventsOptions{
 			options := types.EventsOptions{
 				Filters: f,
 				Filters: f,
 			}
 			}
-			resBody, err := cli.client.Events(options)
+			resBody, err := cli.client.Events(context.Background(), options)
 			if err != nil {
 			if err != nil {
 				c <- watch{err: err}
 				c <- watch{err: err}
 				return
 				return

+ 3 - 1
api/client/wait.go

@@ -4,6 +4,8 @@ import (
 	"fmt"
 	"fmt"
 	"strings"
 	"strings"
 
 
+	"golang.org/x/net/context"
+
 	Cli "github.com/docker/docker/cli"
 	Cli "github.com/docker/docker/cli"
 	flag "github.com/docker/docker/pkg/mflag"
 	flag "github.com/docker/docker/pkg/mflag"
 )
 )
@@ -21,7 +23,7 @@ func (cli *DockerCli) CmdWait(args ...string) error {
 
 
 	var errs []string
 	var errs []string
 	for _, name := range cmd.Args() {
 	for _, name := range cmd.Args() {
-		status, err := cli.client.ContainerWait(name)
+		status, err := cli.client.ContainerWait(context.Background(), name)
 		if err != nil {
 		if err != nil {
 			errs = append(errs, err.Error())
 			errs = append(errs, err.Error())
 		} else {
 		} else {

+ 3 - 3
hack/vendor.sh

@@ -7,7 +7,7 @@ source 'hack/.vendor-helpers.sh'
 
 
 # the following lines are in sorted order, FYI
 # the following lines are in sorted order, FYI
 clone git github.com/Azure/go-ansiterm 70b2c90b260171e829f1ebd7c17f600c11858dbe
 clone git github.com/Azure/go-ansiterm 70b2c90b260171e829f1ebd7c17f600c11858dbe
-clone git github.com/Microsoft/go-winio 2b085935f02c272e7a1855df6f8fe03029ffcadd
+clone git github.com/Microsoft/go-winio eb176a9831c54b88eaf9eb4fbc24b94080d910ad
 clone git github.com/Sirupsen/logrus v0.9.0 # logrus is a common dependency among multiple deps
 clone git github.com/Sirupsen/logrus v0.9.0 # logrus is a common dependency among multiple deps
 clone git github.com/docker/libtrust 9cbd2a1374f46905c68a4eb3694a130610adc62a
 clone git github.com/docker/libtrust 9cbd2a1374f46905c68a4eb3694a130610adc62a
 clone git github.com/go-check/check 11d3bc7aa68e238947792f30573146a3231fc0f1
 clone git github.com/go-check/check 11d3bc7aa68e238947792f30573146a3231fc0f1
@@ -23,8 +23,8 @@ clone git github.com/vdemeester/shakers 3c10293ce22b900c27acad7b28656196fcc2f73b
 clone git golang.org/x/net 47990a1ba55743e6ef1affd3a14e5bac8553615d https://github.com/golang/net.git
 clone git golang.org/x/net 47990a1ba55743e6ef1affd3a14e5bac8553615d https://github.com/golang/net.git
 clone git golang.org/x/sys eb2c74142fd19a79b3f237334c7384d5167b1b46 https://github.com/golang/sys.git
 clone git golang.org/x/sys eb2c74142fd19a79b3f237334c7384d5167b1b46 https://github.com/golang/sys.git
 clone git github.com/docker/go-units 651fc226e7441360384da338d0fd37f2440ffbe3
 clone git github.com/docker/go-units 651fc226e7441360384da338d0fd37f2440ffbe3
-clone git github.com/docker/go-connections v0.1.2
-clone git github.com/docker/engine-api bdbab71ec21209ef56dffdbe42c9d21843c30862
+clone git github.com/docker/go-connections v0.1.3
+clone git github.com/docker/engine-api 9a940e4ead265e18d4feb9e3c515428966a08278
 clone git github.com/RackSec/srslog 6eb773f331e46fbba8eecb8e794e635e75fc04de
 clone git github.com/RackSec/srslog 6eb773f331e46fbba8eecb8e794e635e75fc04de
 clone git github.com/imdario/mergo 0.2.1
 clone git github.com/imdario/mergo 0.2.1
 
 

+ 1 - 1
integration-cli/docker_utils.go

@@ -194,7 +194,7 @@ func (d *Daemon) getClientConfig() (*clientConfig, error) {
 		transport = &http.Transport{}
 		transport = &http.Transport{}
 	}
 	}
 
 
-	sockets.ConfigureTCPTransport(transport, proto, addr)
+	sockets.ConfigureTransport(transport, proto, addr)
 
 
 	return &clientConfig{
 	return &clientConfig{
 		transport: transport,
 		transport: transport,

+ 1 - 1
pkg/plugins/client.go

@@ -30,7 +30,7 @@ func NewClient(addr string, tlsConfig tlsconfig.Options) (*Client, error) {
 	tr.TLSClientConfig = c
 	tr.TLSClientConfig = c
 
 
 	protoAndAddr := strings.Split(addr, "://")
 	protoAndAddr := strings.Split(addr, "://")
-	sockets.ConfigureTCPTransport(tr, protoAndAddr[0], protoAndAddr[1])
+	sockets.ConfigureTransport(tr, protoAndAddr[0], protoAndAddr[1])
 
 
 	scheme := protoAndAddr[0]
 	scheme := protoAndAddr[0]
 	if scheme != "https" {
 	if scheme != "https" {

+ 1 - 1
vendor/src/github.com/Microsoft/go-winio/sd.go

@@ -65,7 +65,7 @@ func LookupSidByName(name string) (sid string, err error) {
 	if err != nil {
 	if err != nil {
 		return "", &AccountLookupError{name, err}
 		return "", &AccountLookupError{name, err}
 	}
 	}
-	sid = syscall.UTF16ToString((*[1 << 30]uint16)(unsafe.Pointer(strBuffer))[:])
+	sid = syscall.UTF16ToString((*[0xffff]uint16)(unsafe.Pointer(strBuffer))[:])
 	localFree(uintptr(unsafe.Pointer(strBuffer)))
 	localFree(uintptr(unsafe.Pointer(strBuffer)))
 	return sid, nil
 	return sid, nil
 }
 }

+ 34 - 52
vendor/src/github.com/docker/engine-api/client/client.go

@@ -1,16 +1,14 @@
 package client
 package client
 
 
 import (
 import (
-	"crypto/tls"
 	"fmt"
 	"fmt"
-	"net"
 	"net/http"
 	"net/http"
 	"net/url"
 	"net/url"
 	"os"
 	"os"
 	"path/filepath"
 	"path/filepath"
 	"strings"
 	"strings"
-	"time"
 
 
+	"github.com/docker/engine-api/client/transport"
 	"github.com/docker/go-connections/tlsconfig"
 	"github.com/docker/go-connections/tlsconfig"
 )
 )
 
 
@@ -21,17 +19,13 @@ type Client struct {
 	proto string
 	proto string
 	// addr holds the client address.
 	// addr holds the client address.
 	addr string
 	addr string
-	// basePath holds the path to prepend to the requests
+	// basePath holds the path to prepend to the requests.
 	basePath string
 	basePath string
-	// scheme holds the scheme of the client i.e. https.
-	scheme string
-	// tlsConfig holds the tls configuration to use in hijacked requests.
-	tlsConfig *tls.Config
-	// httpClient holds the client transport instance. Exported to keep the old code running.
-	httpClient *http.Client
+	// transport is the interface to sends request with, it implements transport.Client.
+	transport transport.Client
 	// version of the server to talk to.
 	// version of the server to talk to.
 	version string
 	version string
-	// custom http headers configured by users
+	// custom http headers configured by users.
 	customHTTPHeaders map[string]string
 	customHTTPHeaders map[string]string
 }
 }
 
 
@@ -41,7 +35,7 @@ type Client struct {
 // Use DOCKER_CERT_PATH to load the tls certificates from.
 // Use DOCKER_CERT_PATH to load the tls certificates from.
 // Use DOCKER_TLS_VERIFY to enable or disable TLS verification, off by default.
 // Use DOCKER_TLS_VERIFY to enable or disable TLS verification, off by default.
 func NewEnvClient() (*Client, error) {
 func NewEnvClient() (*Client, error) {
-	var transport *http.Transport
+	var client *http.Client
 	if dockerCertPath := os.Getenv("DOCKER_CERT_PATH"); dockerCertPath != "" {
 	if dockerCertPath := os.Getenv("DOCKER_CERT_PATH"); dockerCertPath != "" {
 		options := tlsconfig.Options{
 		options := tlsconfig.Options{
 			CAFile:             filepath.Join(dockerCertPath, "ca.pem"),
 			CAFile:             filepath.Join(dockerCertPath, "ca.pem"),
@@ -54,8 +48,10 @@ func NewEnvClient() (*Client, error) {
 			return nil, err
 			return nil, err
 		}
 		}
 
 
-		transport = &http.Transport{
-			TLSClientConfig: tlsc,
+		client = &http.Client{
+			Transport: &http.Transport{
+				TLSClientConfig: tlsc,
+			},
 		}
 		}
 	}
 	}
 
 
@@ -63,42 +59,29 @@ func NewEnvClient() (*Client, error) {
 	if host == "" {
 	if host == "" {
 		host = DefaultDockerHost
 		host = DefaultDockerHost
 	}
 	}
-	return NewClient(host, os.Getenv("DOCKER_API_VERSION"), transport, nil)
+	return NewClient(host, os.Getenv("DOCKER_API_VERSION"), client, nil)
 }
 }
 
 
 // NewClient initializes a new API client for the given host and API version.
 // NewClient initializes a new API client for the given host and API version.
 // It won't send any version information if the version number is empty.
 // It won't send any version information if the version number is empty.
-// It uses the transport to create a new http client.
+// It uses the given http client as transport.
 // It also initializes the custom http headers to add to each request.
 // It also initializes the custom http headers to add to each request.
-func NewClient(host string, version string, transport *http.Transport, httpHeaders map[string]string) (*Client, error) {
-	var (
-		basePath       string
-		scheme         = "http"
-		protoAddrParts = strings.SplitN(host, "://", 2)
-		proto, addr    = protoAddrParts[0], protoAddrParts[1]
-	)
-
-	if proto == "tcp" {
-		parsed, err := url.Parse("tcp://" + addr)
-		if err != nil {
-			return nil, err
-		}
-		addr = parsed.Host
-		basePath = parsed.Path
+func NewClient(host string, version string, client *http.Client, httpHeaders map[string]string) (*Client, error) {
+	proto, addr, basePath, err := ParseHost(host)
+	if err != nil {
+		return nil, err
 	}
 	}
 
 
-	transport = configureTransport(transport, proto, addr)
-	if transport.TLSClientConfig != nil {
-		scheme = "https"
+	transport, err := transport.NewTransportWithHTTP(proto, addr, client)
+	if err != nil {
+		return nil, err
 	}
 	}
 
 
 	return &Client{
 	return &Client{
 		proto:             proto,
 		proto:             proto,
 		addr:              addr,
 		addr:              addr,
 		basePath:          basePath,
 		basePath:          basePath,
-		scheme:            scheme,
-		tlsConfig:         transport.TLSClientConfig,
-		httpClient:        &http.Client{Transport: transport},
+		transport:         transport,
 		version:           version,
 		version:           version,
 		customHTTPHeaders: httpHeaders,
 		customHTTPHeaders: httpHeaders,
 	}, nil
 	}, nil
@@ -127,23 +110,22 @@ func (cli *Client) ClientVersion() string {
 	return cli.version
 	return cli.version
 }
 }
 
 
-func configureTransport(tr *http.Transport, proto, addr string) *http.Transport {
-	if tr == nil {
-		tr = &http.Transport{}
+// ParseHost verifies that the given host strings is valid.
+func ParseHost(host string) (string, string, string, error) {
+	protoAddrParts := strings.SplitN(host, "://", 2)
+	if len(protoAddrParts) == 1 {
+		return "", "", "", fmt.Errorf("unable to parse docker host `%s`", host)
 	}
 	}
 
 
-	// Why 32? See https://github.com/docker/docker/pull/8035.
-	timeout := 32 * time.Second
-	if proto == "unix" {
-		// No need for compression in local communications.
-		tr.DisableCompression = true
-		tr.Dial = func(_, _ string) (net.Conn, error) {
-			return net.DialTimeout(proto, addr, timeout)
+	var basePath string
+	proto, addr := protoAddrParts[0], protoAddrParts[1]
+	if proto == "tcp" {
+		parsed, err := url.Parse("tcp://" + addr)
+		if err != nil {
+			return "", "", "", err
 		}
 		}
-	} else {
-		tr.Proxy = http.ProxyFromEnvironment
-		tr.Dial = (&net.Dialer{Timeout: timeout}).Dial
+		addr = parsed.Host
+		basePath = parsed.Path
 	}
 	}
-
-	return tr
+	return proto, addr, basePath, nil
 }
 }

+ 1 - 1
vendor/src/github.com/docker/engine-api/client/client_unix.go

@@ -1,4 +1,4 @@
-// +build linux freebsd
+// +build linux freebsd solaris
 
 
 package client
 package client
 
 

+ 4 - 2
vendor/src/github.com/docker/engine-api/client/container_stats.go

@@ -3,18 +3,20 @@ package client
 import (
 import (
 	"io"
 	"io"
 	"net/url"
 	"net/url"
+
+	"golang.org/x/net/context"
 )
 )
 
 
 // ContainerStats returns near realtime stats for a given container.
 // ContainerStats returns near realtime stats for a given container.
 // It's up to the caller to close the io.ReadCloser returned.
 // It's up to the caller to close the io.ReadCloser returned.
-func (cli *Client) ContainerStats(containerID string, stream bool) (io.ReadCloser, error) {
+func (cli *Client) ContainerStats(ctx context.Context, containerID string, stream bool) (io.ReadCloser, error) {
 	query := url.Values{}
 	query := url.Values{}
 	query.Set("stream", "0")
 	query.Set("stream", "0")
 	if stream {
 	if stream {
 		query.Set("stream", "1")
 		query.Set("stream", "1")
 	}
 	}
 
 
-	resp, err := cli.get("/containers/"+containerID+"/stats", query, nil)
+	resp, err := cli.getWithContext(ctx, "/containers/"+containerID+"/stats", query, nil)
 	if err != nil {
 	if err != nil {
 		return nil, err
 		return nil, err
 	}
 	}

+ 6 - 4
vendor/src/github.com/docker/engine-api/client/copy.go

@@ -10,6 +10,8 @@ import (
 	"path/filepath"
 	"path/filepath"
 	"strings"
 	"strings"
 
 
+	"golang.org/x/net/context"
+
 	"github.com/docker/engine-api/types"
 	"github.com/docker/engine-api/types"
 )
 )
 
 
@@ -28,7 +30,7 @@ func (cli *Client) ContainerStatPath(containerID, path string) (types.ContainerP
 }
 }
 
 
 // CopyToContainer copies content into the container filesystem.
 // CopyToContainer copies content into the container filesystem.
-func (cli *Client) CopyToContainer(options types.CopyToContainerOptions) error {
+func (cli *Client) CopyToContainer(ctx context.Context, options types.CopyToContainerOptions) error {
 	query := url.Values{}
 	query := url.Values{}
 	query.Set("path", filepath.ToSlash(options.Path)) // Normalize the paths used in the API.
 	query.Set("path", filepath.ToSlash(options.Path)) // Normalize the paths used in the API.
 	// Do not allow for an existing directory to be overwritten by a non-directory and vice versa.
 	// Do not allow for an existing directory to be overwritten by a non-directory and vice versa.
@@ -38,7 +40,7 @@ func (cli *Client) CopyToContainer(options types.CopyToContainerOptions) error {
 
 
 	path := fmt.Sprintf("/containers/%s/archive", options.ContainerID)
 	path := fmt.Sprintf("/containers/%s/archive", options.ContainerID)
 
 
-	response, err := cli.putRaw(path, query, options.Content, nil)
+	response, err := cli.putRawWithContext(ctx, path, query, options.Content, nil)
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}
@@ -53,12 +55,12 @@ func (cli *Client) CopyToContainer(options types.CopyToContainerOptions) error {
 
 
 // CopyFromContainer get the content from the container and return it as a Reader
 // CopyFromContainer get the content from the container and return it as a Reader
 // to manipulate it in the host. It's up to the caller to close the reader.
 // to manipulate it in the host. It's up to the caller to close the reader.
-func (cli *Client) CopyFromContainer(containerID, srcPath string) (io.ReadCloser, types.ContainerPathStat, error) {
+func (cli *Client) CopyFromContainer(ctx context.Context, containerID, srcPath string) (io.ReadCloser, types.ContainerPathStat, error) {
 	query := make(url.Values, 1)
 	query := make(url.Values, 1)
 	query.Set("path", filepath.ToSlash(srcPath)) // Normalize the paths used in the API.
 	query.Set("path", filepath.ToSlash(srcPath)) // Normalize the paths used in the API.
 
 
 	apiPath := fmt.Sprintf("/containers/%s/archive", containerID)
 	apiPath := fmt.Sprintf("/containers/%s/archive", containerID)
-	response, err := cli.get(apiPath, query, nil)
+	response, err := cli.getWithContext(ctx, apiPath, query, nil)
 	if err != nil {
 	if err != nil {
 		return nil, types.ContainerPathStat{}, err
 		return nil, types.ContainerPathStat{}, err
 	}
 	}

+ 4 - 2
vendor/src/github.com/docker/engine-api/client/events.go

@@ -5,6 +5,8 @@ import (
 	"net/url"
 	"net/url"
 	"time"
 	"time"
 
 
+	"golang.org/x/net/context"
+
 	"github.com/docker/engine-api/types"
 	"github.com/docker/engine-api/types"
 	"github.com/docker/engine-api/types/filters"
 	"github.com/docker/engine-api/types/filters"
 	timetypes "github.com/docker/engine-api/types/time"
 	timetypes "github.com/docker/engine-api/types/time"
@@ -12,7 +14,7 @@ import (
 
 
 // Events returns a stream of events in the daemon in a ReadCloser.
 // Events returns a stream of events in the daemon in a ReadCloser.
 // It's up to the caller to close the stream.
 // It's up to the caller to close the stream.
-func (cli *Client) Events(options types.EventsOptions) (io.ReadCloser, error) {
+func (cli *Client) Events(ctx context.Context, options types.EventsOptions) (io.ReadCloser, error) {
 	query := url.Values{}
 	query := url.Values{}
 	ref := time.Now()
 	ref := time.Now()
 
 
@@ -38,7 +40,7 @@ func (cli *Client) Events(options types.EventsOptions) (io.ReadCloser, error) {
 		query.Set("filters", filterJSON)
 		query.Set("filters", filterJSON)
 	}
 	}
 
 
-	serverResponse, err := cli.get("/events", query, nil)
+	serverResponse, err := cli.getWithContext(ctx, "/events", query, nil)
 	if err != nil {
 	if err != nil {
 		return nil, err
 		return nil, err
 	}
 	}

+ 4 - 2
vendor/src/github.com/docker/engine-api/client/export.go

@@ -3,13 +3,15 @@ package client
 import (
 import (
 	"io"
 	"io"
 	"net/url"
 	"net/url"
+
+	"golang.org/x/net/context"
 )
 )
 
 
 // ContainerExport retrieves the raw contents of a container
 // ContainerExport retrieves the raw contents of a container
 // and returns them as a io.ReadCloser. It's up to the caller
 // and returns them as a io.ReadCloser. It's up to the caller
 // to close the stream.
 // to close the stream.
-func (cli *Client) ContainerExport(containerID string) (io.ReadCloser, error) {
-	serverResp, err := cli.get("/containers/"+containerID+"/export", url.Values{}, nil)
+func (cli *Client) ContainerExport(ctx context.Context, containerID string) (io.ReadCloser, error) {
+	serverResp, err := cli.getWithContext(ctx, "/containers/"+containerID+"/export", url.Values{}, nil)
 	if err != nil {
 	if err != nil {
 		return nil, err
 		return nil, err
 	}
 	}

+ 6 - 2
vendor/src/github.com/docker/engine-api/client/hijack.go

@@ -11,6 +11,7 @@ import (
 	"time"
 	"time"
 
 
 	"github.com/docker/engine-api/types"
 	"github.com/docker/engine-api/types"
+	"github.com/docker/go-connections/sockets"
 )
 )
 
 
 // tlsClientCon holds tls information and a dialed connection.
 // tlsClientCon holds tls information and a dialed connection.
@@ -44,7 +45,7 @@ func (cli *Client) postHijacked(path string, query url.Values, body interface{},
 	req.Header.Set("Connection", "Upgrade")
 	req.Header.Set("Connection", "Upgrade")
 	req.Header.Set("Upgrade", "tcp")
 	req.Header.Set("Upgrade", "tcp")
 
 
-	conn, err := dial(cli.proto, cli.addr, cli.tlsConfig)
+	conn, err := dial(cli.proto, cli.addr, cli.transport.TLSConfig())
 	if err != nil {
 	if err != nil {
 		if strings.Contains(err.Error(), "connection refused") {
 		if strings.Contains(err.Error(), "connection refused") {
 			return types.HijackedResponse{}, fmt.Errorf("Cannot connect to the Docker daemon. Is 'docker daemon' running on this host?")
 			return types.HijackedResponse{}, fmt.Errorf("Cannot connect to the Docker daemon. Is 'docker daemon' running on this host?")
@@ -156,9 +157,12 @@ func tlsDialWithDialer(dialer *net.Dialer, network, addr string, config *tls.Con
 }
 }
 
 
 func dial(proto, addr string, tlsConfig *tls.Config) (net.Conn, error) {
 func dial(proto, addr string, tlsConfig *tls.Config) (net.Conn, error) {
-	if tlsConfig != nil && proto != "unix" {
+	if tlsConfig != nil && proto != "unix" && proto != "npipe" {
 		// Notice this isn't Go standard's tls.Dial function
 		// Notice this isn't Go standard's tls.Dial function
 		return tlsDial(proto, addr, tlsConfig)
 		return tlsDial(proto, addr, tlsConfig)
 	}
 	}
+	if proto == "npipe" {
+		return sockets.DialPipe(addr, 32*time.Second)
+	}
 	return net.Dial(proto, addr)
 	return net.Dial(proto, addr)
 }
 }

+ 4 - 2
vendor/src/github.com/docker/engine-api/client/image_build.go

@@ -9,6 +9,8 @@ import (
 	"strconv"
 	"strconv"
 	"strings"
 	"strings"
 
 
+	"golang.org/x/net/context"
+
 	"github.com/docker/engine-api/types"
 	"github.com/docker/engine-api/types"
 	"github.com/docker/engine-api/types/container"
 	"github.com/docker/engine-api/types/container"
 )
 )
@@ -18,7 +20,7 @@ var headerRegexp = regexp.MustCompile(`\ADocker/.+\s\((.+)\)\z`)
 // ImageBuild sends request to the daemon to build images.
 // ImageBuild sends request to the daemon to build images.
 // The Body in the response implement an io.ReadCloser and it's up to the caller to
 // The Body in the response implement an io.ReadCloser and it's up to the caller to
 // close it.
 // close it.
-func (cli *Client) ImageBuild(options types.ImageBuildOptions) (types.ImageBuildResponse, error) {
+func (cli *Client) ImageBuild(ctx context.Context, options types.ImageBuildOptions) (types.ImageBuildResponse, error) {
 	query, err := imageBuildOptionsToQuery(options)
 	query, err := imageBuildOptionsToQuery(options)
 	if err != nil {
 	if err != nil {
 		return types.ImageBuildResponse{}, err
 		return types.ImageBuildResponse{}, err
@@ -32,7 +34,7 @@ func (cli *Client) ImageBuild(options types.ImageBuildOptions) (types.ImageBuild
 	headers.Add("X-Registry-Config", base64.URLEncoding.EncodeToString(buf))
 	headers.Add("X-Registry-Config", base64.URLEncoding.EncodeToString(buf))
 	headers.Set("Content-Type", "application/tar")
 	headers.Set("Content-Type", "application/tar")
 
 
-	serverResp, err := cli.postRaw("/build", query, options.Context, headers)
+	serverResp, err := cli.postRaw(ctx, "/build", query, options.Context, headers)
 	if err != nil {
 	if err != nil {
 		return types.ImageBuildResponse{}, err
 		return types.ImageBuildResponse{}, err
 	}
 	}

+ 6 - 4
vendor/src/github.com/docker/engine-api/client/image_create.go

@@ -4,23 +4,25 @@ import (
 	"io"
 	"io"
 	"net/url"
 	"net/url"
 
 
+	"golang.org/x/net/context"
+
 	"github.com/docker/engine-api/types"
 	"github.com/docker/engine-api/types"
 )
 )
 
 
 // ImageCreate creates a new image based in the parent options.
 // ImageCreate creates a new image based in the parent options.
 // It returns the JSON content in the response body.
 // It returns the JSON content in the response body.
-func (cli *Client) ImageCreate(options types.ImageCreateOptions) (io.ReadCloser, error) {
+func (cli *Client) ImageCreate(ctx context.Context, options types.ImageCreateOptions) (io.ReadCloser, error) {
 	query := url.Values{}
 	query := url.Values{}
 	query.Set("fromImage", options.Parent)
 	query.Set("fromImage", options.Parent)
 	query.Set("tag", options.Tag)
 	query.Set("tag", options.Tag)
-	resp, err := cli.tryImageCreate(query, options.RegistryAuth)
+	resp, err := cli.tryImageCreate(ctx, query, options.RegistryAuth)
 	if err != nil {
 	if err != nil {
 		return nil, err
 		return nil, err
 	}
 	}
 	return resp.body, nil
 	return resp.body, nil
 }
 }
 
 
-func (cli *Client) tryImageCreate(query url.Values, registryAuth string) (*serverResponse, error) {
+func (cli *Client) tryImageCreate(ctx context.Context, query url.Values, registryAuth string) (*serverResponse, error) {
 	headers := map[string][]string{"X-Registry-Auth": {registryAuth}}
 	headers := map[string][]string{"X-Registry-Auth": {registryAuth}}
-	return cli.post("/images/create", query, nil, headers)
+	return cli.postWithContext(ctx, "/images/create", query, nil, headers)
 }
 }

+ 4 - 2
vendor/src/github.com/docker/engine-api/client/image_import.go

@@ -4,12 +4,14 @@ import (
 	"io"
 	"io"
 	"net/url"
 	"net/url"
 
 
+	"golang.org/x/net/context"
+
 	"github.com/docker/engine-api/types"
 	"github.com/docker/engine-api/types"
 )
 )
 
 
 // ImageImport creates a new image based in the source options.
 // ImageImport creates a new image based in the source options.
 // It returns the JSON content in the response body.
 // It returns the JSON content in the response body.
-func (cli *Client) ImageImport(options types.ImageImportOptions) (io.ReadCloser, error) {
+func (cli *Client) ImageImport(ctx context.Context, options types.ImageImportOptions) (io.ReadCloser, error) {
 	query := url.Values{}
 	query := url.Values{}
 	query.Set("fromSrc", options.SourceName)
 	query.Set("fromSrc", options.SourceName)
 	query.Set("repo", options.RepositoryName)
 	query.Set("repo", options.RepositoryName)
@@ -19,7 +21,7 @@ func (cli *Client) ImageImport(options types.ImageImportOptions) (io.ReadCloser,
 		query.Add("changes", change)
 		query.Add("changes", change)
 	}
 	}
 
 
-	resp, err := cli.postRaw("/images/create", query, options.Source, nil)
+	resp, err := cli.postRaw(ctx, "/images/create", query, options.Source, nil)
 	if err != nil {
 	if err != nil {
 		return nil, err
 		return nil, err
 	}
 	}

+ 9 - 2
vendor/src/github.com/docker/engine-api/client/image_load.go

@@ -4,14 +4,21 @@ import (
 	"io"
 	"io"
 	"net/url"
 	"net/url"
 
 
+	"golang.org/x/net/context"
+
 	"github.com/docker/engine-api/types"
 	"github.com/docker/engine-api/types"
 )
 )
 
 
 // ImageLoad loads an image in the docker host from the client host.
 // ImageLoad loads an image in the docker host from the client host.
 // It's up to the caller to close the io.ReadCloser returned by
 // It's up to the caller to close the io.ReadCloser returned by
 // this function.
 // this function.
-func (cli *Client) ImageLoad(input io.Reader) (types.ImageLoadResponse, error) {
-	resp, err := cli.postRaw("/images/load", url.Values{}, input, nil)
+func (cli *Client) ImageLoad(ctx context.Context, input io.Reader, quiet bool) (types.ImageLoadResponse, error) {
+	v := url.Values{}
+	v.Set("quiet", "0")
+	if quiet {
+		v.Set("quiet", "1")
+	}
+	resp, err := cli.postRaw(ctx, "/images/load", v, input, nil)
 	if err != nil {
 	if err != nil {
 		return types.ImageLoadResponse{}, err
 		return types.ImageLoadResponse{}, err
 	}
 	}

+ 5 - 3
vendor/src/github.com/docker/engine-api/client/image_pull.go

@@ -5,6 +5,8 @@ import (
 	"net/http"
 	"net/http"
 	"net/url"
 	"net/url"
 
 
+	"golang.org/x/net/context"
+
 	"github.com/docker/engine-api/types"
 	"github.com/docker/engine-api/types"
 )
 )
 
 
@@ -12,20 +14,20 @@ import (
 // It executes the privileged function if the operation is unauthorized
 // It executes the privileged function if the operation is unauthorized
 // and it tries one more time.
 // and it tries one more time.
 // It's up to the caller to handle the io.ReadCloser and close it properly.
 // It's up to the caller to handle the io.ReadCloser and close it properly.
-func (cli *Client) ImagePull(options types.ImagePullOptions, privilegeFunc RequestPrivilegeFunc) (io.ReadCloser, error) {
+func (cli *Client) ImagePull(ctx context.Context, options types.ImagePullOptions, privilegeFunc RequestPrivilegeFunc) (io.ReadCloser, error) {
 	query := url.Values{}
 	query := url.Values{}
 	query.Set("fromImage", options.ImageID)
 	query.Set("fromImage", options.ImageID)
 	if options.Tag != "" {
 	if options.Tag != "" {
 		query.Set("tag", options.Tag)
 		query.Set("tag", options.Tag)
 	}
 	}
 
 
-	resp, err := cli.tryImageCreate(query, options.RegistryAuth)
+	resp, err := cli.tryImageCreate(ctx, query, options.RegistryAuth)
 	if resp.statusCode == http.StatusUnauthorized {
 	if resp.statusCode == http.StatusUnauthorized {
 		newAuthHeader, privilegeErr := privilegeFunc()
 		newAuthHeader, privilegeErr := privilegeFunc()
 		if privilegeErr != nil {
 		if privilegeErr != nil {
 			return nil, privilegeErr
 			return nil, privilegeErr
 		}
 		}
-		resp, err = cli.tryImageCreate(query, newAuthHeader)
+		resp, err = cli.tryImageCreate(ctx, query, newAuthHeader)
 	}
 	}
 	if err != nil {
 	if err != nil {
 		return nil, err
 		return nil, err

+ 7 - 5
vendor/src/github.com/docker/engine-api/client/image_push.go

@@ -5,6 +5,8 @@ import (
 	"net/http"
 	"net/http"
 	"net/url"
 	"net/url"
 
 
+	"golang.org/x/net/context"
+
 	"github.com/docker/engine-api/types"
 	"github.com/docker/engine-api/types"
 )
 )
 
 
@@ -12,17 +14,17 @@ import (
 // It executes the privileged function if the operation is unauthorized
 // It executes the privileged function if the operation is unauthorized
 // and it tries one more time.
 // and it tries one more time.
 // It's up to the caller to handle the io.ReadCloser and close it properly.
 // It's up to the caller to handle the io.ReadCloser and close it properly.
-func (cli *Client) ImagePush(options types.ImagePushOptions, privilegeFunc RequestPrivilegeFunc) (io.ReadCloser, error) {
+func (cli *Client) ImagePush(ctx context.Context, options types.ImagePushOptions, privilegeFunc RequestPrivilegeFunc) (io.ReadCloser, error) {
 	query := url.Values{}
 	query := url.Values{}
 	query.Set("tag", options.Tag)
 	query.Set("tag", options.Tag)
 
 
-	resp, err := cli.tryImagePush(options.ImageID, query, options.RegistryAuth)
+	resp, err := cli.tryImagePush(ctx, options.ImageID, query, options.RegistryAuth)
 	if resp.statusCode == http.StatusUnauthorized {
 	if resp.statusCode == http.StatusUnauthorized {
 		newAuthHeader, privilegeErr := privilegeFunc()
 		newAuthHeader, privilegeErr := privilegeFunc()
 		if privilegeErr != nil {
 		if privilegeErr != nil {
 			return nil, privilegeErr
 			return nil, privilegeErr
 		}
 		}
-		resp, err = cli.tryImagePush(options.ImageID, query, newAuthHeader)
+		resp, err = cli.tryImagePush(ctx, options.ImageID, query, newAuthHeader)
 	}
 	}
 	if err != nil {
 	if err != nil {
 		return nil, err
 		return nil, err
@@ -30,7 +32,7 @@ func (cli *Client) ImagePush(options types.ImagePushOptions, privilegeFunc Reque
 	return resp.body, nil
 	return resp.body, nil
 }
 }
 
 
-func (cli *Client) tryImagePush(imageID string, query url.Values, registryAuth string) (*serverResponse, error) {
+func (cli *Client) tryImagePush(ctx context.Context, imageID string, query url.Values, registryAuth string) (*serverResponse, error) {
 	headers := map[string][]string{"X-Registry-Auth": {registryAuth}}
 	headers := map[string][]string{"X-Registry-Auth": {registryAuth}}
-	return cli.post("/images/"+imageID+"/push", query, nil, headers)
+	return cli.postWithContext(ctx, "/images/"+imageID+"/push", query, nil, headers)
 }
 }

+ 4 - 2
vendor/src/github.com/docker/engine-api/client/image_save.go

@@ -3,16 +3,18 @@ package client
 import (
 import (
 	"io"
 	"io"
 	"net/url"
 	"net/url"
+
+	"golang.org/x/net/context"
 )
 )
 
 
 // ImageSave retrieves one or more images from the docker host as a io.ReadCloser.
 // ImageSave retrieves one or more images from the docker host as a io.ReadCloser.
 // It's up to the caller to store the images and close the stream.
 // It's up to the caller to store the images and close the stream.
-func (cli *Client) ImageSave(imageIDs []string) (io.ReadCloser, error) {
+func (cli *Client) ImageSave(ctx context.Context, imageIDs []string) (io.ReadCloser, error) {
 	query := url.Values{
 	query := url.Values{
 		"names": imageIDs,
 		"names": imageIDs,
 	}
 	}
 
 
-	resp, err := cli.get("/images/get", query, nil)
+	resp, err := cli.getWithContext(ctx, "/images/get", query, nil)
 	if err != nil {
 	if err != nil {
 		return nil, err
 		return nil, err
 	}
 	}

+ 16 - 14
vendor/src/github.com/docker/engine-api/client/interface.go

@@ -3,6 +3,8 @@ package client
 import (
 import (
 	"io"
 	"io"
 
 
+	"golang.org/x/net/context"
+
 	"github.com/docker/engine-api/types"
 	"github.com/docker/engine-api/types"
 	"github.com/docker/engine-api/types/container"
 	"github.com/docker/engine-api/types/container"
 	"github.com/docker/engine-api/types/filters"
 	"github.com/docker/engine-api/types/filters"
@@ -22,40 +24,40 @@ type APIClient interface {
 	ContainerExecInspect(execID string) (types.ContainerExecInspect, error)
 	ContainerExecInspect(execID string) (types.ContainerExecInspect, error)
 	ContainerExecResize(options types.ResizeOptions) error
 	ContainerExecResize(options types.ResizeOptions) error
 	ContainerExecStart(execID string, config types.ExecStartCheck) error
 	ContainerExecStart(execID string, config types.ExecStartCheck) error
-	ContainerExport(containerID string) (io.ReadCloser, error)
+	ContainerExport(ctx context.Context, containerID string) (io.ReadCloser, error)
 	ContainerInspect(containerID string) (types.ContainerJSON, error)
 	ContainerInspect(containerID string) (types.ContainerJSON, error)
 	ContainerInspectWithRaw(containerID string, getSize bool) (types.ContainerJSON, []byte, error)
 	ContainerInspectWithRaw(containerID string, getSize bool) (types.ContainerJSON, []byte, error)
 	ContainerKill(containerID, signal string) error
 	ContainerKill(containerID, signal string) error
 	ContainerList(options types.ContainerListOptions) ([]types.Container, error)
 	ContainerList(options types.ContainerListOptions) ([]types.Container, error)
-	ContainerLogs(options types.ContainerLogsOptions) (io.ReadCloser, error)
+	ContainerLogs(ctx context.Context, options types.ContainerLogsOptions) (io.ReadCloser, error)
 	ContainerPause(containerID string) error
 	ContainerPause(containerID string) error
 	ContainerRemove(options types.ContainerRemoveOptions) error
 	ContainerRemove(options types.ContainerRemoveOptions) error
 	ContainerRename(containerID, newContainerName string) error
 	ContainerRename(containerID, newContainerName string) error
 	ContainerResize(options types.ResizeOptions) error
 	ContainerResize(options types.ResizeOptions) error
 	ContainerRestart(containerID string, timeout int) error
 	ContainerRestart(containerID string, timeout int) error
 	ContainerStatPath(containerID, path string) (types.ContainerPathStat, error)
 	ContainerStatPath(containerID, path string) (types.ContainerPathStat, error)
-	ContainerStats(containerID string, stream bool) (io.ReadCloser, error)
+	ContainerStats(ctx context.Context, containerID string, stream bool) (io.ReadCloser, error)
 	ContainerStart(containerID string) error
 	ContainerStart(containerID string) error
 	ContainerStop(containerID string, timeout int) error
 	ContainerStop(containerID string, timeout int) error
 	ContainerTop(containerID string, arguments []string) (types.ContainerProcessList, error)
 	ContainerTop(containerID string, arguments []string) (types.ContainerProcessList, error)
 	ContainerUnpause(containerID string) error
 	ContainerUnpause(containerID string) error
 	ContainerUpdate(containerID string, updateConfig container.UpdateConfig) error
 	ContainerUpdate(containerID string, updateConfig container.UpdateConfig) error
-	ContainerWait(containerID string) (int, error)
-	CopyFromContainer(containerID, srcPath string) (io.ReadCloser, types.ContainerPathStat, error)
-	CopyToContainer(options types.CopyToContainerOptions) error
-	Events(options types.EventsOptions) (io.ReadCloser, error)
-	ImageBuild(options types.ImageBuildOptions) (types.ImageBuildResponse, error)
-	ImageCreate(options types.ImageCreateOptions) (io.ReadCloser, error)
+	ContainerWait(ctx context.Context, containerID string) (int, error)
+	CopyFromContainer(ctx context.Context, containerID, srcPath string) (io.ReadCloser, types.ContainerPathStat, error)
+	CopyToContainer(ctx context.Context, options types.CopyToContainerOptions) error
+	Events(ctx context.Context, options types.EventsOptions) (io.ReadCloser, error)
+	ImageBuild(ctx context.Context, options types.ImageBuildOptions) (types.ImageBuildResponse, error)
+	ImageCreate(ctx context.Context, options types.ImageCreateOptions) (io.ReadCloser, error)
 	ImageHistory(imageID string) ([]types.ImageHistory, error)
 	ImageHistory(imageID string) ([]types.ImageHistory, error)
-	ImageImport(options types.ImageImportOptions) (io.ReadCloser, error)
+	ImageImport(ctx context.Context, options types.ImageImportOptions) (io.ReadCloser, error)
 	ImageInspectWithRaw(imageID string, getSize bool) (types.ImageInspect, []byte, error)
 	ImageInspectWithRaw(imageID string, getSize bool) (types.ImageInspect, []byte, error)
 	ImageList(options types.ImageListOptions) ([]types.Image, error)
 	ImageList(options types.ImageListOptions) ([]types.Image, error)
-	ImageLoad(input io.Reader) (types.ImageLoadResponse, error)
-	ImagePull(options types.ImagePullOptions, privilegeFunc RequestPrivilegeFunc) (io.ReadCloser, error)
-	ImagePush(options types.ImagePushOptions, privilegeFunc RequestPrivilegeFunc) (io.ReadCloser, error)
+	ImageLoad(ctx context.Context, input io.Reader, quiet bool) (types.ImageLoadResponse, error)
+	ImagePull(ctx context.Context, options types.ImagePullOptions, privilegeFunc RequestPrivilegeFunc) (io.ReadCloser, error)
+	ImagePush(ctx context.Context, options types.ImagePushOptions, privilegeFunc RequestPrivilegeFunc) (io.ReadCloser, error)
 	ImageRemove(options types.ImageRemoveOptions) ([]types.ImageDelete, error)
 	ImageRemove(options types.ImageRemoveOptions) ([]types.ImageDelete, error)
 	ImageSearch(options types.ImageSearchOptions, privilegeFunc RequestPrivilegeFunc) ([]registry.SearchResult, error)
 	ImageSearch(options types.ImageSearchOptions, privilegeFunc RequestPrivilegeFunc) ([]registry.SearchResult, error)
-	ImageSave(imageIDs []string) (io.ReadCloser, error)
+	ImageSave(ctx context.Context, imageIDs []string) (io.ReadCloser, error)
 	ImageTag(options types.ImageTagOptions) error
 	ImageTag(options types.ImageTagOptions) error
 	Info() (types.Info, error)
 	Info() (types.Info, error)
 	NetworkConnect(networkID, containerID string, config *network.EndpointSettings) error
 	NetworkConnect(networkID, containerID string, config *network.EndpointSettings) error

+ 4 - 2
vendor/src/github.com/docker/engine-api/client/logs.go

@@ -5,13 +5,15 @@ import (
 	"net/url"
 	"net/url"
 	"time"
 	"time"
 
 
+	"golang.org/x/net/context"
+
 	"github.com/docker/engine-api/types"
 	"github.com/docker/engine-api/types"
 	timetypes "github.com/docker/engine-api/types/time"
 	timetypes "github.com/docker/engine-api/types/time"
 )
 )
 
 
 // ContainerLogs returns the logs generated by a container in an io.ReadCloser.
 // ContainerLogs returns the logs generated by a container in an io.ReadCloser.
 // It's up to the caller to close the stream.
 // It's up to the caller to close the stream.
-func (cli *Client) ContainerLogs(options types.ContainerLogsOptions) (io.ReadCloser, error) {
+func (cli *Client) ContainerLogs(ctx context.Context, options types.ContainerLogsOptions) (io.ReadCloser, error) {
 	query := url.Values{}
 	query := url.Values{}
 	if options.ShowStdout {
 	if options.ShowStdout {
 		query.Set("stdout", "1")
 		query.Set("stdout", "1")
@@ -38,7 +40,7 @@ func (cli *Client) ContainerLogs(options types.ContainerLogsOptions) (io.ReadClo
 	}
 	}
 	query.Set("tail", options.Tail)
 	query.Set("tail", options.Tail)
 
 
-	resp, err := cli.get("/containers/"+options.ContainerID+"/logs", query, nil)
+	resp, err := cli.getWithContext(ctx, "/containers/"+options.ContainerID+"/logs", query, nil)
 	if err != nil {
 	if err != nil {
 		return nil, err
 		return nil, err
 	}
 	}

+ 35 - 16
vendor/src/github.com/docker/engine-api/client/request.go

@@ -9,6 +9,10 @@ import (
 	"net/http"
 	"net/http"
 	"net/url"
 	"net/url"
 	"strings"
 	"strings"
+
+	"github.com/docker/engine-api/client/transport/cancellable"
+
+	"golang.org/x/net/context"
 )
 )
 
 
 // serverResponse is a wrapper for http API responses.
 // serverResponse is a wrapper for http API responses.
@@ -20,40 +24,55 @@ type serverResponse struct {
 
 
 // head sends an http request to the docker API using the method HEAD.
 // head sends an http request to the docker API using the method HEAD.
 func (cli *Client) head(path string, query url.Values, headers map[string][]string) (*serverResponse, error) {
 func (cli *Client) head(path string, query url.Values, headers map[string][]string) (*serverResponse, error) {
-	return cli.sendRequest("HEAD", path, query, nil, headers)
+	return cli.sendRequest(context.Background(), "HEAD", path, query, nil, headers)
 }
 }
 
 
 // get sends an http request to the docker API using the method GET.
 // get sends an http request to the docker API using the method GET.
 func (cli *Client) get(path string, query url.Values, headers map[string][]string) (*serverResponse, error) {
 func (cli *Client) get(path string, query url.Values, headers map[string][]string) (*serverResponse, error) {
-	return cli.sendRequest("GET", path, query, nil, headers)
+	return cli.getWithContext(context.Background(), path, query, headers)
+}
+
+// getWithContext sends an http request to the docker API using the method GET with a specific go context.
+func (cli *Client) getWithContext(ctx context.Context, path string, query url.Values, headers map[string][]string) (*serverResponse, error) {
+	return cli.sendRequest(ctx, "GET", path, query, nil, headers)
 }
 }
 
 
 // post sends an http request to the docker API using the method POST.
 // post sends an http request to the docker API using the method POST.
 func (cli *Client) post(path string, query url.Values, body interface{}, headers map[string][]string) (*serverResponse, error) {
 func (cli *Client) post(path string, query url.Values, body interface{}, headers map[string][]string) (*serverResponse, error) {
-	return cli.sendRequest("POST", path, query, body, headers)
+	return cli.postWithContext(context.Background(), path, query, body, headers)
 }
 }
 
 
-// postRaw sends the raw input to the docker API using the method POST.
-func (cli *Client) postRaw(path string, query url.Values, body io.Reader, headers map[string][]string) (*serverResponse, error) {
-	return cli.sendClientRequest("POST", path, query, body, headers)
+// postWithContext sends an http request to the docker API using the method POST with a specific go context.
+func (cli *Client) postWithContext(ctx context.Context, path string, query url.Values, body interface{}, headers map[string][]string) (*serverResponse, error) {
+	return cli.sendRequest(ctx, "POST", path, query, body, headers)
+}
+
+// postRaw sends the raw input to the docker API using the method POST with a specific go context.
+func (cli *Client) postRaw(ctx context.Context, path string, query url.Values, body io.Reader, headers map[string][]string) (*serverResponse, error) {
+	return cli.sendClientRequest(ctx, "POST", path, query, body, headers)
 }
 }
 
 
 // put sends an http request to the docker API using the method PUT.
 // put sends an http request to the docker API using the method PUT.
 func (cli *Client) put(path string, query url.Values, body interface{}, headers map[string][]string) (*serverResponse, error) {
 func (cli *Client) put(path string, query url.Values, body interface{}, headers map[string][]string) (*serverResponse, error) {
-	return cli.sendRequest("PUT", path, query, body, headers)
+	return cli.sendRequest(context.Background(), "PUT", path, query, body, headers)
 }
 }
 
 
 // putRaw sends the raw input to the docker API using the method PUT.
 // putRaw sends the raw input to the docker API using the method PUT.
 func (cli *Client) putRaw(path string, query url.Values, body io.Reader, headers map[string][]string) (*serverResponse, error) {
 func (cli *Client) putRaw(path string, query url.Values, body io.Reader, headers map[string][]string) (*serverResponse, error) {
-	return cli.sendClientRequest("PUT", path, query, body, headers)
+	return cli.putRawWithContext(context.Background(), path, query, body, headers)
+}
+
+// putRawWithContext sends the raw input to the docker API using the method PUT with a specific go context.
+func (cli *Client) putRawWithContext(ctx context.Context, path string, query url.Values, body io.Reader, headers map[string][]string) (*serverResponse, error) {
+	return cli.sendClientRequest(ctx, "PUT", path, query, body, headers)
 }
 }
 
 
 // delete sends an http request to the docker API using the method DELETE.
 // delete sends an http request to the docker API using the method DELETE.
 func (cli *Client) delete(path string, query url.Values, headers map[string][]string) (*serverResponse, error) {
 func (cli *Client) delete(path string, query url.Values, headers map[string][]string) (*serverResponse, error) {
-	return cli.sendRequest("DELETE", path, query, nil, headers)
+	return cli.sendRequest(context.Background(), "DELETE", path, query, nil, headers)
 }
 }
 
 
-func (cli *Client) sendRequest(method, path string, query url.Values, body interface{}, headers map[string][]string) (*serverResponse, error) {
+func (cli *Client) sendRequest(ctx context.Context, method, path string, query url.Values, body interface{}, headers map[string][]string) (*serverResponse, error) {
 	params, err := encodeData(body)
 	params, err := encodeData(body)
 	if err != nil {
 	if err != nil {
 		return nil, err
 		return nil, err
@@ -66,10 +85,10 @@ func (cli *Client) sendRequest(method, path string, query url.Values, body inter
 		headers["Content-Type"] = []string{"application/json"}
 		headers["Content-Type"] = []string{"application/json"}
 	}
 	}
 
 
-	return cli.sendClientRequest(method, path, query, params, headers)
+	return cli.sendClientRequest(ctx, method, path, query, params, headers)
 }
 }
 
 
-func (cli *Client) sendClientRequest(method, path string, query url.Values, body io.Reader, headers map[string][]string) (*serverResponse, error) {
+func (cli *Client) sendClientRequest(ctx context.Context, method, path string, query url.Values, body io.Reader, headers map[string][]string) (*serverResponse, error) {
 	serverResp := &serverResponse{
 	serverResp := &serverResponse{
 		body:       nil,
 		body:       nil,
 		statusCode: -1,
 		statusCode: -1,
@@ -82,13 +101,13 @@ func (cli *Client) sendClientRequest(method, path string, query url.Values, body
 
 
 	req, err := cli.newRequest(method, path, query, body, headers)
 	req, err := cli.newRequest(method, path, query, body, headers)
 	req.URL.Host = cli.addr
 	req.URL.Host = cli.addr
-	req.URL.Scheme = cli.scheme
+	req.URL.Scheme = cli.transport.Scheme()
 
 
 	if expectedPayload && req.Header.Get("Content-Type") == "" {
 	if expectedPayload && req.Header.Get("Content-Type") == "" {
 		req.Header.Set("Content-Type", "text/plain")
 		req.Header.Set("Content-Type", "text/plain")
 	}
 	}
 
 
-	resp, err := cli.httpClient.Do(req)
+	resp, err := cancellable.Do(ctx, cli.transport, req)
 	if resp != nil {
 	if resp != nil {
 		serverResp.statusCode = resp.StatusCode
 		serverResp.statusCode = resp.StatusCode
 	}
 	}
@@ -98,10 +117,10 @@ func (cli *Client) sendClientRequest(method, path string, query url.Values, body
 			return serverResp, ErrConnectionFailed
 			return serverResp, ErrConnectionFailed
 		}
 		}
 
 
-		if cli.scheme == "http" && strings.Contains(err.Error(), "malformed HTTP response") {
+		if !cli.transport.Secure() && strings.Contains(err.Error(), "malformed HTTP response") {
 			return serverResp, fmt.Errorf("%v.\n* Are you trying to connect to a TLS-enabled daemon without TLS?", err)
 			return serverResp, fmt.Errorf("%v.\n* Are you trying to connect to a TLS-enabled daemon without TLS?", err)
 		}
 		}
-		if cli.scheme == "https" && strings.Contains(err.Error(), "remote error: bad certificate") {
+		if cli.transport.Secure() && strings.Contains(err.Error(), "remote error: bad certificate") {
 			return serverResp, fmt.Errorf("The server probably has client authentication (--tlsverify) enabled. Please check your TLS client certification settings: %v", err)
 			return serverResp, fmt.Errorf("The server probably has client authentication (--tlsverify) enabled. Please check your TLS client certification settings: %v", err)
 		}
 		}
 
 

+ 23 - 0
vendor/src/github.com/docker/engine-api/client/transport/cancellable/canceler.go

@@ -0,0 +1,23 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build go1.5
+
+package cancellable
+
+import (
+	"net/http"
+
+	"github.com/docker/engine-api/client/transport"
+)
+
+func canceler(client transport.Sender, req *http.Request) func() {
+	// TODO(djd): Respect any existing value of req.Cancel.
+	ch := make(chan struct{})
+	req.Cancel = ch
+
+	return func() {
+		close(ch)
+	}
+}

+ 27 - 0
vendor/src/github.com/docker/engine-api/client/transport/cancellable/canceler_go14.go

@@ -0,0 +1,27 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !go1.5
+
+package cancellable
+
+import (
+	"net/http"
+
+	"github.com/docker/engine-api/client/transport"
+)
+
+type requestCanceler interface {
+	CancelRequest(*http.Request)
+}
+
+func canceler(client transport.Sender, req *http.Request) func() {
+	rc, ok := client.(requestCanceler)
+	if !ok {
+		return func() {}
+	}
+	return func() {
+		rc.CancelRequest(req)
+	}
+}

+ 113 - 0
vendor/src/github.com/docker/engine-api/client/transport/cancellable/cancellable.go

@@ -0,0 +1,113 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package cancellable provides helper function to cancel http requests.
+package cancellable
+
+import (
+	"io"
+	"net/http"
+
+	"github.com/docker/engine-api/client/transport"
+
+	"golang.org/x/net/context"
+)
+
+func nop() {}
+
+var (
+	testHookContextDoneBeforeHeaders = nop
+	testHookDoReturned               = nop
+	testHookDidBodyClose             = nop
+)
+
+// Do sends an HTTP request with the provided transport.Sender and returns an HTTP response.
+// If the client is nil, http.DefaultClient is used.
+// If the context is canceled or times out, ctx.Err() will be returned.
+//
+// FORK INFORMATION:
+//
+// This function deviates from the upstream version in golang.org/x/net/context/ctxhttp by
+// taking a Sender interface rather than a *http.Client directly. That allow us to use
+// this funcion with mocked clients and hijacked connections.
+func Do(ctx context.Context, client transport.Sender, req *http.Request) (*http.Response, error) {
+	if client == nil {
+		client = http.DefaultClient
+	}
+
+	// Request cancelation changed in Go 1.5, see canceler.go and canceler_go14.go.
+	cancel := canceler(client, req)
+
+	type responseAndError struct {
+		resp *http.Response
+		err  error
+	}
+	result := make(chan responseAndError, 1)
+
+	go func() {
+		resp, err := client.Do(req)
+		testHookDoReturned()
+		result <- responseAndError{resp, err}
+	}()
+
+	var resp *http.Response
+
+	select {
+	case <-ctx.Done():
+		testHookContextDoneBeforeHeaders()
+		cancel()
+		// Clean up after the goroutine calling client.Do:
+		go func() {
+			if r := <-result; r.resp != nil && r.resp.Body != nil {
+				testHookDidBodyClose()
+				r.resp.Body.Close()
+			}
+		}()
+		return nil, ctx.Err()
+	case r := <-result:
+		var err error
+		resp, err = r.resp, r.err
+		if err != nil {
+			return resp, err
+		}
+	}
+
+	c := make(chan struct{})
+	go func() {
+		select {
+		case <-ctx.Done():
+			cancel()
+		case <-c:
+			// The response's Body is closed.
+		}
+	}()
+	resp.Body = &notifyingReader{resp.Body, c}
+
+	return resp, nil
+}
+
+// notifyingReader is an io.ReadCloser that closes the notify channel after
+// Close is called or a Read fails on the underlying ReadCloser.
+type notifyingReader struct {
+	io.ReadCloser
+	notify chan<- struct{}
+}
+
+func (r *notifyingReader) Read(p []byte) (int, error) {
+	n, err := r.ReadCloser.Read(p)
+	if err != nil && r.notify != nil {
+		close(r.notify)
+		r.notify = nil
+	}
+	return n, err
+}
+
+func (r *notifyingReader) Close() error {
+	err := r.ReadCloser.Close()
+	if r.notify != nil {
+		close(r.notify)
+		r.notify = nil
+	}
+	return err
+}

+ 47 - 0
vendor/src/github.com/docker/engine-api/client/transport/client.go

@@ -0,0 +1,47 @@
+package transport
+
+import (
+	"crypto/tls"
+	"net/http"
+)
+
+// Sender is an interface that clients must implement
+// to be able to send requests to a remote connection.
+type Sender interface {
+	// Do sends request to a remote endpoint.
+	Do(*http.Request) (*http.Response, error)
+}
+
+// Client is an interface that abstracts all remote connections.
+type Client interface {
+	Sender
+	// Secure tells whether the connection is secure or not.
+	Secure() bool
+	// Scheme returns the connection protocol the client uses.
+	Scheme() string
+	// TLSConfig returns any TLS configuration the client uses.
+	TLSConfig() *tls.Config
+}
+
+// tlsInfo returns information about the TLS configuration.
+type tlsInfo struct {
+	tlsConfig *tls.Config
+}
+
+// TLSConfig returns the TLS configuration.
+func (t *tlsInfo) TLSConfig() *tls.Config {
+	return t.tlsConfig
+}
+
+// Scheme returns protocol scheme to use.
+func (t *tlsInfo) Scheme() string {
+	if t.tlsConfig != nil {
+		return "https"
+	}
+	return "http"
+}
+
+// Secure returns true if there is a TLS configuration.
+func (t *tlsInfo) Secure() bool {
+	return t.tlsConfig != nil
+}

+ 26 - 0
vendor/src/github.com/docker/engine-api/client/transport/client_mock.go

@@ -0,0 +1,26 @@
+// +build test
+
+package transport
+
+import (
+	"crypto/tls"
+	"net/http"
+)
+
+type mockClient struct {
+	*tlsInfo
+	do func(*http.Request) (*http.Response, error)
+}
+
+// NewMockClient returns a mocked client that runs the function supplied as `client.Do` call
+func NewMockClient(tlsConfig *tls.Config, doer func(*http.Request) (*http.Response, error)) Client {
+	return mockClient{
+		tlsInfo: &tlsInfo{tlsConfig},
+		do:      doer,
+	}
+}
+
+// Do executes the supplied function for the mock.
+func (m mockClient) Do(req *http.Request) (*http.Response, error) {
+	return m.do(req)
+}

+ 57 - 0
vendor/src/github.com/docker/engine-api/client/transport/transport.go

@@ -0,0 +1,57 @@
+// Package transport provides function to send request to remote endpoints.
+package transport
+
+import (
+	"fmt"
+	"net/http"
+
+	"github.com/docker/go-connections/sockets"
+)
+
+// apiTransport holds information about the http transport to connect with the API.
+type apiTransport struct {
+	*http.Client
+	*tlsInfo
+	transport *http.Transport
+}
+
+// NewTransportWithHTTP creates a new transport based on the provided proto, address and http client.
+// It uses Docker's default http transport configuration if the client is nil.
+// It does not modify the client's transport if it's not nil.
+func NewTransportWithHTTP(proto, addr string, client *http.Client) (Client, error) {
+	var transport *http.Transport
+
+	if client != nil {
+		tr, ok := client.Transport.(*http.Transport)
+		if !ok {
+			return nil, fmt.Errorf("unable to verify TLS configuration, invalid transport %v", client.Transport)
+		}
+		transport = tr
+	} else {
+		transport = defaultTransport(proto, addr)
+		client = &http.Client{
+			Transport: transport,
+		}
+	}
+
+	return &apiTransport{
+		Client:    client,
+		tlsInfo:   &tlsInfo{transport.TLSClientConfig},
+		transport: transport,
+	}, nil
+}
+
+// CancelRequest stops a request execution.
+func (a *apiTransport) CancelRequest(req *http.Request) {
+	a.transport.CancelRequest(req)
+}
+
+// defaultTransport creates a new http.Transport with Docker's
+// default transport configuration.
+func defaultTransport(proto, addr string) *http.Transport {
+	tr := new(http.Transport)
+	sockets.ConfigureTransport(tr, proto, addr)
+	return tr
+}
+
+var _ Client = &apiTransport{}

+ 4 - 2
vendor/src/github.com/docker/engine-api/client/wait.go

@@ -3,13 +3,15 @@ package client
 import (
 import (
 	"encoding/json"
 	"encoding/json"
 
 
+	"golang.org/x/net/context"
+
 	"github.com/docker/engine-api/types"
 	"github.com/docker/engine-api/types"
 )
 )
 
 
 // ContainerWait pauses execution util a container is exits.
 // ContainerWait pauses execution util a container is exits.
 // It returns the API status code as response of its readiness.
 // It returns the API status code as response of its readiness.
-func (cli *Client) ContainerWait(containerID string) (int, error) {
-	resp, err := cli.post("/containers/"+containerID+"/wait", nil, nil, nil)
+func (cli *Client) ContainerWait(ctx context.Context, containerID string) (int, error) {
+	resp, err := cli.postWithContext(ctx, "/containers/"+containerID+"/wait", nil, nil, nil)
 	if err != nil {
 	if err != nil {
 		return -1, err
 		return -1, err
 	}
 	}

+ 0 - 6
vendor/src/github.com/docker/engine-api/types/container/hostconfig_unix.go

@@ -72,12 +72,6 @@ func (n NetworkMode) IsUserDefined() bool {
 	return !n.IsDefault() && !n.IsBridge() && !n.IsHost() && !n.IsNone() && !n.IsContainer()
 	return !n.IsDefault() && !n.IsBridge() && !n.IsHost() && !n.IsNone() && !n.IsContainer()
 }
 }
 
 
-// IsPreDefinedNetwork indicates if a network is predefined by the daemon
-func IsPreDefinedNetwork(network string) bool {
-	n := NetworkMode(network)
-	return n.IsBridge() || n.IsHost() || n.IsNone()
-}
-
 //UserDefined indicates user-created network
 //UserDefined indicates user-created network
 func (n NetworkMode) UserDefined() string {
 func (n NetworkMode) UserDefined() string {
 	if n.IsUserDefined() {
 	if n.IsUserDefined() {

+ 0 - 5
vendor/src/github.com/docker/engine-api/types/container/hostconfig_windows.go

@@ -49,11 +49,6 @@ func (n NetworkMode) NetworkName() string {
 	return ""
 	return ""
 }
 }
 
 
-// IsPreDefinedNetwork indicates if a network is predefined by the daemon
-func IsPreDefinedNetwork(network string) bool {
-	return false
-}
-
 // ValidateNetMode ensures that the various combinations of requested
 // ValidateNetMode ensures that the various combinations of requested
 // network settings are valid.
 // network settings are valid.
 func ValidateNetMode(c *Config, hc *HostConfig) error {
 func ValidateNetMode(c *Config, hc *HostConfig) error {

+ 2 - 0
vendor/src/github.com/docker/engine-api/types/types.go

@@ -387,6 +387,7 @@ type NetworkResource struct {
 	ID         string `json:"Id"`
 	ID         string `json:"Id"`
 	Scope      string
 	Scope      string
 	Driver     string
 	Driver     string
+	EnableIPv6 bool
 	IPAM       network.IPAM
 	IPAM       network.IPAM
 	Internal   bool
 	Internal   bool
 	Containers map[string]EndpointResource
 	Containers map[string]EndpointResource
@@ -407,6 +408,7 @@ type NetworkCreate struct {
 	Name           string
 	Name           string
 	CheckDuplicate bool
 	CheckDuplicate bool
 	Driver         string
 	Driver         string
+	EnableIPv6     bool
 	IPAM           network.IPAM
 	IPAM           network.IPAM
 	Internal       bool
 	Internal       bool
 	Options        map[string]string
 	Options        map[string]string

+ 89 - 0
vendor/src/github.com/docker/go-connections/sockets/inmem_socket.go

@@ -0,0 +1,89 @@
+package sockets
+
+import (
+	"errors"
+	"net"
+	"sync"
+)
+
+var errClosed = errors.New("use of closed network connection")
+
+// InmemSocket implements net.Listener using in-memory only connections.
+type InmemSocket struct {
+	chConn  chan net.Conn
+	chClose chan struct{}
+	addr    string
+	mu      sync.Mutex
+}
+
+// dummyAddr is used to satisfy net.Addr for the in-mem socket
+// it is just stored as a string and returns the string for all calls
+type dummyAddr string
+
+// NewInmemSocket creates an in-memory only net.Listener
+// The addr argument can be any string, but is used to satisfy the `Addr()` part
+// of the net.Listener interface
+func NewInmemSocket(addr string, bufSize int) *InmemSocket {
+	return &InmemSocket{
+		chConn:  make(chan net.Conn, bufSize),
+		chClose: make(chan struct{}),
+		addr:    addr,
+	}
+}
+
+// Addr returns the socket's addr string to satisfy net.Listener
+func (s *InmemSocket) Addr() net.Addr {
+	return dummyAddr(s.addr)
+}
+
+// Accept implements the Accept method in the Listener interface; it waits for the next call and returns a generic Conn.
+func (s *InmemSocket) Accept() (net.Conn, error) {
+	select {
+	case conn := <-s.chConn:
+		return conn, nil
+	case <-s.chClose:
+		return nil, errClosed
+	}
+}
+
+// Close closes the listener. It will be unavailable for use once closed.
+func (s *InmemSocket) Close() error {
+	s.mu.Lock()
+	defer s.mu.Unlock()
+	select {
+	case <-s.chClose:
+	default:
+		close(s.chClose)
+	}
+	return nil
+}
+
+// Dial is used to establish a connection with the in-mem server
+func (s *InmemSocket) Dial(network, addr string) (net.Conn, error) {
+	srvConn, clientConn := net.Pipe()
+	select {
+	case s.chConn <- srvConn:
+	case <-s.chClose:
+		return nil, errClosed
+	}
+
+	return clientConn, nil
+}
+
+// Network returns the addr string, satisfies net.Addr
+func (a dummyAddr) Network() string {
+	return string(a)
+}
+
+// String returns the string form
+func (a dummyAddr) String() string {
+	return string(a)
+}
+
+// timeoutError is used when there is a timeout with a connection
+// this implements the net.Error interface
+type timeoutError struct{}
+
+func (e *timeoutError) Error() string   { return "i/o timeout" }
+func (e *timeoutError) Timeout() bool   { return true }
+func (e *timeoutError) Temporary() bool { return true }

+ 35 - 0
vendor/src/github.com/docker/go-connections/sockets/sockets.go

@@ -0,0 +1,35 @@
+// Package sockets provides helper functions to create and configure Unix or TCP sockets.
+package sockets
+
+import (
+	"net"
+	"net/http"
+	"time"
+)
+
+// Why 32? See https://github.com/docker/docker/pull/8035.
+const defaulTimeout = 32 * time.Second
+
+// ConfigureTransport configures the specified Transport according to the
+// specified proto and addr.
+// If the proto is unix (using a unix socket to communicate) the compression
+// is disabled.
+func ConfigureTransport(tr *http.Transport, proto, addr string) {
+	switch proto {
+	case "unix":
+		// No need for compression in local communications.
+		tr.DisableCompression = true
+		tr.Dial = func(_, _ string) (net.Conn, error) {
+			return net.DialTimeout(proto, addr, defaulTimeout)
+		}
+	case "npipe":
+		// No need for compression in local communications.
+		tr.DisableCompression = true
+		tr.Dial = func(_, _ string) (net.Conn, error) {
+			return DialPipe(addr, defaulTimeout)
+		}
+	default:
+		tr.Proxy = http.ProxyFromEnvironment
+		tr.Dial = (&net.Dialer{Timeout: defaulTimeout}).Dial
+	}
+}

+ 15 - 0
vendor/src/github.com/docker/go-connections/sockets/sockets_unix.go

@@ -0,0 +1,15 @@
+// +build !windows
+
+package sockets
+
+import (
+	"net"
+	"syscall"
+	"time"
+)
+
+// DialPipe connects to a Windows named pipe.
+// This is not supported on other OSes.
+func DialPipe(_ string, _ time.Duration) (net.Conn, error) {
+	return nil, syscall.EAFNOSUPPORT
+}

+ 13 - 0
vendor/src/github.com/docker/go-connections/sockets/sockets_windows.go

@@ -0,0 +1,13 @@
+package sockets
+
+import (
+	"net"
+	"time"
+
+	"github.com/Microsoft/go-winio"
+)
+
+// DialPipe connects to a Windows named pipe.
+func DialPipe(addr string, timeout time.Duration) (net.Conn, error) {
+	return winio.DialPipe(addr, &timeout)
+}

+ 0 - 21
vendor/src/github.com/docker/go-connections/sockets/tcp_socket.go

@@ -4,8 +4,6 @@ package sockets
 import (
 import (
 	"crypto/tls"
 	"crypto/tls"
 	"net"
 	"net"
-	"net/http"
-	"time"
 )
 )
 
 
 // NewTCPSocket creates a TCP socket listener with the specified address and
 // NewTCPSocket creates a TCP socket listener with the specified address and
@@ -22,22 +20,3 @@ func NewTCPSocket(addr string, tlsConfig *tls.Config) (net.Listener, error) {
 	}
 	}
 	return l, nil
 	return l, nil
 }
 }
-
-// ConfigureTCPTransport configures the specified Transport according to the
-// specified proto and addr.
-// If the proto is unix (using a unix socket to communicate) the compression
-// is disabled.
-func ConfigureTCPTransport(tr *http.Transport, proto, addr string) {
-	// Why 32? See https://github.com/docker/docker/pull/8035.
-	timeout := 32 * time.Second
-	if proto == "unix" {
-		// No need for compression in local communications.
-		tr.DisableCompression = true
-		tr.Dial = func(_, _ string) (net.Conn, error) {
-			return net.DialTimeout(proto, addr, timeout)
-		}
-	} else {
-		tr.Proxy = http.ProxyFromEnvironment
-		tr.Dial = (&net.Dialer{Timeout: timeout}).Dial
-	}
-}

+ 2 - 8
vendor/src/github.com/docker/go-connections/tlsconfig/config.go

@@ -41,12 +41,6 @@ var acceptedCBCCiphers = []uint16{
 	tls.TLS_RSA_WITH_AES_128_CBC_SHA,
 	tls.TLS_RSA_WITH_AES_128_CBC_SHA,
 }
 }
 
 
-// Client TLS cipher suites (dropping CBC ciphers for client preferred suite set)
-var clientCipherSuites = []uint16{
-	tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
-	tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
-}
-
 // DefaultServerAcceptedCiphers should be uses by code which already has a crypto/tls
 // DefaultServerAcceptedCiphers should be uses by code which already has a crypto/tls
 // options struct but wants to use a commonly accepted set of TLS cipher suites, with
 // options struct but wants to use a commonly accepted set of TLS cipher suites, with
 // known weak algorithms removed.
 // known weak algorithms removed.
@@ -91,7 +85,7 @@ func certPool(caFile string) (*x509.CertPool, error) {
 func Client(options Options) (*tls.Config, error) {
 func Client(options Options) (*tls.Config, error) {
 	tlsConfig := ClientDefault
 	tlsConfig := ClientDefault
 	tlsConfig.InsecureSkipVerify = options.InsecureSkipVerify
 	tlsConfig.InsecureSkipVerify = options.InsecureSkipVerify
-	if !options.InsecureSkipVerify {
+	if !options.InsecureSkipVerify && options.CAFile != "" {
 		CAs, err := certPool(options.CAFile)
 		CAs, err := certPool(options.CAFile)
 		if err != nil {
 		if err != nil {
 			return nil, err
 			return nil, err
@@ -99,7 +93,7 @@ func Client(options Options) (*tls.Config, error) {
 		tlsConfig.RootCAs = CAs
 		tlsConfig.RootCAs = CAs
 	}
 	}
 
 
-	if options.CertFile != "" && options.KeyFile != "" {
+	if options.CertFile != "" || options.KeyFile != "" {
 		tlsCert, err := tls.LoadX509KeyPair(options.CertFile, options.KeyFile)
 		tlsCert, err := tls.LoadX509KeyPair(options.CertFile, options.KeyFile)
 		if err != nil {
 		if err != nil {
 			return nil, fmt.Errorf("Could not load X509 key pair: %v. Make sure the key is not encrypted", err)
 			return nil, fmt.Errorf("Could not load X509 key pair: %v. Make sure the key is not encrypted", err)

+ 17 - 0
vendor/src/github.com/docker/go-connections/tlsconfig/config_client_ciphers.go

@@ -0,0 +1,17 @@
+// +build go1.5
+
+// Package tlsconfig provides primitives to retrieve secure-enough TLS configurations for both clients and servers.
+//
+package tlsconfig
+
+import (
+	"crypto/tls"
+)
+
+// Client TLS cipher suites (dropping CBC ciphers for client preferred suite set)
+var clientCipherSuites = []uint16{
+	tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
+	tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
+	tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
+	tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
+}

+ 15 - 0
vendor/src/github.com/docker/go-connections/tlsconfig/config_legacy_client_ciphers.go

@@ -0,0 +1,15 @@
+// +build !go1.5
+
+// Package tlsconfig provides primitives to retrieve secure-enough TLS configurations for both clients and servers.
+//
+package tlsconfig
+
+import (
+	"crypto/tls"
+)
+
+// Client TLS cipher suites (dropping CBC ciphers for client preferred suite set)
+var clientCipherSuites = []uint16{
+	tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
+	tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
+}