docker_cli_registry_user_agent_test.go 3.8 KB

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