From cd61a71fadb8fa10ff6064babf6aa4483c32d3f8 Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Wed, 1 Mar 2017 15:39:18 -0800 Subject: [PATCH] fix v2 manifest fetch Signed-off-by: Jess Frazelle --- registry/catalog.go | 2 +- registry/manifest.go | 13 +++++++------ registry/registry.go | 12 ++++++++++-- registry/tags.go | 2 +- 4 files changed, 19 insertions(+), 10 deletions(-) diff --git a/registry/catalog.go b/registry/catalog.go index 4c4494c4..e3aa19a6 100644 --- a/registry/catalog.go +++ b/registry/catalog.go @@ -19,7 +19,7 @@ func (r *Registry) Catalog(u string) ([]string, error) { r.Logf("registry.catalog url=%s", uri) var response catalogResponse - h, err := r.getJSON(uri, &response) + h, err := r.getJSON(uri, &response, false) if err != nil { return nil, err } diff --git a/registry/manifest.go b/registry/manifest.go index 693493ba..c7a7010f 100644 --- a/registry/manifest.go +++ b/registry/manifest.go @@ -1,6 +1,7 @@ package registry import ( + "net/url" "strings" "github.com/docker/distribution/manifest/schema1" @@ -9,11 +10,11 @@ import ( // Manifest returns the manifest for a specific repository:tag. func (r *Registry) Manifest(repository, ref string) (interface{}, error) { - url := r.url("/v2/%s/manifests/%s", repository, ref) - r.Logf("registry.manifests url=%s repository=%s ref=%s", url, repository, ref) + uri := r.url("/v2/%s/manifests/%s", repository, url.PathEscape(ref)) + r.Logf("registry.manifests uri=%s repository=%s ref=%s", uri, repository, ref) var m schema2.Manifest - h, err := r.getJSON(url, &m) + h, err := r.getJSON(uri, &m, true) if err != nil { return m, err } @@ -32,11 +33,11 @@ func (r *Registry) Manifest(repository, ref string) (interface{}, error) { // ManifestV1 gets the registry v1 manifest. func (r *Registry) ManifestV1(repository, ref string) (schema1.SignedManifest, error) { - url := r.url("/v2/%s/manifests/%s", repository, ref) - r.Logf("registry.manifests url=%s repository=%s ref=%s", url, repository, ref) + uri := r.url("/v2/%s/manifests/%s", repository, url.PathEscape(ref)) + r.Logf("registry.manifests uri=%s repository=%s ref=%s", uri, repository, ref) var m schema1.SignedManifest - if _, err := r.getJSON(url, &m); err != nil { + if _, err := r.getJSON(uri, &m, false); err != nil { return m, err } diff --git a/registry/registry.go b/registry/registry.go index ad43e93a..e09ef7a0 100644 --- a/registry/registry.go +++ b/registry/registry.go @@ -99,8 +99,16 @@ func (r *Registry) url(pathTemplate string, args ...interface{}) string { return url } -func (r *Registry) getJSON(url string, response interface{}) (http.Header, error) { - resp, err := r.Client.Get(url) +func (r *Registry) getJSON(url string, response interface{}, addV2Header bool) (http.Header, error) { + req, err := http.NewRequest("GET", url, nil) + if err != nil { + return nil, err + } + if addV2Header { + req.Header.Add("Accept", "application/vnd.docker.distribution.manifest.v2+json") + req.Header.Add("Accept", "application/vnd.docker.distribution.manifest.list.v2+json") + } + resp, err := r.Client.Do(req) if err != nil { return nil, err } diff --git a/registry/tags.go b/registry/tags.go index 8c320134..f6e0feb1 100644 --- a/registry/tags.go +++ b/registry/tags.go @@ -10,7 +10,7 @@ func (r *Registry) Tags(repository string) ([]string, error) { r.Logf("registry.tags url=%s repository=%s", url, repository) var response tagsResponse - if _, err := r.getJSON(url, &response); err != nil { + if _, err := r.getJSON(url, &response, false); err != nil { return nil, err }