From c01fe472316f3de38a95b008c93079211c91d63e Mon Sep 17 00:00:00 2001 From: Aaron Lehmann Date: Thu, 21 Jan 2016 09:34:06 -0800 Subject: [PATCH] If the media type for a manifest is unrecognized, default to schema1 This is needed for compatibility with some third-party registries that send an inappropriate Content-Type header such as text/html. Signed-off-by: Aaron Lehmann --- manifests.go | 5 ++++- registry/client/repository_test.go | 24 +++++++++++++++++++----- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/manifests.go b/manifests.go index 222916b88..40f3bc753 100644 --- a/manifests.go +++ b/manifests.go @@ -96,7 +96,10 @@ func UnmarshalManifest(ctHeader string, p []byte) (Manifest, Descriptor, error) unmarshalFunc, ok := mappings[mediatype] if !ok { - return nil, Descriptor{}, fmt.Errorf("unsupported manifest mediatype: %s", mediatype) + unmarshalFunc, ok = mappings[""] + if !ok { + return nil, Descriptor{}, fmt.Errorf("unsupported manifest mediatype and no default available: %s", mediatype) + } } return unmarshalFunc(p) diff --git a/registry/client/repository_test.go b/registry/client/repository_test.go index 8eedc4c29..69987c878 100644 --- a/registry/client/repository_test.go +++ b/registry/client/repository_test.go @@ -610,7 +610,7 @@ func addTestManifestWithEtag(repo, reference string, content []byte, m *testutil *m = append(*m, testutil.RequestResponseMapping{Request: getReqWithEtag, Response: getRespWithEtag}) } -func addTestManifest(repo, reference string, content []byte, m *testutil.RequestResponseMap) { +func addTestManifest(repo, reference string, mediatype string, content []byte, m *testutil.RequestResponseMap) { *m = append(*m, testutil.RequestResponseMapping{ Request: testutil.Request{ Method: "GET", @@ -622,7 +622,7 @@ func addTestManifest(repo, reference string, content []byte, m *testutil.Request Headers: http.Header(map[string][]string{ "Content-Length": {fmt.Sprint(len(content))}, "Last-Modified": {time.Now().Add(-1 * time.Second).Format(time.ANSIC)}, - "Content-Type": {schema1.MediaTypeSignedManifest}, + "Content-Type": {mediatype}, }), }, }) @@ -636,7 +636,7 @@ func addTestManifest(repo, reference string, content []byte, m *testutil.Request Headers: http.Header(map[string][]string{ "Content-Length": {fmt.Sprint(len(content))}, "Last-Modified": {time.Now().Add(-1 * time.Second).Format(time.ANSIC)}, - "Content-Type": {schema1.MediaTypeSignedManifest}, + "Content-Type": {mediatype}, }), }, }) @@ -678,8 +678,9 @@ func TestV1ManifestFetch(t *testing.T) { if err != nil { t.Fatal(err) } - addTestManifest(repo, dgst.String(), pl, &m) - addTestManifest(repo, "latest", pl, &m) + addTestManifest(repo, dgst.String(), schema1.MediaTypeSignedManifest, pl, &m) + addTestManifest(repo, "latest", schema1.MediaTypeSignedManifest, pl, &m) + addTestManifest(repo, "badcontenttype", "text/html", pl, &m) e, c := testServer(m) defer c() @@ -726,6 +727,19 @@ func TestV1ManifestFetch(t *testing.T) { if err = checkEqualManifest(v1manifest, m1); err != nil { t.Fatal(err) } + + manifest, err = ms.Get(ctx, dgst, WithTag("badcontenttype")) + if err != nil { + t.Fatal(err) + } + v1manifest, ok = manifest.(*schema1.SignedManifest) + if !ok { + t.Fatalf("Unexpected manifest type from Get: %T", manifest) + } + + if err = checkEqualManifest(v1manifest, m1); err != nil { + t.Fatal(err) + } } func TestManifestFetchWithEtag(t *testing.T) {