registry/service_v2.go
39f2f15a
 package registry
 
 import (
 	"fmt"
 	"strings"
 
 	"github.com/docker/distribution/registry/client/auth"
 	"github.com/docker/docker/pkg/tlsconfig"
 )
 
 func (s *Service) lookupV2Endpoints(repoName string) (endpoints []APIEndpoint, err error) {
 	var cfg = tlsconfig.ServerDefault
 	tlsConfig := &cfg
 	if strings.HasPrefix(repoName, DefaultNamespace+"/") {
 		// v2 mirrors
 		for _, mirror := range s.Config.Mirrors {
 			mirrorTLSConfig, err := s.tlsConfigForMirror(mirror)
 			if err != nil {
 				return nil, err
 			}
 			endpoints = append(endpoints, APIEndpoint{
 				URL: mirror,
 				// guess mirrors are v2
 				Version:      APIVersion2,
 				Mirror:       true,
 				TrimHostname: true,
 				TLSConfig:    mirrorTLSConfig,
 			})
 		}
 		// v2 registry
 		endpoints = append(endpoints, APIEndpoint{
 			URL:          DefaultV2Registry,
 			Version:      APIVersion2,
 			Official:     true,
 			TrimHostname: true,
 			TLSConfig:    tlsConfig,
 		})
 
 		return endpoints, nil
 	}
 
 	slashIndex := strings.IndexRune(repoName, '/')
 	if slashIndex <= 0 {
 		return nil, fmt.Errorf("invalid repo name: missing '/':  %s", repoName)
 	}
 	hostname := repoName[:slashIndex]
 
 	tlsConfig, err = s.TLSConfig(hostname)
 	if err != nil {
 		return nil, err
 	}
 
 	v2Versions := []auth.APIVersion{
 		{
 			Type:    "registry",
 			Version: "2.0",
 		},
 	}
 	endpoints = []APIEndpoint{
 		{
 			URL:           "https://" + hostname,
 			Version:       APIVersion2,
 			TrimHostname:  true,
 			TLSConfig:     tlsConfig,
 			VersionHeader: DefaultRegistryVersionHeader,
 			Versions:      v2Versions,
 		},
 	}
 
 	if tlsConfig.InsecureSkipVerify {
 		endpoints = append(endpoints, APIEndpoint{
 			URL:          "http://" + hostname,
 			Version:      APIVersion2,
 			TrimHostname: true,
 			// used to check if supposed to be secure via InsecureSkipVerify
 			TLSConfig:     tlsConfig,
 			VersionHeader: DefaultRegistryVersionHeader,
 			Versions:      v2Versions,
 		})
 	}
 
 	return endpoints, nil
 }