feat: adds Location in CompleteMultipartUpload response

Closes #1714

There is a `Location` field in the `CompleteMultipartUpload` result that represents the newly created object URL. This PR adds this property to the `CompleteMultipartUpload` response, generating it dynamically in either host-style or path-style format, depending on the gateway configuration.
This commit is contained in:
niksis02
2025-12-29 13:39:54 +04:00
parent eb6ffca21e
commit f467b896d8
9 changed files with 77 additions and 18 deletions
+15 -13
View File
@@ -31,12 +31,13 @@ import (
)
type S3ApiController struct {
be backend.Backend
iam auth.IAMService
logger s3log.AuditLogger
evSender s3event.S3EventSender
mm metrics.Manager
readonly bool
be backend.Backend
iam auth.IAMService
logger s3log.AuditLogger
evSender s3event.S3EventSender
mm metrics.Manager
readonly bool
virtualDomain string
}
const (
@@ -56,14 +57,15 @@ var (
xmlhdr = []byte(`<?xml version="1.0" encoding="UTF-8"?>` + "\n")
)
func New(be backend.Backend, iam auth.IAMService, logger s3log.AuditLogger, evs s3event.S3EventSender, mm metrics.Manager, readonly bool) S3ApiController {
func New(be backend.Backend, iam auth.IAMService, logger s3log.AuditLogger, evs s3event.S3EventSender, mm metrics.Manager, readonly bool, virtualDomain string) S3ApiController {
return S3ApiController{
be: be,
iam: iam,
logger: logger,
evSender: evs,
readonly: readonly,
mm: mm,
be: be,
iam: iam,
logger: logger,
evSender: evs,
readonly: readonly,
mm: mm,
virtualDomain: virtualDomain,
}
}
+4
View File
@@ -352,6 +352,10 @@ func (c S3ApiController) CompleteMultipartUpload(ctx *fiber.Ctx) (*Response, err
IfMatch: ifMatch,
IfNoneMatch: ifNoneMatch,
})
if err == nil {
objUrl := utils.GenerateObjectLocation(ctx, c.virtualDomain, bucket, key)
res.Location = &objUrl
}
return &Response{
Data: res,
Headers: map[string]*string{
+2 -1
View File
@@ -536,7 +536,8 @@ func TestS3ApiController_CompleteMultipartUpload(t *testing.T) {
output: testOutput{
response: &Response{
Data: s3response.CompleteMultipartUploadResult{
ETag: &ETag,
ETag: &ETag,
Location: utils.GetStringPtr("http://example.com/bucket/object"),
},
Headers: map[string]*string{
"x-amz-version-id": &versionId,