From 1b92c5136b86111d5ad0529beffad64aabec02e2 Mon Sep 17 00:00:00 2001 From: Krishna Srinivas Date: Mon, 10 Jul 2017 18:21:12 -0700 Subject: [PATCH] Append "-1" to etag when it is not MD5 (#4641) * gateway-azure: append "-1" to ETag so that clients do not interpret it as MD5. fixes #4537. Added unit tests. --- cmd/gateway-azure.go | 11 ++++++++--- cmd/gateway-azure_test.go | 19 +++++++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/cmd/gateway-azure.go b/cmd/gateway-azure.go index 24b9330ad..15ad173fe 100644 --- a/cmd/gateway-azure.go +++ b/cmd/gateway-azure.go @@ -67,6 +67,11 @@ func azureToS3Metadata(meta map[string]string) (newMeta map[string]string) { return newMeta } +// Append "-1" to etag so that clients do not interpret it as MD5. +func azureToS3ETag(etag string) string { + return canonicalizeETag(etag) + "-1" +} + // To store metadata during NewMultipartUpload which will be used after // CompleteMultipartUpload to call SetBlobMetadata. type azureMultipartMetaInfo struct { @@ -270,7 +275,7 @@ func (a *azureObjects) ListObjects(bucket, prefix, marker, delimiter string, max Name: object.Name, ModTime: t, Size: object.Properties.ContentLength, - ETag: canonicalizeETag(object.Properties.Etag), + ETag: azureToS3ETag(object.Properties.Etag), ContentType: object.Properties.ContentType, ContentEncoding: object.Properties.ContentEncoding, }) @@ -305,7 +310,7 @@ func (a *azureObjects) ListObjectsV2(bucket, prefix, continuationToken string, f Name: object.Name, ModTime: t, Size: object.Properties.ContentLength, - ETag: canonicalizeETag(object.Properties.Etag), + ETag: azureToS3ETag(object.Properties.Etag), ContentType: object.Properties.ContentType, ContentEncoding: object.Properties.ContentEncoding, }) @@ -368,7 +373,7 @@ func (a *azureObjects) GetObjectInfo(bucket, object string) (objInfo ObjectInfo, objInfo = ObjectInfo{ Bucket: bucket, UserDefined: meta, - ETag: canonicalizeETag(prop.Etag), + ETag: azureToS3ETag(prop.Etag), ModTime: t, Name: object, Size: prop.ContentLength, diff --git a/cmd/gateway-azure_test.go b/cmd/gateway-azure_test.go index 5a989b020..29b70889d 100644 --- a/cmd/gateway-azure_test.go +++ b/cmd/gateway-azure_test.go @@ -25,15 +25,34 @@ import ( "github.com/Azure/azure-sdk-for-go/storage" ) +// Test azureToS3ETag. +func TestAzureToS3ETag(t *testing.T) { + tests := []struct { + etag string + expected string + }{ + {`"etag"`, `etag-1`}, + {"etag", "etag-1"}, + } + for i, test := range tests { + got := azureToS3ETag(test.etag) + if got != test.expected { + t.Errorf("test %d: got:%s expected:%s", i+1, got, test.expected) + } + } +} + // Test canonical metadata. func TestS3ToAzureHeaders(t *testing.T) { headers := map[string]string{ "accept-encoding": "gzip", "content-encoding": "gzip", + "X-Amz-Meta-Hdr": "value", } expectedHeaders := map[string]string{ "Accept-Encoding": "gzip", "Content-Encoding": "gzip", + "X-Ms-Meta-Hdr": "value", } actualHeaders := s3ToAzureHeaders(headers) if !reflect.DeepEqual(actualHeaders, expectedHeaders) {