Support specifying host in resolver.
Signed-off-by: Lantao Liu <lantaol@google.com>
This commit is contained in:
		| @@ -53,6 +53,7 @@ var ( | |||||||
|  |  | ||||||
| type dockerResolver struct { | type dockerResolver struct { | ||||||
| 	credentials func(string) (string, string, error) | 	credentials func(string) (string, string, error) | ||||||
|  | 	host        func(string) (string, error) | ||||||
| 	plainHTTP   bool | 	plainHTTP   bool | ||||||
| 	client      *http.Client | 	client      *http.Client | ||||||
| 	tracker     StatusTracker | 	tracker     StatusTracker | ||||||
| @@ -65,6 +66,9 @@ type ResolverOptions struct { | |||||||
| 	// is interpretted as a long lived token. | 	// is interpretted as a long lived token. | ||||||
| 	Credentials func(string) (string, string, error) | 	Credentials func(string) (string, string, error) | ||||||
|  |  | ||||||
|  | 	// Host provides the hostname given a namespace. | ||||||
|  | 	Host func(string) (string, error) | ||||||
|  |  | ||||||
| 	// PlainHTTP specifies to use plain http and not https | 	// PlainHTTP specifies to use plain http and not https | ||||||
| 	PlainHTTP bool | 	PlainHTTP bool | ||||||
|  |  | ||||||
| @@ -77,14 +81,27 @@ type ResolverOptions struct { | |||||||
| 	Tracker StatusTracker | 	Tracker StatusTracker | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // DefaultHost is the default host function. | ||||||
|  | func DefaultHost(ns string) (string, error) { | ||||||
|  | 	if ns == "docker.io" { | ||||||
|  | 		return "registry-1.docker.io", nil | ||||||
|  | 	} | ||||||
|  | 	return ns, nil | ||||||
|  | } | ||||||
|  |  | ||||||
| // NewResolver returns a new resolver to a Docker registry | // NewResolver returns a new resolver to a Docker registry | ||||||
| func NewResolver(options ResolverOptions) remotes.Resolver { | func NewResolver(options ResolverOptions) remotes.Resolver { | ||||||
| 	tracker := options.Tracker | 	tracker := options.Tracker | ||||||
| 	if tracker == nil { | 	if tracker == nil { | ||||||
| 		tracker = NewInMemoryTracker() | 		tracker = NewInMemoryTracker() | ||||||
| 	} | 	} | ||||||
|  | 	host := options.Host | ||||||
|  | 	if host == nil { | ||||||
|  | 		host = DefaultHost | ||||||
|  | 	} | ||||||
| 	return &dockerResolver{ | 	return &dockerResolver{ | ||||||
| 		credentials: options.Credentials, | 		credentials: options.Credentials, | ||||||
|  | 		host:        host, | ||||||
| 		plainHTTP:   options.PlainHTTP, | 		plainHTTP:   options.PlainHTTP, | ||||||
| 		client:      options.Client, | 		client:      options.Client, | ||||||
| 		tracker:     tracker, | 		tracker:     tracker, | ||||||
| @@ -270,18 +287,19 @@ func (r *dockerResolver) base(refspec reference.Spec) (*dockerBase, error) { | |||||||
| 	) | 	) | ||||||
|  |  | ||||||
| 	host := refspec.Hostname() | 	host := refspec.Hostname() | ||||||
| 	base.Scheme = "https" | 	base.Host = host | ||||||
|  | 	if r.host != nil { | ||||||
| 	if host == "docker.io" { | 		base.Host, err = r.host(host) | ||||||
| 		base.Host = "registry-1.docker.io" | 		if err != nil { | ||||||
| 	} else { | 			return nil, err | ||||||
| 		base.Host = host |  | ||||||
|  |  | ||||||
| 		if r.plainHTTP || strings.HasPrefix(host, "localhost:") { |  | ||||||
| 			base.Scheme = "http" |  | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	base.Scheme = "https" | ||||||
|  | 	if r.plainHTTP || strings.HasPrefix(base.Host, "localhost:") { | ||||||
|  | 		base.Scheme = "http" | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	if r.credentials != nil { | 	if r.credentials != nil { | ||||||
| 		username, secret, err = r.credentials(base.Host) | 		username, secret, err = r.credentials(base.Host) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Lantao Liu
					Lantao Liu