diff --git a/s3api/controllers/base.go b/s3api/controllers/base.go index d74e46f..257eeba 100644 --- a/s3api/controllers/base.go +++ b/s3api/controllers/base.go @@ -644,16 +644,12 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { } if res.Body != nil { - err := utils.StreamResponseBody(ctx, res.Body) - if err != nil { - SendResponse(ctx, nil, - &MetaOpts{ - Logger: c.logger, - MetricsMng: c.mm, - Action: metrics.ActionGetObject, - BucketOwner: parsedAcl.Owner, - }) + // -1 will stream response body until EOF if content length not set + contentLen := -1 + if res.ContentLength != nil { + contentLen = int(*res.ContentLength) } + utils.StreamResponseBody(ctx, res.Body, contentLen) } return SendResponse(ctx, nil, diff --git a/s3api/utils/utils.go b/s3api/utils/utils.go index 74c52fa..f0d15d3 100644 --- a/s3api/utils/utils.go +++ b/s3api/utils/utils.go @@ -204,27 +204,10 @@ func SetResponseHeaders(ctx *fiber.Ctx, headers []CustomHeader) { } // Streams the response body by chunks -func StreamResponseBody(ctx *fiber.Ctx, rdr io.ReadCloser) error { - buf := make([]byte, 4096) // 4KB chunks - defer rdr.Close() - for { - n, err := rdr.Read(buf) - if n > 0 { - _, writeErr := ctx.Write(buf[:n]) - if writeErr != nil { - return fmt.Errorf("write chunk: %w", writeErr) - } - } - if err != nil { - if errors.Is(err, io.EOF) { - break - } - - return fmt.Errorf("read chunk: %w", err) - } - } - - return nil +func StreamResponseBody(ctx *fiber.Ctx, rdr io.ReadCloser, bodysize int) { + // SetBodyStream will call Close() on the reader when the stream is done + // since rdr is a ReadCloser + ctx.Context().SetBodyStream(rdr, bodysize) } func IsValidBucketName(bucket string) bool {