Skip to content

Commit 04a368c

Browse files
committed
add bucket callback policy api
1 parent 77977ff commit 04a368c

File tree

6 files changed

+334
-1
lines changed

6 files changed

+334
-1
lines changed

oss/client.go

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2492,6 +2492,85 @@ func (client Client) DeleteBucketStyle(bucketName, styleName string, options ...
24922492
return CheckRespCode(resp.StatusCode, []int{http.StatusNoContent})
24932493
}
24942494

2495+
// GetBucketCallbackPolicy get bucket's callback policy
2496+
// bucketName the bucket name.
2497+
// error it's nil if no error, otherwise it's an error object.
2498+
func (client Client) GetBucketCallbackPolicy(bucketName string, options ...Option) (GetBucketCallbackPolicyResult, error) {
2499+
var out GetBucketCallbackPolicyResult
2500+
body, err := client.GetBucketCallbackPolicyXml(bucketName, options...)
2501+
if err != nil {
2502+
return out, err
2503+
}
2504+
err = xmlUnmarshal(strings.NewReader(body), &out)
2505+
return out, err
2506+
}
2507+
2508+
// GetBucketCallbackPolicyXml get bucket's callback policy
2509+
// bucketName the bucket name.
2510+
// string the call back policy of bucket in xml format.
2511+
// error it's nil if no error, otherwise it's an error object.
2512+
func (client Client) GetBucketCallbackPolicyXml(bucketName string, options ...Option) (string, error) {
2513+
params := map[string]interface{}{}
2514+
params["policy"] = nil
2515+
params["comp"] = "callback"
2516+
resp, err := client.do("GET", bucketName, params, nil, nil, options...)
2517+
if err != nil {
2518+
return "", err
2519+
}
2520+
defer resp.Body.Close()
2521+
body, err := ioutil.ReadAll(resp.Body)
2522+
out := string(body)
2523+
return out, err
2524+
}
2525+
2526+
// PutBucketCallbackPolicy set bucket's callback policy
2527+
// bucketName the bucket name.
2528+
// callbackPolicy PutBucketCallbackPolicy the call back policy of bucket in struct format.
2529+
// error it's nil if no error, otherwise it's an error object.
2530+
func (client Client) PutBucketCallbackPolicy(bucketName string, callbackPolicy PutBucketCallbackPolicy, options ...Option) error {
2531+
bs, err := xml.Marshal(callbackPolicy)
2532+
if err != nil {
2533+
return err
2534+
}
2535+
err = client.PutBucketCallbackPolicyXml(bucketName, string(bs), options...)
2536+
return err
2537+
}
2538+
2539+
// DeleteBucketCallbackPolicy delete bucket's callback policy
2540+
// bucketName the bucket name.
2541+
// error it's nil if no error, otherwise it's an error object.
2542+
func (client Client) DeleteBucketCallbackPolicy(bucketName string, options ...Option) error {
2543+
params := map[string]interface{}{}
2544+
params["policy"] = nil
2545+
params["comp"] = "callback"
2546+
resp, err := client.do("DELETE", bucketName, params, nil, nil, options...)
2547+
if err != nil {
2548+
return err
2549+
}
2550+
defer resp.Body.Close()
2551+
return CheckRespCode(resp.StatusCode, []int{http.StatusNoContent})
2552+
}
2553+
2554+
// PutBucketCallbackPolicyXml set bucket's callback policy
2555+
// bucketName the bucket name.
2556+
// xmlData the call back policy of bucket in xml format.
2557+
// error it's nil if no error, otherwise it's an error object.
2558+
func (client Client) PutBucketCallbackPolicyXml(bucketName, xmlData string, options ...Option) error {
2559+
buffer := new(bytes.Buffer)
2560+
buffer.Write([]byte(xmlData))
2561+
headers := map[string]string{}
2562+
headers[HTTPHeaderContentType] = "application/xml"
2563+
params := map[string]interface{}{}
2564+
params["policy"] = nil
2565+
params["comp"] = "callback"
2566+
resp, err := client.do("PUT", bucketName, params, headers, buffer, options...)
2567+
if err != nil {
2568+
return err
2569+
}
2570+
defer resp.Body.Close()
2571+
return CheckRespCode(resp.StatusCode, []int{http.StatusOK})
2572+
}
2573+
24952574
// LimitUploadSpeed set upload bandwidth limit speed,default is 0,unlimited
24962575
// upSpeed KB/s, 0 is unlimited,default is 0
24972576
// error it's nil if success, otherwise failure

