github.com/jiasir/docker@v1.3.3-0.20170609024000-252e610103e7/integration-cli/docker_cli_registry_user_agent_test.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "net/http" 6 "regexp" 7 8 "github.com/docker/docker/integration-cli/registry" 9 "github.com/go-check/check" 10 ) 11 12 // unescapeBackslashSemicolonParens unescapes \;() 13 func unescapeBackslashSemicolonParens(s string) string { 14 re := regexp.MustCompile(`\\;`) 15 ret := re.ReplaceAll([]byte(s), []byte(";")) 16 17 re = regexp.MustCompile(`\\\(`) 18 ret = re.ReplaceAll([]byte(ret), []byte("(")) 19 20 re = regexp.MustCompile(`\\\)`) 21 ret = re.ReplaceAll([]byte(ret), []byte(")")) 22 23 re = regexp.MustCompile(`\\\\`) 24 ret = re.ReplaceAll([]byte(ret), []byte(`\`)) 25 26 return string(ret) 27 } 28 29 func regexpCheckUA(c *check.C, ua string) { 30 re := regexp.MustCompile("(?P<dockerUA>.+) UpstreamClient(?P<upstreamUA>.+)") 31 substrArr := re.FindStringSubmatch(ua) 32 33 c.Assert(substrArr, check.HasLen, 3, check.Commentf("Expected 'UpstreamClient()' with upstream client UA")) 34 dockerUA := substrArr[1] 35 upstreamUAEscaped := substrArr[2] 36 37 // check dockerUA looks correct 38 reDockerUA := regexp.MustCompile("^docker/[0-9A-Za-z+]") 39 bMatchDockerUA := reDockerUA.MatchString(dockerUA) 40 c.Assert(bMatchDockerUA, check.Equals, true, check.Commentf("Docker Engine User-Agent malformed")) 41 42 // check upstreamUA looks correct 43 // Expecting something like: Docker-Client/1.11.0-dev (linux) 44 upstreamUA := unescapeBackslashSemicolonParens(upstreamUAEscaped) 45 reUpstreamUA := regexp.MustCompile("^\\(Docker-Client/[0-9A-Za-z+]") 46 bMatchUpstreamUA := reUpstreamUA.MatchString(upstreamUA) 47 c.Assert(bMatchUpstreamUA, check.Equals, true, check.Commentf("(Upstream) Docker Client User-Agent malformed")) 48 } 49 50 func registerUserAgentHandler(reg *registry.Mock, result *string) { 51 reg.RegisterHandler("/v2/", func(w http.ResponseWriter, r *http.Request) { 52 w.WriteHeader(404) 53 var ua string 54 for k, v := range r.Header { 55 if k == "User-Agent" { 56 ua = v[0] 57 } 58 } 59 *result = ua 60 }) 61 } 62 63 // TestUserAgentPassThrough verifies that when an image is pulled from 64 // a registry, the registry should see a User-Agent string of the form 65 // [docker engine UA] UpstreamClientSTREAM-CLIENT([client UA]) 66 func (s *DockerRegistrySuite) TestUserAgentPassThrough(c *check.C) { 67 var ( 68 buildUA string 69 pullUA string 70 pushUA string 71 loginUA string 72 ) 73 74 buildReg, err := registry.NewMock(c) 75 defer buildReg.Close() 76 c.Assert(err, check.IsNil) 77 registerUserAgentHandler(buildReg, &buildUA) 78 buildRepoName := fmt.Sprintf("%s/busybox", buildReg.URL()) 79 80 pullReg, err := registry.NewMock(c) 81 defer pullReg.Close() 82 c.Assert(err, check.IsNil) 83 registerUserAgentHandler(pullReg, &pullUA) 84 pullRepoName := fmt.Sprintf("%s/busybox", pullReg.URL()) 85 86 pushReg, err := registry.NewMock(c) 87 defer pushReg.Close() 88 c.Assert(err, check.IsNil) 89 registerUserAgentHandler(pushReg, &pushUA) 90 pushRepoName := fmt.Sprintf("%s/busybox", pushReg.URL()) 91 92 loginReg, err := registry.NewMock(c) 93 defer loginReg.Close() 94 c.Assert(err, check.IsNil) 95 registerUserAgentHandler(loginReg, &loginUA) 96 97 s.d.Start(c, 98 "--insecure-registry", buildReg.URL(), 99 "--insecure-registry", pullReg.URL(), 100 "--insecure-registry", pushReg.URL(), 101 "--insecure-registry", loginReg.URL(), 102 "--disable-legacy-registry=true") 103 104 dockerfileName, cleanup1, err := makefile(fmt.Sprintf("FROM %s", buildRepoName)) 105 c.Assert(err, check.IsNil, check.Commentf("Unable to create test dockerfile")) 106 defer cleanup1() 107 s.d.Cmd("build", "--file", dockerfileName, ".") 108 regexpCheckUA(c, buildUA) 109 110 s.d.Cmd("login", "-u", "richard", "-p", "testtest", "-e", "testuser@testdomain.com", loginReg.URL()) 111 regexpCheckUA(c, loginUA) 112 113 s.d.Cmd("pull", pullRepoName) 114 regexpCheckUA(c, pullUA) 115 116 dockerfileName, cleanup2, err := makefile(`FROM scratch 117 ENV foo bar`) 118 c.Assert(err, check.IsNil, check.Commentf("Unable to create test dockerfile")) 119 defer cleanup2() 120 s.d.Cmd("build", "-t", pushRepoName, "--file", dockerfileName, ".") 121 122 s.d.Cmd("push", pushRepoName) 123 regexpCheckUA(c, pushUA) 124 }