Browse code

Add GOOS in User-Agent

Signed-off-by: John Howard <jhoward@microsoft.com>

John Howard authored on 2015/06/05 02:29:57
Showing 5 changed files
... ...
@@ -149,7 +149,7 @@ func (cli *DockerCli) hijack(method, path string, setRawTerminal bool, in io.Rea
149 149
 		req.Header.Set(k, v)
150 150
 	}
151 151
 
152
-	req.Header.Set("User-Agent", "Docker-Client/"+dockerversion.VERSION)
152
+	req.Header.Set("User-Agent", "Docker-Client/"+dockerversion.VERSION+" ("+runtime.GOOS+")")
153 153
 	req.Header.Set("Content-Type", "text/plain")
154 154
 	req.Header.Set("Connection", "Upgrade")
155 155
 	req.Header.Set("Upgrade", "tcp")
... ...
@@ -64,7 +64,7 @@ func (cli *DockerCli) clientRequest(method, path string, in io.Reader, headers m
64 64
 		req.Header.Set(k, v)
65 65
 	}
66 66
 
67
-	req.Header.Set("User-Agent", "Docker-Client/"+dockerversion.VERSION)
67
+	req.Header.Set("User-Agent", "Docker-Client/"+dockerversion.VERSION+" ("+runtime.GOOS+")")
68 68
 	req.URL.Host = cli.addr
69 69
 	req.URL.Scheme = cli.scheme
70 70
 
... ...
@@ -1459,6 +1459,13 @@ func makeHttpHandler(logging bool, localMethod string, localRoute string, handle
1459 1459
 
1460 1460
 		if strings.Contains(r.Header.Get("User-Agent"), "Docker-Client/") {
1461 1461
 			userAgent := strings.Split(r.Header.Get("User-Agent"), "/")
1462
+
1463
+			// v1.20 onwards includes the GOOS of the client after the version
1464
+			// such as Docker/1.7.0 (linux)
1465
+			if len(userAgent) == 2 && strings.Contains(userAgent[1], " ") {
1466
+				userAgent[1] = strings.Split(userAgent[1], " ")[0]
1467
+			}
1468
+
1462 1469
 			if len(userAgent) == 2 && !dockerVersion.Equal(version.Version(userAgent[1])) {
1463 1470
 				logrus.Debugf("Warning: client and server don't have the same version (client: %s, server: %s)", userAgent[1], dockerVersion)
1464 1471
 			}
... ...
@@ -35,7 +35,7 @@ func (s *DockerSuite) TestVersionStatusCode(c *check.C) {
35 35
 
36 36
 	req, err := http.NewRequest("GET", "/v999.0/version", nil)
37 37
 	c.Assert(err, check.IsNil)
38
-	req.Header.Set("User-Agent", "Docker-Client/999.0")
38
+	req.Header.Set("User-Agent", "Docker-Client/999.0 (os)")
39 39
 
40 40
 	res, err := client.Do(req)
41 41
 	c.Assert(res.StatusCode, check.Equals, http.StatusBadRequest)
... ...
@@ -7,7 +7,9 @@ import (
7 7
 	"os"
8 8
 	"os/exec"
9 9
 	"path/filepath"
10
+	"runtime"
10 11
 
12
+	"github.com/docker/docker/autogen/dockerversion"
11 13
 	"github.com/docker/docker/pkg/homedir"
12 14
 	"github.com/go-check/check"
13 15
 )
... ...
@@ -50,6 +52,14 @@ func (s *DockerSuite) TestConfigHttpHeader(c *check.C) {
50 50
 	cmd := exec.Command(dockerBinary, "-H="+server.URL[7:], "ps")
51 51
 	out, _, _ := runCommandWithOutput(cmd)
52 52
 
53
+	if headers["User-Agent"] == nil {
54
+		c.Fatalf("Missing User-Agent: %q\nout:%v", headers, out)
55
+	}
56
+
57
+	if headers["User-Agent"][0] != "Docker-Client/"+dockerversion.VERSION+" ("+runtime.GOOS+")" {
58
+		c.Fatalf("Badly formatted User-Agent: %q\nout:%v", headers, out)
59
+	}
60
+
53 61
 	if headers["Myheader"] == nil || headers["Myheader"][0] != "MyValue" {
54 62
 		c.Fatalf("Missing/bad header: %q\nout:%v", headers, out)
55 63
 	}