diff --git a/backend/azure/azure.go b/backend/azure/azure.go index a641a986..53cc92ec 100644 --- a/backend/azure/azure.go +++ b/backend/azure/azure.go @@ -67,8 +67,6 @@ const ( onameAttr key = "Objname" onameAttrLower key = "objname" metaTmpMultipartPrefix key = ".sgwtmp" + "/multipart" - - defaultContentType = "binary/octet-stream" ) func (key) Table() map[string]struct{} { @@ -301,10 +299,15 @@ func (az *Azure) PutObject(ctx context.Context, po *s3.PutObjectInput) (string, opts.HTTPHeaders.BlobContentEncoding = po.ContentEncoding opts.HTTPHeaders.BlobContentLanguage = po.ContentLanguage opts.HTTPHeaders.BlobContentDisposition = po.ContentDisposition - opts.HTTPHeaders.BlobContentType = po.ContentType + if strings.HasSuffix(*po.Key, "/") { + // Hardcode "application/x-directory" for direcoty objects + opts.HTTPHeaders.BlobContentType = backend.GetStringPtr(backend.DirContentType) + } else { + opts.HTTPHeaders.BlobContentType = po.ContentType + } if opts.HTTPHeaders.BlobContentType == nil { - opts.HTTPHeaders.BlobContentType = backend.GetStringPtr(string(defaultContentType)) + opts.HTTPHeaders.BlobContentType = backend.GetStringPtr(backend.DefaultContentType) } uploadResp, err := az.client.UploadStream(ctx, *po.Bucket, *po.Key, po.Body, opts) @@ -401,7 +404,7 @@ func (az *Azure) GetObject(ctx context.Context, input *s3.GetObjectInput) (*s3.G contentType := blobDownloadResponse.ContentType if contentType == nil { - contentType = backend.GetStringPtr(defaultContentType) + contentType = backend.GetStringPtr(backend.DefaultContentType) } return &s3.GetObjectOutput{ @@ -855,7 +858,8 @@ func (az *Azure) CreateMultipartUpload(ctx context.Context, input *s3.CreateMult } if getString(input.ContentType) != "" { opts.HTTPHeaders = &blob.HTTPHeaders{ - BlobContentType: input.ContentType, + BlobContentType: input.ContentType, + BlobContentEncoding: input.ContentEncoding, } } @@ -1190,7 +1194,8 @@ func (az *Azure) CompleteMultipartUpload(ctx context.Context, input *s3.Complete Tags: parseAzTags(tags.BlobTagSet), } opts.HTTPHeaders = &blob.HTTPHeaders{ - BlobContentType: props.ContentType, + BlobContentType: props.ContentType, + BlobContentEncoding: props.ContentEncoding, } resp, err := client.CommitBlockList(ctx, blockIds, opts) diff --git a/backend/common.go b/backend/common.go index 2321d9eb..07540926 100644 --- a/backend/common.go +++ b/backend/common.go @@ -30,6 +30,12 @@ import ( "github.com/versity/versitygw/s3response" ) +const ( + // this is the media type for directories in AWS and Nextcloud + DirContentType = "application/x-directory" + DefaultContentType = "binary/octet-stream" +) + func IsValidBucketName(name string) bool { return true } type ByBucketName []s3response.ListAllMyBucketsEntry diff --git a/backend/posix/posix.go b/backend/posix/posix.go index 67532f0b..78800fbe 100644 --- a/backend/posix/posix.go +++ b/backend/posix/posix.go @@ -86,9 +86,6 @@ const ( objectRetentionKey = "object-retention" objectLegalHoldKey = "object-legal-hold" - // this is the media type for directories in AWS and Nextcloud - dirContentType = "application/x-directory" - doFalloc = true skipFalloc = false ) @@ -1739,7 +1736,7 @@ func (p *Posix) GetObject(_ context.Context, input *s3.GetObjectInput) (*s3.GetO userMetaData := make(map[string]string) _, contentEncoding := p.loadUserMetaData(bucket, object, userMetaData) - contentType := dirContentType + contentType := backend.DirContentType b, err := p.meta.RetrieveAttribute(bucket, object, etagkey) etag := string(b) @@ -1898,7 +1895,7 @@ func (p *Posix) HeadObject(ctx context.Context, input *s3.HeadObjectInput) (*s3. contentType, contentEncoding := p.loadUserMetaData(bucket, object, userMetaData) if fi.IsDir() { - contentType = dirContentType + contentType = backend.DirContentType } b, err := p.meta.RetrieveAttribute(bucket, object, etagkey) diff --git a/tests/integration/group-tests.go b/tests/integration/group-tests.go index 8aa0c91d..65ad49a1 100644 --- a/tests/integration/group-tests.go +++ b/tests/integration/group-tests.go @@ -143,7 +143,6 @@ func TestHeadObject(s *S3Conf) { HeadObject_non_existing_mp(s) HeadObject_mp_success(s) HeadObject_non_existing_dir_object(s) - HeadObject_name_too_long(s) HeadObject_with_contenttype(s) HeadObject_success(s) }