func()

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
}