docker_cli_registry_user_agent_test.go 3.7 KB

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