Skip to content

Commit 9b20509

Browse files
committed
Include content length in the response of Get and GetRange
Signed-off-by: Ashwanth Goli <[email protected]>
1 parent 8897e65 commit 9b20509

File tree

9 files changed

+47
-23
lines changed

9 files changed

+47
-23
lines changed

objstore.go

+10
Original file line numberDiff line numberDiff line change
@@ -829,3 +829,13 @@ func (t *timingReaderWriterTo) WriteTo(w io.Writer) (n int64, err error) {
829829
t.timingReader.updateMetrics(int(n), err)
830830
return n, err
831831
}
832+
833+
type ObjectSizerReadCloser struct {
834+
io.ReadCloser
835+
Size int64
836+
}
837+
838+
// ObjectSize implement ObjectSizer.
839+
func (o ObjectSizerReadCloser) ObjectSize() (int64, error) {
840+
return o.Size, nil
841+
}

providers/azure/azure.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ func (b *Bucket) getBlobReader(ctx context.Context, name string, httpRange blob.
273273
return nil, errors.Wrapf(err, "cannot download blob, address: %s", blobClient.URL())
274274
}
275275
retryOpts := azblob.RetryReaderOptions{MaxRetries: int32(b.readerMaxRetries)}
276-
return resp.NewRetryReader(ctx, &retryOpts), nil
276+
return objstore.ObjectSizerReadCloser{ReadCloser: resp.NewRetryReader(ctx, &retryOpts), Size: *resp.ContentLength}, nil
277277
}
278278

279279
// Get returns a reader for the given object name.

providers/bos/bos.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,7 @@ func (b *Bucket) getRange(_ context.Context, bucketName, objectKey string, off,
308308
return nil, err
309309
}
310310

311-
return obj.Body, nil
311+
return objstore.ObjectSizerReadCloser{ReadCloser: obj.Body, Size: obj.ContentLength}, err
312312
}
313313

314314
func configFromEnv() Config {

providers/cos/cos.go

+1-11
Original file line numberDiff line numberDiff line change
@@ -320,20 +320,10 @@ func (b *Bucket) getRange(ctx context.Context, name string, off, length int64) (
320320
return nil, err
321321
}
322322
// Add size info into reader to pass it to Upload function.
323-
r := objectSizerReadCloser{ReadCloser: resp.Body, size: resp.ContentLength}
323+
r := objstore.ObjectSizerReadCloser{ReadCloser: resp.Body, Size: resp.ContentLength}
324324
return r, nil
325325
}
326326

