diff --git a/cli/command/cli.go b/cli/command/cli.go index 2e4c0b55a67f..936cf2ac5318 100644 --- a/cli/command/cli.go +++ b/cli/command/cli.go @@ -229,7 +229,7 @@ func (cli *DockerCli) Initialize(opts *cliflags.ClientOptions, ops ...Initialize } if cli.client == nil { - cli.client, err = newAPIClientFromEndpoint(cli.dockerEndpoint, cli.configFile) + cli.client, err = newAPIClientFromEndpoint(opts.Common, cli.dockerEndpoint, cli.configFile) if err != nil { return err } @@ -255,18 +255,26 @@ func NewAPIClientFromFlags(opts *cliflags.CommonOptions, configFile *configfile. if err != nil { return nil, errors.Wrap(err, "unable to resolve docker endpoint") } - return newAPIClientFromEndpoint(endpoint, configFile) + return newAPIClientFromEndpoint(opts, endpoint, configFile) } -func newAPIClientFromEndpoint(ep docker.Endpoint, configFile *configfile.ConfigFile) (client.APIClient, error) { +func newAPIClientFromEndpoint(opts *cliflags.CommonOptions, ep docker.Endpoint, configFile *configfile.ConfigFile) (client.APIClient, error) { clientOpts, err := ep.ClientOpts() if err != nil { return nil, err } - customHeaders := make(map[string]string, len(configFile.HTTPHeaders)) + customHeaders := make(map[string]string, len(configFile.HTTPHeaders)+len(opts.HttpHeaders)) for k, v := range configFile.HTTPHeaders { customHeaders[k] = v } + + for i := 0; i < len(opts.HttpHeaders); i++ { + split := strings.SplitN(opts.HttpHeaders[i], ":", 2) + k := strings.TrimSpace(split[0]) + v := strings.TrimSpace(split[1]) + customHeaders[k] = v + } + customHeaders["User-Agent"] = UserAgent() clientOpts = append(clientOpts, client.WithHTTPHeaders(customHeaders)) return client.NewClientWithOpts(clientOpts...) diff --git a/cli/flags/common.go b/cli/flags/common.go index fbe686c5d247..6ce9d653efda 100644 --- a/cli/flags/common.go +++ b/cli/flags/common.go @@ -45,13 +45,14 @@ var ( // CommonOptions are options common to both the client and the daemon. type CommonOptions struct { - Debug bool - Hosts []string - LogLevel string - TLS bool - TLSVerify bool - TLSOptions *tlsconfig.Options - Context string + Debug bool + Hosts []string + LogLevel string + TLS bool + TLSVerify bool + TLSOptions *tlsconfig.Options + Context string + HttpHeaders []string } // NewCommonOptions returns a new CommonOptions @@ -87,6 +88,8 @@ func (commonOpts *CommonOptions) InstallFlags(flags *pflag.FlagSet) { flags.VarP(hostOpt, "host", "H", "Daemon socket(s) to connect to") flags.StringVarP(&commonOpts.Context, "context", "c", "", `Name of the context to use to connect to the daemon (overrides `+client.EnvOverrideHost+` env var and default context set with "docker context use")`) + httpHeaderOpt := opts.NewNamedListOptsRef("http-headers", &commonOpts.HttpHeaders, nil) + flags.Var(httpHeaderOpt, "http-header", "Custom HTTP headers") } // SetDefaultOptions sets default values for options after flag parsing is