diff --git a/cmd/gateway-common.go b/cmd/gateway-common.go index c37e6ea0c..88529a8bd 100644 --- a/cmd/gateway-common.go +++ b/cmd/gateway-common.go @@ -17,6 +17,7 @@ package cmd import ( + "context" "net/http" "os" "strings" @@ -349,6 +350,11 @@ func ErrorRespToObjectError(err error, params ...string) error { return err } +// ComputeCompleteMultipartMD5 calculates MD5 ETag for complete multipart responses +func ComputeCompleteMultipartMD5(parts []CompletePart) (string, error) { + return getCompleteMultipartMD5(context.Background(), parts) +} + // parse gateway sse env variable func parseGatewaySSE(s string) (gatewaySSE, error) { l := strings.Split(s, ";") diff --git a/cmd/gateway/azure/gateway-azure.go b/cmd/gateway/azure/gateway-azure.go index dc69e716e..93f2c8536 100644 --- a/cmd/gateway/azure/gateway-azure.go +++ b/cmd/gateway/azure/gateway-azure.go @@ -37,6 +37,7 @@ import ( humanize "github.com/dustin/go-humanize" "github.com/minio/cli" miniogopolicy "github.com/minio/minio-go/pkg/policy" + "github.com/minio/minio/cmd" "github.com/minio/minio/cmd/logger" "github.com/minio/minio/pkg/auth" "github.com/minio/minio/pkg/policy" @@ -1202,19 +1203,21 @@ func (a *azureObjects) CompleteMultipartUpload(ctx context.Context, bucket, obje if err != nil { return objInfo, azureToObjectError(err, bucket, object) } - if len(metadata.Metadata) > 0 { - objBlob.Metadata, objBlob.Properties, err = s3MetaToAzureProperties(ctx, metadata.Metadata) - if err != nil { - return objInfo, azureToObjectError(err, bucket, object) - } - err = objBlob.SetProperties(nil) - if err != nil { - return objInfo, azureToObjectError(err, bucket, object) - } - err = objBlob.SetMetadata(nil) - if err != nil { - return objInfo, azureToObjectError(err, bucket, object) - } + objBlob.Metadata, objBlob.Properties, err = s3MetaToAzureProperties(ctx, metadata.Metadata) + if err != nil { + return objInfo, azureToObjectError(err, bucket, object) + } + objBlob.Metadata["md5sum"], err = cmd.ComputeCompleteMultipartMD5(uploadedParts) + if err != nil { + return objInfo, err + } + err = objBlob.SetProperties(nil) + if err != nil { + return objInfo, azureToObjectError(err, bucket, object) + } + err = objBlob.SetMetadata(nil) + if err != nil { + return objInfo, azureToObjectError(err, bucket, object) } var partNumberMarker int for {