327-
type objectSizerReadCloser struct {
328-
io.ReadCloser
329-
size int64
330-
}
331-
332-
// ObjectSize implement objstore.ObjectSizer.
333-
func (o objectSizerReadCloser) ObjectSize() (int64, error) {
334-
return o.size, nil
335-
}
336-
337327
// Get returns a reader for the given object name.
338328
func (b *Bucket) Get(ctx context.Context, name string) (io.ReadCloser, error) {
339329
return b.getRange(ctx, name, 0, -1)

providers/filesystem/filesystem.go

+10-3
Original file line numberDiff line numberDiff line change
@@ -150,8 +150,12 @@ func (b *Bucket) GetRange(ctx context.Context, name string, off, length int64) (
150150
return nil, errors.New("object name is empty")
151151
}
152152

153-
file := filepath.Join(b.rootDir, name)
154-
if _, err := os.Stat(file); err != nil {
153+
var (
154+
file = filepath.Join(b.rootDir, name)
155+
stat os.FileInfo
156+
err error
157+
)
158+
if stat, err = os.Stat(file); err != nil {
155159
return nil, errors.Wrapf(err, "stat %s", file)
156160
}
157161

@@ -171,7 +175,10 @@ func (b *Bucket) GetRange(ctx context.Context, name string, off, length int64) (
171175
return f, nil
172176
}
173177

174-
return &rangeReaderCloser{Reader: io.LimitReader(f, length), f: f}, nil
178+
return objstore.ObjectSizerReadCloser{
179+
ReadCloser: &rangeReaderCloser{Reader: io.LimitReader(f, length),
180+
f: f,
181+
}, Size: stat.Size()}, nil
175182
}
176183

177184
// Exists checks if the given directory exists in memory.

providers/gcs/gcs.go

+12-2
Original file line numberDiff line numberDiff line change
@@ -226,12 +226,22 @@ func (b *Bucket) Iter(ctx context.Context, dir string, f func(string) error, opt
226226

227227
// Get returns a reader for the given object name.
228228
func (b *Bucket) Get(ctx context.Context, name string) (io.ReadCloser, error) {
229-
return b.bkt.Object(name).NewReader(ctx)
229+
r, err := b.bkt.Object(name).NewReader(ctx)
230+
if err != nil {
231+
return r, err
232+
}
233+
234+
return objstore.ObjectSizerReadCloser{ReadCloser: r, Size: r.Attrs.Size}, nil
230235
}
231236

232237
// GetRange returns a new range reader for the given object name and range.
233238
func (b *Bucket) GetRange(ctx context.Context, name string, off, length int64) (io.ReadCloser, error) {
234-
return b.bkt.Object(name).NewRangeReader(ctx, off, length)
239+
r, err := b.bkt.Object(name).NewRangeReader(ctx, off, length)
240+
if err != nil {
241+
return r, err
242+
}
243+
244+
return objstore.ObjectSizerReadCloser{ReadCloser: r, Size: r.Attrs.Size}, nil
235245
}
236246

237247
// Attributes returns information about the specified object.

providers/obs/obs.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ func (b *Bucket) getRange(_ context.Context, name string, off, length int64) (io
299299
if err != nil {
300300
return nil, errors.Wrap(err, "failed to get object")
301301
}
302-
return output.Body, nil
302+
return objstore.ObjectSizerReadCloser{ReadCloser: output.Body, Size: output.ContentLength}, nil
303303
}
304304

305305
// Exists checks if the given object exists in the bucket.

providers/oci/oci.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ func (b *Bucket) Get(ctx context.Context, name string) (io.ReadCloser, error) {
134134
if err != nil {
135135
return nil, err
136136
}
137-
return response.Content, nil
137+
return objstore.ObjectSizerReadCloser{ReadCloser: response.Content, Size: *response.ContentLength}, nil
138138
}
139139

140140
// GetRange returns a new range reader for the given object name and range.
@@ -164,7 +164,7 @@ func (b *Bucket) GetRange(ctx context.Context, name string, offset, length int64
164164
if err != nil {
165165
return nil, err
166166
}
167-
return response.Content, nil
167+
return objstore.ObjectSizerReadCloser{ReadCloser: response.Content, Size: *response.ContentLength}, nil
168168
}
169169

170170
// Upload the contents of the reader as an object into the bucket.

providers/s3/s3.go

+9-2
Original file line numberDiff line numberDiff line change
@@ -439,10 +439,17 @@ func (b *Bucket) getRange(ctx context.Context, name string, off, length int64) (
439439
}
440440

441441
// StatObject to see if the object exists and we have permissions to read it
442-
if _, err := b.client.StatObject(ctx, b.name, name, *opts); err != nil {
442+
var stat minio.ObjectInfo
443+
if stat, err = b.client.StatObject(ctx, b.name, name, *opts); err != nil {
443444
return nil, err
444445
}
445-
return b.client.GetObject(ctx, b.name, name, *opts)
446+
447+
o, err := b.client.GetObject(ctx, b.name, name, *opts)
448+
if err != nil {
449+
return o, err
450+
}
451+
452+
return objstore.ObjectSizerReadCloser{ReadCloser: o, Size: stat.Size}, nil
446453
}
447454

448455
// Get returns a reader for the given object name.

0 commit comments

Comments
 (0)