瀏覽代碼

support to set personalized header and params

taowei.wtw 5 年之前
父節點
當前提交
b77f326b8e
共有 5 個文件被更改,包括 221 次插入15 次删除
  1. 193 7
      oss/bucket_test.go
  2. 1 1
      oss/client_test.go
  3. 2 1
      oss/const.go
  4. 15 0
      oss/option.go
  5. 10 6
      oss/utils_test.go

+ 193 - 7
oss/bucket_test.go

@@ -1908,34 +1908,34 @@ func (s *OssBucketSuite) TestAddContentType(c *C) {
 	opts := addContentType(nil, "abc.txt")
 	typ, err := findOption(opts, HTTPHeaderContentType, "")
 	c.Assert(err, IsNil)
-	c.Assert(typ, Equals, "text/plain; charset=utf-8")
+	c.Assert(strings.Contains(typ.(string), "text/plain"), Equals, true)
 
 	opts = addContentType(nil)
 	typ, err = findOption(opts, HTTPHeaderContentType, "")
 	c.Assert(err, IsNil)
 	c.Assert(len(opts), Equals, 1)
-	c.Assert(typ, Equals, "application/octet-stream")
+	c.Assert(strings.Contains(typ.(string), "application/octet-stream"), Equals, true)
 
 	opts = addContentType(nil, "abc.txt", "abc.pdf")
 	typ, err = findOption(opts, HTTPHeaderContentType, "")
 	c.Assert(err, IsNil)
-	c.Assert(typ, Equals, "text/plain; charset=utf-8")
+	c.Assert(strings.Contains(typ.(string), "text/plain"), Equals, true)
 
 	opts = addContentType(nil, "abc", "abc.txt", "abc.pdf")
 	typ, err = findOption(opts, HTTPHeaderContentType, "")
 	c.Assert(err, IsNil)
-	c.Assert(typ, Equals, "text/plain; charset=utf-8")
+	c.Assert(strings.Contains(typ.(string), "text/plain"), Equals, true)
 
 	opts = addContentType(nil, "abc", "abc", "edf")
 	typ, err = findOption(opts, HTTPHeaderContentType, "")
 	c.Assert(err, IsNil)
-	c.Assert(typ, Equals, "application/octet-stream")
+	c.Assert(strings.Contains(typ.(string), "application/octet-stream"), Equals, true)
 
 	opts = addContentType([]Option{Meta("meta", "my")}, "abc", "abc.txt", "abc.pdf")
 	typ, err = findOption(opts, HTTPHeaderContentType, "")
 	c.Assert(err, IsNil)
 	c.Assert(len(opts), Equals, 2)
-	c.Assert(typ, Equals, "text/plain; charset=utf-8")
+	c.Assert(strings.Contains(typ.(string), "text/plain"), Equals, true)
 }
 
 func (s *OssBucketSuite) TestGetConfig(c *C) {
@@ -3175,7 +3175,8 @@ func (s *OssBucketSuite) TestUploadFileMimeShtml(c *C) {
 
 	headResult, err := bucket.GetObjectDetailedMeta(objectName)
 	c.Assert(err, IsNil)
-	c.Assert(headResult.Get("Content-Type"), Equals, "text/html")
+	strContentType := headResult.Get("Content-Type")
+	c.Assert(strings.Contains(strContentType, "text/html"), Equals, true)
 	os.Remove(fileName)
 	forceDeleteBucket(client, bucketName, c)
 }
@@ -4896,3 +4897,188 @@ func (s *OssBucketSuite) TestDeleteObjectsWithSpecialCharacter(c *C) {
 
 	forceDeleteBucket(client, bucketName, c)
 }
+
+// TestGetObjectRangeBehavior
+func (s *OssBucketSuite) TestGetObjectRangeBehavior(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)
+
+	objectName := objectNamePrefix + randStr(8)
+	objectLen := 1000
+	objectValue := randStr(objectLen)
+
+	// Put
+	err = bucket.PutObject(objectName, strings.NewReader(objectValue))
+	c.Assert(err, IsNil)
+
+	// Range 1
+	options := []Option{
+		RangeBehavior("standard"),
+		Range(1000, 2000),
+	}
+	resp, err := bucket.GetObject(objectName, options...)
+	c.Assert(resp, IsNil)
+	c.Assert(err.(ServiceError).StatusCode, Equals, 416)
+
+	// Range 2
+	options = []Option{
+		RangeBehavior("standard"),
+		Range(0, 2000),
+	}
+	resp, err = bucket.GetObject(objectName, options...)
+	c.Assert(err, IsNil)
+	data, err := ioutil.ReadAll(resp)
+	resp.Close()
+	str := string(data)
+	c.Assert(len(str), Equals, 1000)
+	c.Assert(resp.(*Response).StatusCode, Equals, 206)
+
+	// Range 3
+	options = []Option{
+		RangeBehavior("standard"),
+		Range(500, 2000),
+	}
+	resp, err = bucket.GetObject(objectName, options...)
+	c.Assert(err, IsNil)
+	data, err = ioutil.ReadAll(resp)
+	resp.Close()
+	str = string(data)
+	c.Assert(len(str), Equals, 500)
+	c.Assert(resp.(*Response).StatusCode, Equals, 206)
+
+	forceDeleteBucket(client, bucketName, c)
+}
+
+// RangeBehavior  is an option to set Range value, such as "standard"
+func MyRangeBehavior(value string) Option {
+	return SetHeader(HTTPHeaderOssRangeBehavior, value)
+}
+
+// TestUserSetHeader
+func (s *OssBucketSuite) TestSupportUserSetHeader(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)
+
+	objectName := objectNamePrefix + randStr(8)
+	objectLen := 1000
+	objectValue := randStr(objectLen)
+
+	// Put
+	err = bucket.PutObject(objectName, strings.NewReader(objectValue))
+	c.Assert(err, IsNil)
+
+	// Range 1
+	options := []Option{
+		MyRangeBehavior("standard"),
+		Range(1000, 2000),
+	}
+	resp, err := bucket.GetObject(objectName, options...)
+	c.Assert(resp, IsNil)
+	c.Assert(err.(ServiceError).StatusCode, Equals, 416)
+
+	// Range 2
+	options = []Option{
+		MyRangeBehavior("standard"),
+		Range(0, 2000),
+	}
+	resp, err = bucket.GetObject(objectName, options...)
+	c.Assert(err, IsNil)
+	data, err := ioutil.ReadAll(resp)
+	resp.Close()
+	str := string(data)
+	c.Assert(len(str), Equals, 1000)
+	c.Assert(resp.(*Response).StatusCode, Equals, 206)
+
+	// Range 3
+	options = []Option{
+		MyRangeBehavior("standard"),
+		Range(500, 2000),
+	}
+	resp, err = bucket.GetObject(objectName, options...)
+	c.Assert(err, IsNil)
+	data, err = ioutil.ReadAll(resp)
+	resp.Close()
+	str = string(data)
+	c.Assert(len(str), Equals, 500)
+	c.Assert(resp.(*Response).StatusCode, Equals, 206)
+
+	forceDeleteBucket(client, bucketName, c)
+}
+
+// user can set param
+func MyVersionId(value string) Option {
+	return AddParam("versionId", value)
+}
+
+func (s *OssBucketSuite) TestSupportUserSetParam(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)
+
+	// put bucket version:enabled
+	var versioningConfig VersioningConfig
+	versioningConfig.Status = string(VersionEnabled)
+	err = client.SetBucketVersioning(bucketName, versioningConfig)
+	c.Assert(err, IsNil)
+
+	bucketResult, err := client.GetBucketInfo(bucketName)
+	c.Assert(err, IsNil)
+	c.Assert(bucketResult.BucketInfo.Versioning, Equals, string(VersionEnabled))
+
+	// put object v1
+	objectName := objectNamePrefix + randStr(8)
+	contextV1 := randStr(100)
+	versionIdV1 := ""
+
+	var respHeader http.Header
+	err = bucket.PutObject(objectName, strings.NewReader(contextV1), GetResponseHeader(&respHeader))
+	c.Assert(err, IsNil)
+	versionIdV1 = GetVersionId(respHeader)
+	c.Assert(len(versionIdV1) > 0, Equals, true)
+
+	// put object v2
+	contextV2 := randStr(200)
+	versionIdV2 := ""
+	err = bucket.PutObject(objectName, strings.NewReader(contextV2), GetResponseHeader(&respHeader))
+	c.Assert(err, IsNil)
+	versionIdV2 = GetVersionId(respHeader)
+	c.Assert(len(versionIdV2) > 0, Equals, true)
+
+	// check v1 and v2
+	c.Assert(versionIdV1 != versionIdV2, Equals, true)
+
+	// get object v1
+	body, err := bucket.GetObject(objectName, MyVersionId(versionIdV1))
+	c.Assert(err, IsNil)
+	str, err := readBody(body)
+	c.Assert(err, IsNil)
+	body.Close()
+	c.Assert(str, Equals, contextV1)
+
+	// get object v2
+	body, err = bucket.GetObject(objectName, MyVersionId(versionIdV2))
+	c.Assert(err, IsNil)
+	str, err = readBody(body)
+	c.Assert(err, IsNil)
+	body.Close()
+	c.Assert(str, Equals, contextV2)
+	forceDeleteBucket(client, bucketName, c)
+}

