docker_cli_registry_user_agent_test.go 3.8 KB

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