From 80c24bf76f12c48c11c556fa5562b61779398cbd Mon Sep 17 00:00:00 2001 From: Zhaofeng Miao <522856232@qq.com> Date: Mon, 30 May 2022 16:15:47 +0800 Subject: [PATCH 1/3] feat(cli): add --http-header option Signed-off-by: Zhaofeng Miao <522856232@qq.com> --- cli/command/cli.go | 16 ++++++++++++---- cli/flags/common.go | 17 ++++++++++------- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/cli/command/cli.go b/cli/command/cli.go index 2e4c0b55a67f..bc74a250fc5d 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.Split(opts.HttpHeaders[i], ":") + 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..5b7f9a7e1401 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.VarP(httpHeaderOpt, "http-header", "", "Custom HTTP headers") } // SetDefaultOptions sets default values for options after flag parsing is From 397ad376892c71a338092afaf9c9f8895019aa6d Mon Sep 17 00:00:00 2001 From: Zhaofeng Miao <522856232@qq.com> Date: Tue, 31 May 2022 09:54:10 +0800 Subject: [PATCH 2/3] refactor: use strings.SplitN Signed-off-by: Zhaofeng Miao <522856232@qq.com> --- cli/command/cli.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/command/cli.go b/cli/command/cli.go index bc74a250fc5d..936cf2ac5318 100644 --- a/cli/command/cli.go +++ b/cli/command/cli.go @@ -269,7 +269,7 @@ func newAPIClientFromEndpoint(opts *cliflags.CommonOptions, ep docker.Endpoint, } for i := 0; i < len(opts.HttpHeaders); i++ { - split := strings.Split(opts.HttpHeaders[i], ":") + split := strings.SplitN(opts.HttpHeaders[i], ":", 2) k := strings.TrimSpace(split[0]) v := strings.TrimSpace(split[1]) customHeaders[k] = v From a809e6284073928c88736fd2618ffc716ff7d277 Mon Sep 17 00:00:00 2001 From: Zhaofeng Miao <522856232@qq.com> Date: Tue, 31 May 2022 10:03:15 +0800 Subject: [PATCH 3/3] fix: use Var instead of VarP Signed-off-by: Zhaofeng Miao <522856232@qq.com> --- cli/flags/common.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/flags/common.go b/cli/flags/common.go index 5b7f9a7e1401..6ce9d653efda 100644 --- a/cli/flags/common.go +++ b/cli/flags/common.go @@ -89,7 +89,7 @@ func (commonOpts *CommonOptions) InstallFlags(flags *pflag.FlagSet) { 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.VarP(httpHeaderOpt, "http-header", "", "Custom HTTP headers") + flags.Var(httpHeaderOpt, "http-header", "Custom HTTP headers") } // SetDefaultOptions sets default values for options after flag parsing is