func (r *repositoryRetriever) Repository(ctx gocontext.Context, registry *url.URL, repoName string, insecure bool) (distribution.Repository, error) { src := *registry // ping the registry to get challenge headers if err, ok := r.pings[src]; ok { if err != nil { return nil, err } if redirect, ok := r.redirect[src]; ok { src = *redirect } } else { redirect, err := r.ping(src, insecure) r.pings[src] = err if err != nil { return nil, err } if redirect != nil { r.redirect[src] = redirect src = *redirect } } rt := transport.NewTransport( r.context.Transport, // TODO: slightly smarter authorizer that retries unauthenticated requests auth.NewAuthorizer( r.context.Challenges, auth.NewTokenHandler(r.context.Transport, r.credentials, repoName, "pull"), auth.NewBasicHandler(r.credentials), ), ) return registryclient.NewRepository(context.Context(ctx), repoName, src.String(), rt) }
func (r *repositoryRetriever) Repository(ctx gocontext.Context, registry *url.URL, repoName string, insecure bool) (distribution.Repository, error) { named, err := reference.ParseNamed(repoName) if err != nil { return nil, err } t := r.context.Transport if insecure && r.context.InsecureTransport != nil { t = r.context.InsecureTransport } src := *registry // ping the registry to get challenge headers if err, ok := r.pings[src]; ok { if err != nil { return nil, err } if redirect, ok := r.redirect[src]; ok { src = *redirect } } else { redirect, err := r.ping(src, insecure, t) r.pings[src] = err if err != nil { return nil, err } if redirect != nil { r.redirect[src] = redirect src = *redirect } } rt := transport.NewTransport( t, // TODO: slightly smarter authorizer that retries unauthenticated requests // TODO: make multiple attempts if the first credential fails auth.NewAuthorizer( r.context.Challenges, auth.NewTokenHandler(t, r.credentials, repoName, "pull"), auth.NewBasicHandler(r.credentials), ), ) repo, err := registryclient.NewRepository(context.Context(ctx), named, src.String(), rt) if err != nil { return nil, err } return NewRetryRepository(repo, 2, 3/2*time.Second), nil }