Skip to content

Commit bb9d923

Browse files
committed
content: add a BlobReadSeeker func to allow multipart blob streaming
A downstream library (s3) needs a read seeker to be able to do its own multipart upload. See: moby/buildkit#4551 Signed-off-by: Adrien Delorme <[email protected]>
1 parent 0817c97 commit bb9d923

File tree

1 file changed

+26
-0
lines changed

1 file changed

+26
-0
lines changed

core/content/helpers.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package content
1818

1919
import (
20+
"bytes"
2021
"context"
2122
"errors"
2223
"fmt"
@@ -55,6 +56,31 @@ func NewReader(ra ReaderAt) io.Reader {
5556
return io.NewSectionReader(ra, 0, ra.Size())
5657
}
5758

59+
type nopCloserBytesReader struct {
60+
*bytes.Reader
61+
}
62+
63+
func (*nopCloserBytesReader) Close() error { return nil }
64+
65+
type nopCloserSectionReader struct {
66+
*io.SectionReader
67+
}
68+
69+
func (*nopCloserSectionReader) Close() error { return nil }
70+
71+
// BlobReadSeeker returns a read seeker for the blob from the provider.
72+
func BlobReadSeeker(ctx context.Context, provider Provider, desc ocispec.Descriptor) (io.ReadSeekCloser, error) {
73+
if int64(len(desc.Data)) == desc.Size && digest.FromBytes(desc.Data) == desc.Digest {
74+
return &nopCloserBytesReader{bytes.NewReader(desc.Data)}, nil
75+
}
76+
77+
ra, err := provider.ReaderAt(ctx, desc)
78+
if err != nil {
79+
return nil, err
80+
}
81+
return &nopCloserSectionReader{io.NewSectionReader(ra, 0, ra.Size())}, nil
82+
}
83+
5884
// ReadBlob retrieves the entire contents of the blob from the provider.
5985
//
6086
// Avoid using this for large blobs, such as layers.

0 commit comments

Comments
 (0)