ソースを参照

support X-Oss-Forbid-Overwrite

taowei.wtw 6 年 前
コミット
70482fa58d
6 ファイル変更186 行追加1 行削除
  1. 107 0
      oss/bucket_test.go
  2. 2 1
      oss/conn.go
  3. 1 0
      oss/const.go
  4. 14 0
      oss/option.go
  5. 53 0
      oss/upload_test.go
  6. 9 0
      oss/utils.go

+ 107 - 0
oss/bucket_test.go

@@ -4638,3 +4638,110 @@ func (s *OssBucketSuite) TestBucketTrafficLimitUpload(c *C) {
 
 	forceDeleteBucket(client, bucketName, c)
 }
+
+func (s *OssBucketSuite) TestPutObjectWithForbidOverWrite(c *C) {
+	// create a bucket with default proprety
+	client, err := New(endpoint, accessID, accessKey)
+	c.Assert(err, IsNil)
+
+	bucketName := bucketNamePrefix + randLowStr(6)
+	err = client.CreateBucket(bucketName)
+	c.Assert(err, IsNil)
+	bucket, err := client.Bucket(bucketName)
+
+	contentLength := 1024
+	objectName := objectNamePrefix + randStr(8)
+	content := randStr(contentLength)
+
+	// first put success
+	err = bucket.PutObject(objectName, strings.NewReader(content), ForbidOverWrite(true))
+	c.Assert(err, IsNil)
+
+	// second put failure with ForbidOverWrite true
+	var respHeader http.Header
+	err = bucket.PutObject(objectName, strings.NewReader(content), ForbidOverWrite(true), GetResponseHeader(&respHeader))
+	c.Assert(err, NotNil)
+
+	// third  put success with ForbidOverWrite false
+	err = bucket.PutObject(objectName, strings.NewReader(content), ForbidOverWrite(false))
+	c.Assert(err, IsNil)
+
+	forceDeleteBucket(client, bucketName, c)
+}
+
+func (s *OssBucketSuite) TestCopyObjectWithForbidOverWrite(c *C) {
+	// create a bucket with default proprety
+	client, err := New(endpoint, accessID, accessKey)
+	c.Assert(err, IsNil)
+
+	bucketName := bucketNamePrefix + randLowStr(6)
+	err = client.CreateBucket(bucketName)
+	c.Assert(err, IsNil)
+	bucket, err := client.Bucket(bucketName)
+
+	contentLength := 1024
+	objectName := objectNamePrefix + randStr(8)
+	content := randStr(contentLength)
+
+	err = bucket.PutObject(objectName, strings.NewReader(content))
+	c.Assert(err, IsNil)
+
+	// first copy success
+	copyObjectName := objectName + "-copy"
+	_, err = bucket.CopyObject(objectName, copyObjectName, ForbidOverWrite(true))
+	c.Assert(err, IsNil)
+
+	// second copy failure with ForbidOverWrite true
+	var respHeader http.Header
+	_, err = bucket.CopyObject(objectName, copyObjectName, ForbidOverWrite(true), GetResponseHeader(&respHeader))
+	c.Assert(err, NotNil)
+
+	// third  copy success with ForbidOverWrite false
+	_, err = bucket.CopyObject(objectName, copyObjectName, ForbidOverWrite(false))
+	c.Assert(err, IsNil)
+
+	forceDeleteBucket(client, bucketName, c)
+}
+
+func (s *OssBucketSuite) TestDeleteObjectsWithSpecialCharacter(c *C) {
+	// create a bucket with default proprety
+	client, err := New(endpoint, accessID, accessKey)
+	c.Assert(err, IsNil)
+
+	bucketName := bucketNamePrefix + randLowStr(6)
+	err = client.CreateBucket(bucketName)
+	c.Assert(err, IsNil)
+	bucket, err := client.Bucket(bucketName)
+
+	contentLength := 100
+    objectName1 := objectNamePrefix + randStr(8) + "<-->+&*\r%%"
+    objectName2 := objectNamePrefix + randStr(8) + "\r&*\r%%"
+	//objectName2 := objectNamePrefix + randStr(8) + "%C0%AE%C0%AE%2F%C0%AE%C0%AE%2F%C0%AE%C0%AE%2F%C0%AE%C0%AE%2F%C0%AE%C0%AE%2F%C0%AE%C0%AE%2F%C0%AE%C0%AE%2F%C0%AE%C0%AE%2F%C0%AE%C0%AE%2F%C0%AE%C0%AE%2Fetc%2Fprofile"
+	//objectName2, err = url.QueryUnescape(objectName2)
+
+	c.Assert(err, IsNil)
+	content := randStr(contentLength)
+
+	err = bucket.PutObject(objectName1, strings.NewReader(content))
+	c.Assert(err, IsNil)
+
+	err = bucket.PutObject(objectName2, strings.NewReader(content))
+	c.Assert(err, IsNil)
+
+	// delete objectName1 objectName2
+	objectKeys := []string{objectName1, objectName2}
+	_, err = bucket.DeleteObjects(objectKeys)
+	c.Assert(err, IsNil)
+
+	// objectName1 is not exist
+	exist, err := bucket.IsObjectExist(objectName1)
+	c.Assert(err, IsNil)
+	c.Assert(exist, Equals, false)
+
+	// objectName2 is not exist
+	exist, err = bucket.IsObjectExist(objectName2)
+	c.Assert(err, IsNil)
+	c.Assert(exist, Equals, false)
+
+	forceDeleteBucket(client, bucketName, c)
+}