+ 1 - 1
oss/client_test.go

@@ -2565,7 +2565,7 @@ func (s *OssClientSuite) TestBucketEncyptionPutObjectError(c *C) {
 	c.Assert(err, IsNil)
 
 	c.Assert(bucketResult.BucketInfo.SseRule.SSEAlgorithm, Equals, "KMS")
-	c.Assert(bucketResult.BucketInfo.SseRule.KMSMasterKeyID, Equals, "123")
+	c.Assert(bucketResult.BucketInfo.SseRule.KMSMasterKeyID, Equals, "")
 	c.Assert(bucketResult.BucketInfo.Versioning, Equals, "")
 
 	// put and get object failure

+ 2 - 1
oss/const.go

@@ -169,6 +169,7 @@ const (
 	HTTPHeaderOssTaggingDirective            = "X-Oss-Tagging-Directive"
 	HTTPHeaderOssTrafficLimit                = "X-Oss-Traffic-Limit"
 	HTTPHeaderOssForbidOverWrite             = "X-Oss-Forbid-Overwrite"
+	HTTPHeaderOssRangeBehavior               = "X-Oss-Range-Behavior"
 )
 
 // HTTP Param
@@ -200,7 +201,7 @@ const (
 
 	NullVersion = "null"
 
-	Version = "v2.0.7" // Go SDK version
+	Version = "v2.0.8" // Go SDK version
 )
 
 // FrameType

+ 15 - 0
oss/option.go

@@ -260,6 +260,11 @@ func ForbidOverWrite(forbidWrite bool) Option {
 	}
 }
 
