in lib/backend/registrybackend/tagclient.go [117:155]
func (c *TagClient) Download(namespace, name string, dst io.Writer) error {
tokens := strings.Split(name, ":")
if len(tokens) != 2 {
return fmt.Errorf("invald name %s: must be repo:tag", name)
}
repo, tag := tokens[0], tokens[1]
opts, err := c.authenticator.Authenticate(repo)
if err != nil {
return fmt.Errorf("get security opt: %s", err)
}
URL := fmt.Sprintf(_tagquery, c.config.Address, repo, tag)
resp, err := httputil.Get(
URL,
append(
opts,
httputil.SendHeaders(map[string]string{"Accept": dockerutil.GetSupportedManifestTypes()}),
httputil.SendAcceptedCodes(http.StatusOK, http.StatusNotFound),
)...,
)
if err != nil {
return fmt.Errorf("check blob exists: %s", err)
}
defer resp.Body.Close()
if resp.StatusCode == http.StatusNotFound {
return backenderrors.ErrBlobNotFound
}
_, digest, err := dockerutil.ParseManifest(resp.Body)
if err != nil {
return fmt.Errorf("parse manifest v2: %s", err)
}
if _, err := io.Copy(dst, strings.NewReader(digest.String())); err != nil {
return fmt.Errorf("copy: %s", err)
}
return nil
}