From 13652e081e13baf62f968f5dfc89a3aff28ddfd6 Mon Sep 17 00:00:00 2001 From: Brian Goff Date: Fri, 10 Feb 2023 00:27:11 +0000 Subject: [PATCH] fetch: Use data from descriptor when available. OCI added support for a `data` field in a descriptor. This field is expected to contain the content being pointed to by the descriptor. Signed-off-by: Brian Goff --- content/helpers.go | 4 ++++ remotes/handlers.go | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/content/helpers.go b/content/helpers.go index 13af9d7d5..f74d72a93 100644 --- a/content/helpers.go +++ b/content/helpers.go @@ -59,6 +59,10 @@ func NewReader(ra ReaderAt) io.Reader { // // Avoid using this for large blobs, such as layers. func ReadBlob(ctx context.Context, provider Provider, desc ocispec.Descriptor) ([]byte, error) { + if int64(len(desc.Data)) == desc.Size && digest.FromBytes(desc.Data) == desc.Digest { + return desc.Data, nil + } + ra, err := provider.ReaderAt(ctx, desc) if err != nil { return nil, err diff --git a/remotes/handlers.go b/remotes/handlers.go index b0d8880f6..16279caf7 100644 --- a/remotes/handlers.go +++ b/remotes/handlers.go @@ -17,6 +17,7 @@ package remotes import ( + "bytes" "context" "errors" "fmt" @@ -139,6 +140,10 @@ func Fetch(ctx context.Context, ingester content.Ingester, fetcher Fetcher, desc return err } + if desc.Size == int64(len(desc.Data)) { + return content.Copy(ctx, cw, bytes.NewReader(desc.Data), desc.Size, desc.Digest) + } + rc, err := fetcher.Fetch(ctx, desc) if err != nil { return err