+// RangeBehavior  is an option to set Range value, such as "standard"
+func RangeBehavior(value string) Option {
+	return setHeader(HTTPHeaderOssRangeBehavior, value)
+}
+
 // Delimiter is an option to set delimiler parameter
 func Delimiter(value string) Option {
 	return addParam("delimiter", value)
@@ -427,6 +432,16 @@ func TrafficLimitParam(value int64) Option {
 	return addParam("x-oss-traffic-limit", strconv.FormatInt(value, 10))
 }
 
+// SetHeader Allow users to set personalized http headers
+func SetHeader(key string, value interface{}) Option {
+	return setHeader(key, value)
+}
+
+// AddParam Allow users to set personalized http params
+func AddParam(key string, value interface{}) Option {
+	return addParam(key, value)
+}
+
 func setHeader(key string, value interface{}) Option {
 	return func(params map[string]optionValue) error {
 		if value == nil {

+ 10 - 6
oss/utils_test.go

@@ -1,6 +1,10 @@
 package oss
 
-import . "gopkg.in/check.v1"
+import (
+	"strings"
+
+	. "gopkg.in/check.v1"
+)
 
 type OssUtilsSuite struct{}
 
@@ -81,14 +85,14 @@ func (s *OssUtilsSuite) TestUtilsSplitFile(c *C) {
 }
 
 func (s *OssUtilsSuite) TestUtilsFileExt(c *C) {
-	c.Assert(TypeByExtension("test.txt"), Equals, "text/plain; charset=utf-8")
+	c.Assert(strings.Contains(TypeByExtension("test.txt"), "text/plain; charset=utf-8"), Equals, true)
 	c.Assert(TypeByExtension("test.jpg"), Equals, "image/jpeg")
 	c.Assert(TypeByExtension("test.pdf"), Equals, "application/pdf")
 	c.Assert(TypeByExtension("test"), Equals, "")
-	c.Assert(TypeByExtension("/root/dir/test.txt"), Equals, "text/plain; charset=utf-8")
-	c.Assert(TypeByExtension("root/dir/test.txt"), Equals, "text/plain; charset=utf-8")
-	c.Assert(TypeByExtension("root\\dir\\test.txt"), Equals, "text/plain; charset=utf-8")
-	c.Assert(TypeByExtension("D:\\work\\dir\\test.txt"), Equals, "text/plain; charset=utf-8")
+	c.Assert(strings.Contains(TypeByExtension("/root/dir/test.txt"), "text/plain"), Equals, true)
+	c.Assert(strings.Contains(TypeByExtension("root/dir/test.txt"), "text/plain"), Equals, true)
+	c.Assert(strings.Contains(TypeByExtension("root\\dir\\test.txt"), "text/plain"), Equals, true)
+	c.Assert(strings.Contains(TypeByExtension("D:\\work\\dir\\test.txt"), "text/plain"), Equals, true)
 }
 
 func (s *OssUtilsSuite) TestGetPartEnd(c *C) {