Skip to content

Commit

Permalink
Merge pull request #500 from jiangliu/remote
Browse files Browse the repository at this point in the history
remote: enhance FetchByDigest() to handle more mediatypes
  • Loading branch information
eryugey authored Jun 27, 2023
2 parents 9e555b8 + 86cbcb7 commit 88728c1
Showing 1 changed file with 20 additions and 7 deletions.
27 changes: 20 additions & 7 deletions pkg/remote/remotes/docker/fetcher.go
Original file line number Diff line number Diff line change
Expand Up @@ -151,11 +151,16 @@ func (r dockerFetcher) Fetch(ctx context.Context, desc ocispec.Descriptor) (io.R
})
}

func (r dockerFetcher) createGetReq(ctx context.Context, host RegistryHost, ps ...string) (*request, int64, error) {
func (r dockerFetcher) createGetReq(ctx context.Context, host RegistryHost, mediatype string, ps ...string) (*request, int64, error) {
headReq := r.request(host, http.MethodHead, ps...)
if err := headReq.addNamespace(r.refspec.Hostname()); err != nil {
return nil, 0, err
}
if mediatype == "" {
headReq.header.Set("Accept", "*/*")
} else {
headReq.header.Set("Accept", strings.Join([]string{mediatype, `*/*`}, ", "))
}

headResp, err := headReq.doWithRetries(ctx, nil)
if err != nil {
Expand Down Expand Up @@ -190,13 +195,14 @@ func (r dockerFetcher) FetchByDigest(ctx context.Context, dgst digest.Digest) (i
}

var (
getReq *request
sz int64
firstErr error
getReq *request
sz int64
firstErr error
mediaType string
)

for _, host := range r.hosts {
getReq, sz, err = r.createGetReq(ctx, host, "blobs", dgst.String())
getReq, sz, err = r.createGetReq(ctx, host, mediaType, "blobs", dgst.String())
if err == nil {
break
}
Expand All @@ -208,8 +214,15 @@ func (r dockerFetcher) FetchByDigest(ctx context.Context, dgst digest.Digest) (i

if getReq == nil {
// Fall back to the "manifests" endpoint
// TODO: this change should be upstreamed to containerd.
mediaType = strings.Join([]string{
images.MediaTypeDockerSchema2Manifest,
images.MediaTypeDockerSchema2ManifestList,
ocispec.MediaTypeImageManifest,
ocispec.MediaTypeImageIndex,
}, ", ")
for _, host := range r.hosts {
getReq, sz, err = r.createGetReq(ctx, host, "manifests", dgst.String())
getReq, sz, err = r.createGetReq(ctx, host, mediaType, "manifests", dgst.String())
if err == nil {
break
}
Expand All @@ -231,7 +244,7 @@ func (r dockerFetcher) FetchByDigest(ctx context.Context, dgst digest.Digest) (i
}

seeker, err := newHTTPReadSeeker(sz, func(offset int64) (rc io.ReadCloser, err error) {
rc, _, err = r.open(ctx, getReq, "", offset)
rc, _, err = r.open(ctx, getReq, mediaType, offset)
return
})
if err != nil {
Expand Down

0 comments on commit 88728c1

Please sign in to comment.