|
@@ -4,6 +4,7 @@ import (
|
|
"context"
|
|
"context"
|
|
"fmt"
|
|
"fmt"
|
|
"runtime"
|
|
"runtime"
|
|
|
|
+ "sync"
|
|
|
|
|
|
"github.com/docker/docker/pkg/parsers/kernel"
|
|
"github.com/docker/docker/pkg/parsers/kernel"
|
|
"github.com/docker/docker/pkg/useragent"
|
|
"github.com/docker/docker/pkg/useragent"
|
|
@@ -17,23 +18,43 @@ type UAStringKey struct{}
|
|
//
|
|
//
|
|
// [docker client's UA] UpstreamClient([upstream client's UA])
|
|
// [docker client's UA] UpstreamClient([upstream client's UA])
|
|
func DockerUserAgent(ctx context.Context) string {
|
|
func DockerUserAgent(ctx context.Context) string {
|
|
- httpVersion := make([]useragent.VersionInfo, 0, 6)
|
|
|
|
- httpVersion = append(httpVersion, useragent.VersionInfo{Name: "docker", Version: Version})
|
|
|
|
- httpVersion = append(httpVersion, useragent.VersionInfo{Name: "go", Version: runtime.Version()})
|
|
|
|
- httpVersion = append(httpVersion, useragent.VersionInfo{Name: "git-commit", Version: GitCommit})
|
|
|
|
- if kernelVersion, err := kernel.GetKernelVersion(); err == nil {
|
|
|
|
- httpVersion = append(httpVersion, useragent.VersionInfo{Name: "kernel", Version: kernelVersion.String()})
|
|
|
|
|
|
+ daemonUA := getDaemonUserAgent()
|
|
|
|
+ if upstreamUA := getUserAgentFromContext(ctx); len(upstreamUA) > 0 {
|
|
|
|
+ return insertUpstreamUserAgent(upstreamUA, daemonUA)
|
|
}
|
|
}
|
|
- httpVersion = append(httpVersion, useragent.VersionInfo{Name: "os", Version: runtime.GOOS})
|
|
|
|
- httpVersion = append(httpVersion, useragent.VersionInfo{Name: "arch", Version: runtime.GOARCH})
|
|
|
|
|
|
+ return daemonUA
|
|
|
|
+}
|
|
|
|
|
|
- dockerUA := useragent.AppendVersions("", httpVersion...)
|
|
|
|
- upstreamUA := getUserAgentFromContext(ctx)
|
|
|
|
- if len(upstreamUA) > 0 {
|
|
|
|
- ret := insertUpstreamUserAgent(upstreamUA, dockerUA)
|
|
|
|
- return ret
|
|
|
|
- }
|
|
|
|
- return dockerUA
|
|
|
|
|
|
+var (
|
|
|
|
+ daemonUAOnce sync.Once
|
|
|
|
+ daemonUA string
|
|
|
|
+)
|
|
|
|
+
|
|
|
|
+// getUserAgentFromContext returns the user-agent to use for requests made by
|
|
|
|
+// the daemon.
|
|
|
|
+//
|
|
|
|
+// It includes;
|
|
|
|
+//
|
|
|
|
+// - the docker version
|
|
|
|
+// - go version
|
|
|
|
+// - git-commit
|
|
|
|
+// - kernel version
|
|
|
|
+// - os
|
|
|
|
+// - architecture
|
|
|
|
+func getDaemonUserAgent() string {
|
|
|
|
+ daemonUAOnce.Do(func() {
|
|
|
|
+ httpVersion := make([]useragent.VersionInfo, 0, 6)
|
|
|
|
+ httpVersion = append(httpVersion, useragent.VersionInfo{Name: "docker", Version: Version})
|
|
|
|
+ httpVersion = append(httpVersion, useragent.VersionInfo{Name: "go", Version: runtime.Version()})
|
|
|
|
+ httpVersion = append(httpVersion, useragent.VersionInfo{Name: "git-commit", Version: GitCommit})
|
|
|
|
+ if kernelVersion, err := kernel.GetKernelVersion(); err == nil {
|
|
|
|
+ httpVersion = append(httpVersion, useragent.VersionInfo{Name: "kernel", Version: kernelVersion.String()})
|
|
|
|
+ }
|
|
|
|
+ httpVersion = append(httpVersion, useragent.VersionInfo{Name: "os", Version: runtime.GOOS})
|
|
|
|
+ httpVersion = append(httpVersion, useragent.VersionInfo{Name: "arch", Version: runtime.GOARCH})
|
|
|
|
+ daemonUA = useragent.AppendVersions("", httpVersion...)
|
|
|
|
+ })
|
|
|
|
+ return daemonUA
|
|
}
|
|
}
|
|
|
|
|
|
// getUserAgentFromContext returns the previously saved user-agent context stored in ctx, if one exists
|
|
// getUserAgentFromContext returns the previously saved user-agent context stored in ctx, if one exists
|