github.com/fabiokung/docker@v0.11.2-0.20170222101415-4534dcd49497/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", 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  }