Browse Source

add OptionsMethod function

taowei.wtw 6 years ago
parent
commit
945da23501
4 changed files with 105 additions and 0 deletions
  1. 13 0
      oss/bucket.go
  2. 80 0
      oss/bucket_test.go
  3. 2 0
      oss/const.go
  4. 10 0
      oss/option.go

+ 13 - 0
oss/bucket.go

@@ -1121,6 +1121,19 @@ func (bucket Bucket) DeleteObjectTagging(objectKey string, options ...Option) er
 	return checkRespCode(resp.StatusCode, []int{http.StatusNoContent})
 }
 
+func (bucket Bucket) OptionsMethod(objectKey string, options ...Option) (int, http.Header, error) {
+	var statusCode int
+	var out http.Header
+	resp, err := bucket.do("OPTIONS", objectKey, nil, options, nil, nil)
+	if err != nil {
+		return statusCode, out, err
+	}
+	defer resp.Body.Close()
+	statusCode = resp.StatusCode
+	out = resp.Headers
+	return statusCode, out, nil
+}
+
 // Private
 func (bucket Bucket) do(method, objectName string, params map[string]interface{}, options []Option,
 	data io.Reader, listener ProgressListener) (*Response, error) {

+ 80 - 0
oss/bucket_test.go

@@ -4317,3 +4317,83 @@ func (s *OssBucketSuite) TestVersioningObjectTagging(c *C) {
 	bucket.DeleteObject(objectName)
 	forceDeleteBucket(client, bucketName, c)
 }
+
+func (s *OssBucketSuite) TestOptionsMethod(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 cors
+	var rule1 = CORSRule{
+		AllowedOrigin: []string{"www.aliyun.com"},
+		AllowedMethod: []string{"PUT", "GET", "POST"},
+		AllowedHeader: []string{"x-oss-meta-author"},
+		ExposeHeader:  []string{"x-oss-meta-name"},
+		MaxAgeSeconds: 100,
+	}
+
+	// set cors
+	err = client.SetBucketCORS(bucketName, []CORSRule{rule1})
+	c.Assert(err, IsNil)
+
+	// bucket options success
+	options := []Option{}
+	originOption := Origin("www.aliyun.com")
+	acMethodOption := ACReqMethod("PUT")
+	acHeadersOption := ACReqHeaders("x-oss-meta-author")
+	options = append(options, originOption)
+	options = append(options, acMethodOption)
+	options = append(options, acHeadersOption)
+	statusCode, _, err := bucket.OptionsMethod("", options...)
+	c.Assert(err, IsNil)
+	c.Assert(statusCode, Equals, 200)
+
+	// options failure
+	options = []Option{}
+	originOption = Origin("www.aliyun.com")
+	acMethodOption = ACReqMethod("PUT")
+	acHeadersOption = ACReqHeaders("x-oss-meta-author-1")
+	options = append(options, originOption)
+	options = append(options, acMethodOption)
+	options = append(options, acHeadersOption)
+	statusCode, _, err = bucket.OptionsMethod("", options...)
+	c.Assert(err, NotNil)
+
+	// put object
+	objectName := objectNamePrefix + randStr(8)
+	context := randStr(100)
+	err = bucket.PutObject(objectName, strings.NewReader(context))
+	c.Assert(err, IsNil)
+
+	// object options success
+	options = []Option{}
+	originOption = Origin("www.aliyun.com")
+	acMethodOption = ACReqMethod("PUT")
+	acHeadersOption = ACReqHeaders("x-oss-meta-author")
+	options = append(options, originOption)
+	options = append(options, acMethodOption)
+	options = append(options, acHeadersOption)
+	statusCode, _, err = bucket.OptionsMethod("", options...)
+	c.Assert(err, IsNil)
+	c.Assert(statusCode, Equals, 200)
+
+	// options failure
+	options = []Option{}
+	originOption = Origin("www.aliyun.com")
+	acMethodOption = ACReqMethod("PUT")
+	acHeadersOption = ACReqHeaders("x-oss-meta-author-1")
+	options = append(options, originOption)
+	options = append(options, acMethodOption)
+	options = append(options, acHeadersOption)
+	statusCode, _, err = bucket.OptionsMethod("", options...)
+	c.Assert(err, NotNil)
+
+	bucket.DeleteObject(objectName)
+	forceDeleteBucket(client, bucketName, c)
+}

+ 2 - 0
oss/const.go

@@ -127,6 +127,8 @@ const (
 	HTTPHeaderIfUnmodifiedSince         = "If-Unmodified-Since"
 	HTTPHeaderIfMatch                   = "If-Match"
 	HTTPHeaderIfNoneMatch               = "If-None-Match"
+	HTTPHeaderACReqMethod               = "Access-Control-Request-Method"
+	HTTPHeaderACReqHeaders              = "Access-Control-Request-Headers"
 
 	HTTPHeaderOssACL                         = "X-Oss-Acl"
 	HTTPHeaderOssMetaPrefix                  = "X-Oss-Meta-"

+ 10 - 0
oss/option.go

@@ -230,6 +230,16 @@ func TaggingDirective(directive TaggingDirectiveType) Option {
 	return setHeader(HTTPHeaderOssTaggingDirective, string(directive))
 }
 
+// ACReqMethod is an option to set Access-Control-Request-Method header
+func ACReqMethod(value string) Option {
+	return setHeader(HTTPHeaderACReqMethod, value)
+}
+
+// ACReqHeaders is an option to set Access-Control-Request-Headers header
+func ACReqHeaders(value string) Option {
+	return setHeader(HTTPHeaderACReqHeaders, value)
+}
+
 // Delimiter is an option to set delimiler parameter
 func Delimiter(value string) Option {
 	return addParam("delimiter", value)