Signed-off-by: John Howard <jhoward@microsoft.com>
| ... | ... |
@@ -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 |
} |