ソースを参照

fix bug: support OssServerSideEncryption for copyFile

taowei.wtw 5 年 前
コミット
17523f5fad
6 ファイル変更53 行追加29 行削除
  1. 1 1
      oss/const.go
  2. 19 19
      oss/multicopy.go
  3. 25 4
      oss/multicopy_test.go
  4. 3 1
      oss/upload_test.go
  5. 1 0
      oss/utils.go
  6. 4 4
      sample.go

+ 1 - 1
oss/const.go

@@ -194,7 +194,7 @@ const (
 
 	NullVersion = "null"
 
-	Version = "v2.0.5" // Go SDK version
+	Version = "v2.0.6" // Go SDK version
 )
 
 // FrameType

+ 19 - 19
oss/multicopy.go

@@ -148,9 +148,13 @@ func (bucket Bucket) copyFile(srcBucketName, srcObjectKey, destBucketName, destO
 	srcBucket, err := bucket.Client.Bucket(srcBucketName)
 	listener := getProgressListener(options)
 
-	// for get whole length
-	skipOptions := deleteOption(options, HTTPHeaderRange)
-	meta, err := srcBucket.GetObjectDetailedMeta(srcObjectKey, skipOptions...)
+	// choice valid options
+	headerOptions := ChoiceHeadObjectOption(options)
+	partOptions := ChoiceTransferPartOption(options)
+	completeOptions := ChoiceCompletePartOption(options)
+	abortOptions := ChoiceAbortPartOption(options)
+
+	meta, err := srcBucket.GetObjectDetailedMeta(srcObjectKey, headerOptions...)
 	if err != nil {
 		return err
 	}
@@ -178,11 +182,8 @@ func (bucket Bucket) copyFile(srcBucketName, srcObjectKey, destBucketName, destO
 	event := newProgressEvent(TransferStartedEvent, 0, totalBytes, 0)
 	publishProgress(listener, event)
 
-	// oss server don't support x-oss-storage-class
-	options = deleteOption(options, HTTPHeaderOssStorageClass)
-
 	// Start to copy workers
-	arg := copyWorkerArg{descBucket, imur, srcBucketName, srcObjectKey, options, copyPartHooker}
+	arg := copyWorkerArg{descBucket, imur, srcBucketName, srcObjectKey, partOptions, copyPartHooker}
 	for w := 1; w <= routines; w++ {
 		go copyWorker(w, arg, jobs, results, failed, die)
 	}
@@ -204,7 +205,7 @@ func (bucket Bucket) copyFile(srcBucketName, srcObjectKey, destBucketName, destO
 			publishProgress(listener, event)
 		case err := <-failed:
 			close(die)
-			descBucket.AbortMultipartUpload(imur, options...)
+			descBucket.AbortMultipartUpload(imur, abortOptions...)
 			event = newProgressEvent(TransferFailedEvent, completedBytes, totalBytes, 0)
 			publishProgress(listener, event)
 			return err
@@ -219,9 +220,9 @@ func (bucket Bucket) copyFile(srcBucketName, srcObjectKey, destBucketName, destO
 	publishProgress(listener, event)
 
 	// Complete the multipart upload
-	_, err = descBucket.CompleteMultipartUpload(imur, ups, options...)
+	_, err = descBucket.CompleteMultipartUpload(imur, ups, completeOptions...)
 	if err != nil {
-		bucket.AbortMultipartUpload(imur, options...)
+		bucket.AbortMultipartUpload(imur, abortOptions...)
 		return err
 	}
 	return nil
@@ -398,10 +399,12 @@ func (bucket Bucket) copyFileWithCp(srcBucketName, srcObjectKey, destBucketName,
 		os.Remove(cpFilePath)
 	}
 
-	// Make sure the object is not updated.
-	// get whole length
-	skipOptions := deleteOption(options, HTTPHeaderRange)
-	meta, err := srcBucket.GetObjectDetailedMeta(srcObjectKey, skipOptions...)
+	// choice valid options
+	headerOptions := ChoiceHeadObjectOption(options)
+	partOptions := ChoiceTransferPartOption(options)
+	completeOptions := ChoiceCompletePartOption(options)
+
+	meta, err := srcBucket.GetObjectDetailedMeta(srcObjectKey, headerOptions...)
 	if err != nil {
 		return err
 	}
@@ -431,11 +434,8 @@ func (bucket Bucket) copyFileWithCp(srcBucketName, srcObjectKey, destBucketName,
 	event := newProgressEvent(TransferStartedEvent, completedBytes, ccp.ObjStat.Size, 0)
 	publishProgress(listener, event)
 
-	// oss server don't support x-oss-storage-class
-	options = deleteOption(options, HTTPHeaderOssStorageClass)
-
 	// Start the worker coroutines
-	arg := copyWorkerArg{descBucket, imur, srcBucketName, srcObjectKey, options, copyPartHooker}
+	arg := copyWorkerArg{descBucket, imur, srcBucketName, srcObjectKey, partOptions, copyPartHooker}
 	for w := 1; w <= routines; w++ {
 		go copyWorker(w, arg, jobs, results, failed, die)
 	}
@@ -470,5 +470,5 @@ func (bucket Bucket) copyFileWithCp(srcBucketName, srcObjectKey, destBucketName,
 	event = newProgressEvent(TransferCompletedEvent, completedBytes, ccp.ObjStat.Size, 0)
 	publishProgress(listener, event)
 
-	return ccp.complete(descBucket, ccp.CopyParts, cpFilePath, options)
+	return ccp.complete(descBucket, ccp.CopyParts, cpFilePath, completeOptions)
 }

+ 25 - 4
oss/multicopy_test.go

@@ -495,8 +495,7 @@ func (s *OssCopySuite) TestCopyFileCrossBucket(c *C) {
 	os.Remove(newFile)
 
 	// Delete target bucket
-	err = s.client.DeleteBucket(destBucketName)
-	c.Assert(err, IsNil)
+	forceDeleteBucket(s.client, destBucketName, c)
 }
 
 func (s *OssCopySuite) TestVersioningCopyFileCrossBucket(c *C) {
@@ -614,13 +613,24 @@ func (s *OssCopySuite) TestCopyFileChoiceOptions(c *C) {
 		RequestPayer(Requester),
 		TrafficLimitHeader(1024 * 1024 * 8),
 		ObjectStorageClass(StorageArchive),
-		Routines(5),
+		ServerSideEncryption("AES256"),
+		Routines(5), // without checkpoint
 	}
 
 	// Copy files
 	err = destBucket.CopyFile(bucketName, srcObjectName, destObjectName, 1024*100, options...)
 	c.Assert(err, IsNil)
 
+	// check object
+	meta, err := destBucket.GetObjectDetailedMeta(destObjectName)
+	c.Assert(err, IsNil)
+	c.Assert(meta.Get("X-Oss-Storage-Class"), Equals, "Archive")
+	c.Assert(meta.Get("X-Oss-Server-Side-Encryption"), Equals, "AES256")
+
+	aclResult, err := destBucket.GetObjectACL(destObjectName)
+	c.Assert(aclResult.ACL, Equals, "public-read")
+	c.Assert(err, IsNil)
+
 	err = destBucket.DeleteObject(destObjectName)
 	c.Assert(err, IsNil)
 	os.Remove(newFile)
@@ -631,13 +641,24 @@ func (s *OssCopySuite) TestCopyFileChoiceOptions(c *C) {
 		RequestPayer(Requester),
 		TrafficLimitHeader(1024 * 1024 * 8),
 		ObjectStorageClass(StorageArchive),
+		ServerSideEncryption("AES256"),
 		Routines(10),
-		Checkpoint(true, "copy.cp"),
+		Checkpoint(true, "copy.cp"), // with checkpoint
 	}
 
 	err = destBucket.CopyFile(bucketName, srcObjectName, destObjectName, 1024*100, options...)
 	c.Assert(err, IsNil)
 
+	// check object
+	meta, err = destBucket.GetObjectDetailedMeta(destObjectName)
+	c.Assert(err, IsNil)
+	c.Assert(meta.Get("X-Oss-Storage-Class"), Equals, "Archive")
+	c.Assert(meta.Get("X-Oss-Server-Side-Encryption"), Equals, "AES256")
+
+	aclResult, err = destBucket.GetObjectACL(destObjectName)
+	c.Assert(aclResult.ACL, Equals, "public-read")
+	c.Assert(err, IsNil)
+
 	err = destBucket.DeleteObject(destObjectName)
 	c.Assert(err, IsNil)
 	os.Remove(newFile)

+ 3 - 1
oss/upload_test.go

@@ -627,7 +627,7 @@ func (s *OssUploadSuite) TestUploadFileWithCpChoiceOptions(c *C) {
 		TrafficLimitHeader(1024 * 1024 * 8),
 		ServerSideEncryption("AES256"),
 		ObjectStorageClass(StorageArchive),
-		Checkpoint(true, fileName+".cp"),
+		Checkpoint(true, fileName+".cp"), // with checkpoint
 	}
 
 	// Updating the file
@@ -639,6 +639,8 @@ func (s *OssUploadSuite) TestUploadFileWithCpChoiceOptions(c *C) {
 	c.Assert(err, IsNil)
 
 	c.Assert(headerResp.Get("X-Oss-Server-Side-Encryption"), Equals, "AES256")
+	c.Assert(headerResp.Get("X-Oss-Storage-Class"), Equals, "Archive")
+
 	aclResult, err := bucket.GetObjectACL(objectName)
 	c.Assert(aclResult.ACL, Equals, "public-read")
 	c.Assert(err, IsNil)

+ 1 - 0
oss/utils.go

@@ -369,6 +369,7 @@ func ChoiceAbortPartOption(options []Option) []Option {
 func ChoiceHeadObjectOption(options []Option) []Option {
 	var outOption []Option
 
+	// not select HTTPHeaderRange to get whole object length
 	payer, _ := findOption(options, HTTPHeaderOssRequester, nil)
 	if payer != nil {
 		outOption = append(outOption, RequestPayer(PayerType(payer.(string))))

+ 4 - 4
sample.go

@@ -19,11 +19,11 @@ var sampleMap = map[string]interface{}{
 	"BucketLifecycleSample":       sample.BucketLifecycleSample,
 	"BucketRefererSample":         sample.BucketRefererSample,
 	"BucketLoggingSample":         sample.BucketLoggingSample,
-	"BucketWebsiteSample":	       sample.BucketWebsiteSample,
+	"BucketWebsiteSample":         sample.BucketWebsiteSample,
 	"BucketCORSSample":            sample.BucketCORSSample,
-	"BucketPolicySample":	       sample.BucketPolicySample,
+	"BucketPolicySample":          sample.BucketPolicySample,
 	"BucketrRequestPaymentSample": sample.BucketrRequestPaymentSample,
-	"BucketQoSInfoSample":	       sample.BucketQoSInfoSample,
+	"BucketQoSInfoSample":         sample.BucketQoSInfoSample,
 	"ObjectACLSample":             sample.ObjectACLSample,
 	"ObjectMetaSample":            sample.ObjectMetaSample,
 	"ListObjectsSample":           sample.ListObjectsSample,
@@ -37,7 +37,7 @@ var sampleMap = map[string]interface{}{
 	"ArchiveSample":               sample.ArchiveSample,
 	"ObjectTaggingSample":         sample.ObjectTaggingSample,
 	"BucketEncryptionSample":      sample.BucketEncryptionSample,
-        "SelectObjectSample":          sample.SelectObjectSample,
+	"SelectObjectSample":          sample.SelectObjectSample,
 }
 
 func main() {