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.
This commit is contained in:
Krishna Srinivas 2017-07-10 18:21:12 -07:00 committed by Dee Koder
parent cc8a8cb877
commit 1b92c5136b
2 changed files with 27 additions and 3 deletions

View File

@ -67,6 +67,11 @@ func azureToS3Metadata(meta map[string]string) (newMeta map[string]string) {
return newMeta 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 // To store metadata during NewMultipartUpload which will be used after
// CompleteMultipartUpload to call SetBlobMetadata. // CompleteMultipartUpload to call SetBlobMetadata.
type azureMultipartMetaInfo struct { type azureMultipartMetaInfo struct {
@ -270,7 +275,7 @@ func (a *azureObjects) ListObjects(bucket, prefix, marker, delimiter string, max
Name: object.Name, Name: object.Name,
ModTime: t, ModTime: t,
Size: object.Properties.ContentLength, Size: object.Properties.ContentLength,
ETag: canonicalizeETag(object.Properties.Etag), ETag: azureToS3ETag(object.Properties.Etag),
ContentType: object.Properties.ContentType, ContentType: object.Properties.ContentType,
ContentEncoding: object.Properties.ContentEncoding, ContentEncoding: object.Properties.ContentEncoding,
}) })
@ -305,7 +310,7 @@ func (a *azureObjects) ListObjectsV2(bucket, prefix, continuationToken string, f
Name: object.Name, Name: object.Name,
ModTime: t, ModTime: t,
Size: object.Properties.ContentLength, Size: object.Properties.ContentLength,
ETag: canonicalizeETag(object.Properties.Etag), ETag: azureToS3ETag(object.Properties.Etag),
ContentType: object.Properties.ContentType, ContentType: object.Properties.ContentType,
ContentEncoding: object.Properties.ContentEncoding, ContentEncoding: object.Properties.ContentEncoding,
}) })
@ -368,7 +373,7 @@ func (a *azureObjects) GetObjectInfo(bucket, object string) (objInfo ObjectInfo,
objInfo = ObjectInfo{ objInfo = ObjectInfo{
Bucket: bucket, Bucket: bucket,
UserDefined: meta, UserDefined: meta,
ETag: canonicalizeETag(prop.Etag), ETag: azureToS3ETag(prop.Etag),
ModTime: t, ModTime: t,
Name: object, Name: object,
Size: prop.ContentLength, Size: prop.ContentLength,

View File

@ -25,15 +25,34 @@ import (
"github.com/Azure/azure-sdk-for-go/storage" "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. // Test canonical metadata.
func TestS3ToAzureHeaders(t *testing.T) { func TestS3ToAzureHeaders(t *testing.T) {
headers := map[string]string{ headers := map[string]string{
"accept-encoding": "gzip", "accept-encoding": "gzip",
"content-encoding": "gzip", "content-encoding": "gzip",
"X-Amz-Meta-Hdr": "value",
} }
expectedHeaders := map[string]string{ expectedHeaders := map[string]string{
"Accept-Encoding": "gzip", "Accept-Encoding": "gzip",
"Content-Encoding": "gzip", "Content-Encoding": "gzip",
"X-Ms-Meta-Hdr": "value",
} }
actualHeaders := s3ToAzureHeaders(headers) actualHeaders := s3ToAzureHeaders(headers)
if !reflect.DeepEqual(actualHeaders, expectedHeaders) { if !reflect.DeepEqual(actualHeaders, expectedHeaders) {