oss/client_test.go

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
package oss
66

77
import (
8+
"bytes"
9+
"encoding/base64"
810
"encoding/json"
911
"encoding/xml"
1012
"fmt"
@@ -5505,3 +5507,80 @@ func (s *OssClientSuite) TestBucketStyle(c *C) {
55055507
c.Assert(err, IsNil)
55065508

55075509
}
5510+
5511+
// TestBucketCallbackPolicy
5512+
func (s *OssClientSuite) TestBucketCallbackPolicy(c *C) {
5513+
var bucketNameTest = bucketNamePrefix + "-acc-" + RandLowStr(6)
5514+
client, err := New(endpoint, accessID, accessKey)
5515+
c.Assert(err, IsNil)
5516+
5517+
err = client.CreateBucket(bucketNameTest)
5518+
c.Assert(err, IsNil)
5519+
time.Sleep(3 * time.Second)
5520+
5521+
// Put Bucket Callback Policy
5522+
var callbackPolicy PutBucketCallbackPolicy
5523+
callbackVal := base64.StdEncoding.EncodeToString([]byte(`{"callbackUrl":"http://www.aliyuncs.com", "callbackBody":"bucket=${bucket}&object=${object}"}`))
5524+
5525+
callbackVal2 := base64.StdEncoding.EncodeToString([]byte(`{"callbackUrl":"http://www.aliyun.com", "callbackBody":"bucket=${bucket}&object=${object}"}`))
5526+
5527+
callbackVar2 := base64.StdEncoding.EncodeToString([]byte(`{"x:a":"a", "x:b":"b"}`))
5528+
callbackPolicy = PutBucketCallbackPolicy{
5529+
PolicyItem: []PolicyItem{
5530+
{
5531+
PolicyName: "first",
5532+
Callback: callbackVal,
5533+
CallbackVar: "",
5534+
},
5535+
{
5536+
PolicyName: "second",
5537+
Callback: callbackVal2,
5538+
CallbackVar: callbackVar2,
5539+
},
5540+
},
5541+
}
5542+
5543+
err = client.PutBucketCallbackPolicy(bucketNameTest, callbackPolicy)
5544+
c.Assert(err, IsNil)
5545+
5546+
time.Sleep(time.Second * 3)
5547+
5548+
// get bucket callback policy
5549+
res, err := client.GetBucketCallbackPolicy(bucketNameTest)
5550+
c.Assert(err, IsNil)
5551+
c.Assert(len(res.PolicyItem), Equals, 2)
5552+
5553+
bucket, err := client.Bucket(bucketNameTest)
5554+
5555+
name := base64.StdEncoding.EncodeToString([]byte(`{"callbackPolicy":"first"}`))
5556+
err = bucket.PutObject("object.txt", strings.NewReader("hi oss"), Callback(name))
5557+
c.Assert(err, NotNil)
5558+
c.Assert(err.(UnexpectedStatusCodeError).Got(), Equals, 203)
5559+
5560+
name = base64.StdEncoding.EncodeToString([]byte(`{"callbackPolicy":"not_exist_name"}`))
5561+
err = bucket.PutObject("object.txt", strings.NewReader("hi oss"), Callback(name))
5562+
c.Assert(err, NotNil)
5563+
5564+
name = base64.StdEncoding.EncodeToString([]byte(`{"callbackPolicy":"not_exist_name"}`))
5565+
callbackMap := map[string]string{}
5566+
callbackMap["callbackUrl"] = "http://oss-demo.aliyuncs.com:23451"
5567+
callbackMap["callbackHost"] = "oss-cn-hangzhou.aliyuncs.com"
5568+
callbackMap["callbackBody"] = "filename=${object}&size=${size}&mimeType=${mimeType}"
5569+
callbackMap["callbackBodyType"] = "application/x-www-form-urlencoded"
5570+
callbackMap["callbackPolicy"] = "first"
5571+
callbackBuffer := bytes.NewBuffer([]byte{})
5572+
callbackEncoder := json.NewEncoder(callbackBuffer)
5573+
//do not encode '&' to "\u0026"
5574+
callbackEncoder.SetEscapeHTML(false)
5575+
err = callbackEncoder.Encode(callbackMap)
5576+
c.Assert(err, IsNil)
5577+
callbackVal3 := base64.StdEncoding.EncodeToString(callbackBuffer.Bytes())
5578+
err = bucket.PutObject("object.txt", strings.NewReader("hi oss"), Callback(callbackVal3))
5579+
c.Assert(err, NotNil)
5580+
5581+
// delete bucket style
5582+
err = client.DeleteBucketCallbackPolicy(bucketNameTest)
5583+
c.Assert(err, IsNil)
5584+
5585+
ForceDeleteBucket(client, bucketNameTest, c)
5586+
}

oss/type.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1633,3 +1633,21 @@ type BucketStyleXml struct {
16331633
CreateTime string `xml:"CreateTime,omitempty"` // style create time
16341634
LastModifyTime string `xml:"LastModifyTime,omitempty"` // style last modify time
16351635
}
1636+
1637+
// GetBucketCallbackPolicyResult define the callback policy for the bucket
1638+
type GetBucketCallbackPolicyResult BucketCallbackPolicyXml
1639+
1640+
// PutBucketCallbackPolicy define the callback policy for the bucket
1641+
type PutBucketCallbackPolicy BucketCallbackPolicyXml
1642+
1643+
// BucketCallbackPolicyXml define the callback policy of the bucket
1644+
type BucketCallbackPolicyXml struct {
1645+
XMLName xml.Name `xml:"BucketCallbackPolicy"`
1646+
PolicyItem []PolicyItem `xml:"PolicyItem"`
1647+
}
1648+
1649+
type PolicyItem struct {
1650+
PolicyName string `xml:"PolicyName"`
1651+
Callback string `xml:"Callback"`
1652+
CallbackVar string `xml:"CallbackVar"`
1653+
}

oss/type_test.go

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package oss
22

33
import (
4+
"encoding/base64"
45
"encoding/xml"
56
"net/url"
67
"sort"
@@ -1529,4 +1530,59 @@ func (s *OssTypeSuite) TestGetBucketReplicationProgressResult(c *C) {
15291530
c.Assert(repResult.Rule[0].HistoricalObjectReplication, Equals, "enabled")
15301531
c.Assert((*repResult.Rule[0].Progress).HistoricalObject, Equals, "0.85")
15311532
c.Assert((*repResult.Rule[0].Progress).NewObject, Equals, "2015-09-24T15:28:14.000Z")
1532-
}
1533+
}
1534+
1535+
func (s *OssTypeSuite) TestGetBucketCallbackPolicyResult(c *C) {
1536+
xmlData := `<?xml version="1.0" encoding="UTF-8"?>
1537+
<BucketCallbackPolicy>
1538+
<PolicyItem>
1539+
<PolicyName>first</PolicyName>
1540+
<Callback>e1wiY2FsR7YnU=</Callback>
1541+
<CallbackVar>Q2FsbGmJcIn0=</CallbackVar>
1542+
</PolicyItem>
1543+
<PolicyItem>
1544+
<PolicyName>second</PolicyName>
1545+
<Callback>e1wiY2Fsb9keVwiOlwiYnVja2V0PSR7YnU=</Callback>
1546+
<CallbackVar>Q2FsFcIiwgXCJ4OmJcIjpcImJcIn0=</CallbackVar>
1547+
</PolicyItem>
1548+
</BucketCallbackPolicy>`
1549+
var repResult GetBucketCallbackPolicyResult
1550+
err := xmlUnmarshal(strings.NewReader(xmlData), &repResult)
1551+
c.Assert(err, IsNil)
1552+
c.Assert(repResult.PolicyItem[0].PolicyName, Equals, "first")
1553+
c.Assert(repResult.PolicyItem[0].Callback, Equals, "e1wiY2FsR7YnU=")
1554+
c.Assert(repResult.PolicyItem[0].CallbackVar, Equals, "Q2FsbGmJcIn0=")
1555+
1556+
c.Assert(repResult.PolicyItem[1].PolicyName, Equals, "second")
1557+
c.Assert(repResult.PolicyItem[1].Callback, Equals, "e1wiY2Fsb9keVwiOlwiYnVja2V0PSR7YnU=")
1558+
c.Assert(repResult.PolicyItem[1].CallbackVar, Equals, "Q2FsFcIiwgXCJ4OmJcIjpcImJcIn0=")
1559+
}
1560+
1561+
func (s *OssTypeSuite) TestPutBucketCallbackPolicy(c *C) {
1562+
xmlData := `<BucketCallbackPolicy><PolicyItem><PolicyName>first</PolicyName><Callback>eyJjYWxsYmFja1VybCI6Imh0dHA6Ly93d3cuYWxpeXVuY3MuY29tIiwgImNhbGxiYWNrQm9keSI6ImJ1Y2tldD0ke2J1Y2tldH0mb2JqZWN0PSR7b2JqZWN0fSJ9</Callback><CallbackVar></CallbackVar></PolicyItem><PolicyItem><PolicyName>second</PolicyName><Callback>eyJjYWxsYmFja1VybCI6Imh0dHA6Ly93d3cuYWxpeXVuLmNvbSIsICJjYWxsYmFja0JvZHkiOiJidWNrZXQ9JHtidWNrZXR9Jm9iamVjdD0ke29iamVjdH0ifQ==</Callback><CallbackVar>eyJ4OmEiOiJhIiwgIng6YiI6ImIifQ==</CallbackVar></PolicyItem></BucketCallbackPolicy>`
1563+
var callbackPolicy PutBucketCallbackPolicy
1564+
callbackVal := base64.StdEncoding.EncodeToString([]byte(`{"callbackUrl":"http://www.aliyuncs.com", "callbackBody":"bucket=${bucket}&object=${object}"}`))
1565+
1566+
callbackVal2 := base64.StdEncoding.EncodeToString([]byte(`{"callbackUrl":"http://www.aliyun.com", "callbackBody":"bucket=${bucket}&object=${object}"}`))
1567+
1568+
callbackVar2 := base64.StdEncoding.EncodeToString([]byte(`{"x:a":"a", "x:b":"b"}`))
1569+
callbackPolicy = PutBucketCallbackPolicy{
1570+
PolicyItem: []PolicyItem{
1571+
{
1572+
PolicyName: "first",
1573+
Callback: callbackVal,
1574+
CallbackVar: "",
1575+
},
1576+
{
1577+
PolicyName: "second",
1578+
Callback: callbackVal2,
1579+
CallbackVar: callbackVar2,
1580+
},
1581+
},
1582+
}
1583+
bs, err := xml.Marshal(callbackPolicy)
1584+
c.Assert(err, IsNil)
1585+
testLogger.Println(string(bs))
1586+
c.Assert(string(bs), Equals, xmlData)
1587+
1588+
}

sample.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ var sampleMap = map[string]interface{}{
3434
"BucketCnameSample": sample.BucketCnameSample,
3535
"BucketStyleSample": sample.BucketStyleSample,
3636
"BucketReplicationSample": sample.BucketReplicationSample,
37+
"BucketCallbackPolicySample": sample.BucketCallbackPolicySample,
3738
"ObjectACLSample": sample.ObjectACLSample,
3839
"ObjectMetaSample": sample.ObjectMetaSample,
3940
"ListObjectsSample": sample.ListObjectsSample,

sample/bucket_callbackpolicy.go

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
package sample
2+
3+
import (
4+
"encoding/base64"
5+
"fmt"
6+
"github.com/aliyun/aliyun-oss-go-sdk/oss"
7+
"os"
8+
"strings"
9+
)
10+
11+
// BucketCallbackPolicySample shows how to set, get and delete the bucket callback policy configuration
12+
func BucketCallbackPolicySample() {
13+
// New client
14+
client, err := oss.New(endpoint, accessID, accessKey)
15+
if err != nil {
16+
HandleError(err)
17+
}
18+
19+
// Create the bucket with default parameters
20+
err = client.CreateBucket(bucketName)
21+
if err != nil {
22+
HandleError(err)
23+
}
24+
25+
// the policy string
26+
var callbackPolicy oss.PutBucketCallbackPolicy
27+
callbackVal := base64.StdEncoding.EncodeToString([]byte(`{"callbackUrl":"http://www.aliyuncs.com", "callbackBody":"bucket=${bucket}&object=${object}"}`))
28+
29+
callbackVal2 := base64.StdEncoding.EncodeToString([]byte(`{"callbackUrl":"http://www.aliyun.com", "callbackBody":"bucket=${bucket}&object=${object}"}`))
30+
31+
callbackVar2 := base64.StdEncoding.EncodeToString([]byte(`{"x:a":"a", "x:b":"b"}`))
32+
callbackPolicy = oss.PutBucketCallbackPolicy{
33+
PolicyItem: []oss.PolicyItem{
34+
{
35+
PolicyName: "first",
36+
Callback: callbackVal,
37+
CallbackVar: "",
38+
},
39+
{
40+
PolicyName: "second",
41+
Callback: callbackVal2,
42+
CallbackVar: callbackVar2,
43+
},
44+
},
45+
}
46+
47+
// Set callback policy
48+
err = client.PutBucketCallbackPolicy(bucketName, callbackPolicy)
49+
if err != nil {
50+
HandleError(err)
51+
}
52+
53+
fmt.Println("Put Bucket Callback Policy Success!")
54+
55+
// Get Bucket policy
56+
result, err := client.GetBucketCallbackPolicy(bucketName)
57+
if err != nil {
58+
HandleError(err)
59+
}
60+
for _, policy := range result.PolicyItem {
61+
fmt.Printf("Callback Policy Name:%s\n", policy.PolicyName)
62+
63+
callback, _ := base64.StdEncoding.DecodeString(policy.Callback)
64+
fmt.Printf("Callback Policy Callback:%s\n", callback)
65+
if policy.CallbackVar != "" {
66+
callbackVar, _ := base64.StdEncoding.DecodeString(policy.CallbackVar)
67+
fmt.Printf("Callback Policy Callback Var:%s\n", callbackVar)
68+
}
69+
}
70+
fmt.Println("Get Bucket Callback Policy Success!")
71+
72+
// Delete Bucket policy
73+
err = client.DeleteBucketCallbackPolicy(bucketName)
74+
if err != nil {
75+
HandleError(err)
76+
}
77+
fmt.Println("Delete Bucket Callback Policy Success!")
78+
79+
// put object by use callback policy
80+
bucket, err := client.Bucket(bucketName)
81+
if err != nil {
82+
fmt.Println("Error:", err)
83+
os.Exit(-1)
84+
}
85+
name := base64.StdEncoding.EncodeToString([]byte(`{"callbackPolicy":"first"}`))
86+
err = bucket.PutObject("example-object.txt", strings.NewReader("Hello OSS"), oss.Callback(name))
87+
if err != nil {
88+
fmt.Println("Error:", err)
89+
os.Exit(-1)
90+
}
91+
fmt.Println("Use Callback Policy Success!")
92+
93+
// Delete bucket
94+
err = client.DeleteBucket(bucketName)
95+
if err != nil {
96+
HandleError(err)
97+
}
98+
99+
fmt.Println("BucketCallbackPolicySample completed")
100+
}

0 commit comments

Comments
 (0)