Browse code

dockerversion: DockerUserAgent(): allow custom versions to be passed

Allow additional metadata to be passed as part of the generated User-Agent.

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>

Sebastiaan van Stijn authored on 2023/06/01 21:09:50
Showing 2 changed files
... ...
@@ -17,8 +17,8 @@ type UAStringKey struct{}
17 17
 // In accordance with RFC 7231 (5.5.3) is of the form:
18 18
 //
19 19
 //	[docker client's UA] UpstreamClient([upstream client's UA])
20
-func DockerUserAgent(ctx context.Context) string {
21
-	ua := getDaemonUserAgent()
20
+func DockerUserAgent(ctx context.Context, extraVersions ...useragent.VersionInfo) string {
21
+	ua := useragent.AppendVersions(getDaemonUserAgent(), extraVersions...)
22 22
 	if upstreamUA := getUpstreamUserAgent(ctx); upstreamUA != "" {
23 23
 		ua += " " + upstreamUA
24 24
 	}
... ...
@@ -4,6 +4,7 @@ import (
4 4
 	"context"
5 5
 	"testing"
6 6
 
7
+	"github.com/docker/docker/pkg/useragent"
7 8
 	"gotest.tools/v3/assert"
8 9
 	is "gotest.tools/v3/assert/cmp"
9 10
 )
... ...
@@ -15,10 +16,23 @@ func TestDockerUserAgent(t *testing.T) {
15 15
 		assert.Check(t, is.Equal(ua, expected))
16 16
 	})
17 17
 
18
+	t.Run("daemon user-agent custom metadata", func(t *testing.T) {
19
+		ua := DockerUserAgent(context.TODO(), useragent.VersionInfo{Name: "hello", Version: "world"}, useragent.VersionInfo{Name: "foo", Version: "bar"})
20
+		expected := getDaemonUserAgent() + ` hello/world foo/bar`
21
+		assert.Check(t, is.Equal(ua, expected))
22
+	})
23
+
18 24
 	t.Run("daemon user-agent with upstream", func(t *testing.T) {
19 25
 		ctx := context.WithValue(context.TODO(), UAStringKey{}, "Magic-Client/1.2.3 (linux)")
20 26
 		ua := DockerUserAgent(ctx)
21 27
 		expected := getDaemonUserAgent() + ` UpstreamClient(Magic-Client/1.2.3 \(linux\))`
22 28
 		assert.Check(t, is.Equal(ua, expected))
23 29
 	})
30
+
31
+	t.Run("daemon user-agent with upstream and custom metadata", func(t *testing.T) {
32
+		ctx := context.WithValue(context.TODO(), UAStringKey{}, "Magic-Client/1.2.3 (linux)")
33
+		ua := DockerUserAgent(ctx, useragent.VersionInfo{Name: "hello", Version: "world"}, useragent.VersionInfo{Name: "foo", Version: "bar"})
34
+		expected := getDaemonUserAgent() + ` hello/world foo/bar UpstreamClient(Magic-Client/1.2.3 \(linux\))`
35
+		assert.Check(t, is.Equal(ua, expected))
36
+	})
24 37
 }