+ 2 - 1
oss/conn.go

@@ -42,7 +42,8 @@ var signKeyList = []string{"acl", "uploads", "location", "cors",
 	"response-content-encoding", "udf", "udfName", "udfImage",
 	"udfId", "udfImageDesc", "udfApplication", "comp",
 	"udfApplicationLog", "restore", "callback", "callback-var", "qosInfo",
-	"policy", "stat", "encryption", "versions", "versioning", "versionId", "requestPayment"}
+	"policy", "stat", "encryption", "versions", "versioning", "versionId", "requestPayment",
+	"x-oss-request-payer"}
 
 // init initializes Conn
 func (conn *Conn) init(config *Config, urlMaker *urlMaker, client *http.Client) error {

+ 1 - 0
oss/const.go

@@ -168,6 +168,7 @@ const (
 	HTTPHeaderOssTagging                     = "X-Oss-Tagging"
 	HTTPHeaderOssTaggingDirective            = "X-Oss-Tagging-Directive"
 	HTTPHeaderOssTrafficLimit                = "X-Oss-Traffic-Limit"
+	HTTPHeaderOssForbidOverWrite             = "X-Oss-Forbid-Overwrite"
 )
 
 // HTTP Param

+ 14 - 0
oss/option.go

@@ -210,6 +210,11 @@ func RequestPayer(payerType PayerType) Option {
 	return setHeader(HTTPHeaderOssRequester, strings.ToLower(string(payerType)))
 }
 
+// RequestPayerParam is an option to set payer who pay for the request
+func RequestPayerParam(payerType PayerType) Option {
+	return addParam(strings.ToLower(HTTPHeaderOssRequester), strings.ToLower(string(payerType)))
+}
+
 // SetTagging is an option to set object tagging
 func SetTagging(tagging Tagging) Option {
 	if len(tagging.Tags) == 0 {
@@ -246,6 +251,15 @@ func TrafficLimitHeader(value int64) Option {
 	return setHeader(HTTPHeaderOssTrafficLimit, strconv.FormatInt(value, 10))
 }
 
+// ForbidOverWrite  is an option to set X-Oss-Forbid-Overwrite
+func ForbidOverWrite(forbidWrite bool) Option {
+	if forbidWrite {
+		return setHeader(HTTPHeaderOssForbidOverWrite, "true")
+	} else {
+		return setHeader(HTTPHeaderOssForbidOverWrite, "false")
+	}
+}
+
 // Delimiter is an option to set delimiler parameter
 func Delimiter(value string) Option {
 	return addParam("delimiter", value)

+ 53 - 0
oss/upload_test.go

@@ -645,3 +645,56 @@ func (s *OssUploadSuite) TestUploadFileWithCpChoiceOptions(c *C) {
 
 	forceDeleteBucket(client, bucketName, c)
 }
+
+// TestUploadFileWithForbidOverWrite
+func (s *OssUploadSuite) TestUploadFileWithForbidOverWrite(c *C) {
+	// create a bucket with default proprety
+	client, err := New(endpoint, accessID, accessKey)
+	c.Assert(err, IsNil)
+
+	bucketName := bucketNamePrefix + randLowStr(6)
+	err = client.CreateBucket(bucketName)
+	c.Assert(err, IsNil)
+	bucket, err := client.Bucket(bucketName)
+
+	fileName := "../sample/BingWallpaper-2015-11-07.jpg"
+	fileInfo, err := os.Stat(fileName)
+	c.Assert(err, IsNil)
+
+	objectName := objectNamePrefix + randStr(8)
+
+	// UploadFile with properties
+	options := []Option{
+		ObjectACL(ACLPublicRead),
+		RequestPayer(Requester),
+		TrafficLimitHeader(1024 * 1024 * 8),
+		ServerSideEncryption("AES256"),
+		ObjectStorageClass(StorageArchive),
+		ForbidOverWrite(true),
+		Checkpoint(true, fileName+".cp"),
+	}
+
+	// Updating the file
+	err = bucket.UploadFile(objectName, fileName, fileInfo.Size()/2, options...)
+	c.Assert(err, IsNil)
+
+	// Updating the file with ForbidOverWrite(true)
+	err = bucket.UploadFile(objectName, fileName, fileInfo.Size()/2, options...)
+	c.Assert(err, NotNil)
+
+	// without Checkpoint
+	options = []Option{
+		ObjectACL(ACLPublicRead),
+		RequestPayer(Requester),
+		TrafficLimitHeader(1024 * 1024 * 8),
+		ServerSideEncryption("AES256"),
+		ObjectStorageClass(StorageArchive),
+		ForbidOverWrite(true),
+	}
+
+	// Updating the file with ForbidOverWrite(true)
+	err = bucket.UploadFile(objectName, fileName, fileInfo.Size()/2, options...)
+	c.Assert(err, NotNil)
+
+	forceDeleteBucket(client, bucketName, c)
+}

+ 9 - 0
oss/utils.go

@@ -337,6 +337,15 @@ func ChoiceCompletePartOption(options []Option) []Option {
 		outOption = append(outOption, GetResponseHeader(respHeader.(*http.Header)))
 	}
 
+	forbidOverWrite, _ := findOption(options, HTTPHeaderOssForbidOverWrite, nil)
+	if forbidOverWrite != nil {
+		if forbidOverWrite.(string) == "true" {
+			outOption = append(outOption, ForbidOverWrite(true))
+		} else {
+			outOption = append(outOption, ForbidOverWrite(false))
+		}
+	}
+
 	return outOption
 }