7 changed files with 432 additions and 10 deletions
-
90bucket_origin.go
-
4cos.go
-
12example/bucket/getObjectVersion.go
-
92example/bucket/origin.go
-
75example/object/tagging.go
-
96example/sts/sts_v3.go
-
73object.go
@ -0,0 +1,90 @@ |
|||||
|
package cos |
||||
|
|
||||
|
import ( |
||||
|
"context" |
||||
|
"encoding/xml" |
||||
|
"net/http" |
||||
|
) |
||||
|
|
||||
|
type BucketPutOriginOptions struct { |
||||
|
XMLName xml.Name `xml:"OriginConfiguration"` |
||||
|
Rule []BucketOriginRule `xml:"OriginRule"` |
||||
|
} |
||||
|
|
||||
|
type BucketOriginRule struct { |
||||
|
OriginType string `xml:"OriginType"` |
||||
|
OriginCondition *BucketOriginCondition `xml:"OriginCondition"` |
||||
|
OriginParameter *BucketOriginParameter `xml:"OriginParameter"` |
||||
|
OriginInfo *BucketOriginInfo `xml:"OriginInfo"` |
||||
|
} |
||||
|
|
||||
|
type BucketOriginCondition struct { |
||||
|
HTTPStatusCode string `xml:"HTTPStatusCode,omitempty"` |
||||
|
Prefix string `xml:"Prefix,omitempty"` |
||||
|
} |
||||
|
|
||||
|
type BucketOriginParameter struct { |
||||
|
Protocol string `xml:"Protocol,omitempty"` |
||||
|
FollowQueryString bool `xml:"FollowQueryString,omitempty"` |
||||
|
HttpHeader *BucketOriginHttpHeader `xml:"HttpHeader,omitempty"` |
||||
|
FollowRedirection bool `xml:"FollowRedirection,omitempty"` |
||||
|
HttpRedirectCode string `xml:"HttpRedirectCode,omitempty"` |
||||
|
CopyOriginData bool `xml:"CopyOriginData,omitempty"` |
||||
|
} |
||||
|
|
||||
|
type BucketOriginHttpHeader struct { |
||||
|
// 目前还不支持 FollowAllHeaders
|
||||
|
// FollowAllHeaders bool `xml:"FollowAllHeaders,omitempty"`
|
||||
|
NewHttpHeaders []OriginHttpHeader `xml:"NewHttpHeaders>Header,omitempty"` |
||||
|
FollowHttpHeaders []OriginHttpHeader `xml:"FollowHttpHeaders>Header,omitempty"` |
||||
|
} |
||||
|
|
||||
|
type OriginHttpHeader struct { |
||||
|
Key string `xml:"Key,omitempty"` |
||||
|
Value string `xml:"Value,omitempty"` |
||||
|
} |
||||
|
|
||||
|
type BucketOriginInfo struct { |
||||
|
HostInfo string `xml:"HostInfo>HostName,omitempty"` |
||||
|
FileInfo *BucketOriginFileInfo `xml:"FileInfo,omitempty"` |
||||
|
} |
||||
|
type BucketOriginFileInfo struct { |
||||
|
PrefixDirective bool `xml:"PrefixDirective,omitempty"` |
||||
|
Prefix string `xml:"Prefix,omitempty"` |
||||
|
Suffix string `xml:"Suffix,omitempty"` |
||||
|
} |
||||
|
|
||||
|
type BucketGetOriginResult BucketPutOriginOptions |
||||
|
|
||||
|
func (s *BucketService) PutOrigin(ctx context.Context, opt *BucketPutOriginOptions) (*Response, error) { |
||||
|
sendOpt := &sendOptions{ |
||||
|
baseURL: s.client.BaseURL.BucketURL, |
||||
|
uri: "/?origin", |
||||
|
method: http.MethodPut, |
||||
|
body: opt, |
||||
|
} |
||||
|
resp, err := s.client.send(ctx, sendOpt) |
||||
|
return resp, err |
||||
|
} |
||||
|
|
||||
|
func (s *BucketService) GetOrigin(ctx context.Context) (*BucketGetOriginResult, *Response, error) { |
||||
|
var res BucketGetOriginResult |
||||
|
sendOpt := &sendOptions{ |
||||
|
baseURL: s.client.BaseURL.BucketURL, |
||||
|
uri: "/?origin", |
||||
|
method: http.MethodGet, |
||||
|
result: &res, |
||||
|
} |
||||
|
resp, err := s.client.send(ctx, sendOpt) |
||||
|
return &res, resp, err |
||||
|
} |
||||
|
|
||||
|
func (s *BucketService) DeleteOrigin(ctx context.Context) (*Response, error) { |
||||
|
sendOpt := &sendOptions{ |
||||
|
baseURL: s.client.BaseURL.BucketURL, |
||||
|
uri: "/?origin", |
||||
|
method: http.MethodDelete, |
||||
|
} |
||||
|
resp, err := s.client.send(ctx, sendOpt) |
||||
|
return resp, err |
||||
|
} |
@ -0,0 +1,92 @@ |
|||||
|
package main |
||||
|
|
||||
|
import ( |
||||
|
"context" |
||||
|
"fmt" |
||||
|
"net/http" |
||||
|
"net/url" |
||||
|
"os" |
||||
|
|
||||
|
"github.com/tencentyun/cos-go-sdk-v5" |
||||
|
"github.com/tencentyun/cos-go-sdk-v5/debug" |
||||
|
) |
||||
|
|
||||
|
func log_status(err error) { |
||||
|
if err == nil { |
||||
|
return |
||||
|
} |
||||
|
if cos.IsNotFoundError(err) { |
||||
|
// WARN
|
||||
|
fmt.Println("Resource is not existed") |
||||
|
} else if e, ok := cos.IsCOSError(err); ok { |
||||
|
fmt.Printf("Code: %v\n", e.Code) |
||||
|
fmt.Printf("Message: %v\n", e.Message) |
||||
|
fmt.Printf("Resource: %v\n", e.Resource) |
||||
|
fmt.Printf("RequestId: %v\n", e.RequestID) |
||||
|
// ERROR
|
||||
|
} else { |
||||
|
fmt.Println(err) |
||||
|
// ERROR
|
||||
|
} |
||||
|
} |
||||
|
|
||||
|
func main() { |
||||
|
u, _ := url.Parse("https://test-1259654469.cos.ap-guangzhou.myqcloud.com") |
||||
|
b := &cos.BaseURL{ |
||||
|
BucketURL: u, |
||||
|
} |
||||
|
c := cos.NewClient(b, &http.Client{ |
||||
|
Transport: &cos.AuthorizationTransport{ |
||||
|
SecretID: os.Getenv("COS_SECRETID"), |
||||
|
SecretKey: os.Getenv("COS_SECRETKEY"), |
||||
|
Transport: &debug.DebugRequestTransport{ |
||||
|
RequestHeader: true, |
||||
|
RequestBody: true, |
||||
|
ResponseHeader: true, |
||||
|
ResponseBody: true, |
||||
|
}, |
||||
|
}, |
||||
|
}) |
||||
|
|
||||
|
opt := &cos.BucketPutOriginOptions{ |
||||
|
Rule: []cos.BucketOriginRule{ |
||||
|
{ |
||||
|
OriginType: "Proxy", |
||||
|
OriginCondition: &cos.BucketOriginCondition{ |
||||
|
HTTPStatusCode: "404", |
||||
|
Prefix: "", |
||||
|
}, |
||||
|
OriginParameter: &cos.BucketOriginParameter{ |
||||
|
Protocol: "FOLLOW", |
||||
|
FollowQueryString: true, |
||||
|
HttpHeader: &cos.BucketOriginHttpHeader{ |
||||
|
NewHttpHeaders: []cos.OriginHttpHeader{ |
||||
|
{ |
||||
|
Key: "x-cos-ContentType", |
||||
|
Value: "csv", |
||||
|
}, |
||||
|
}, |
||||
|
FollowHttpHeaders: []cos.OriginHttpHeader{ |
||||
|
{ |
||||
|
Key: "Content-Type", |
||||
|
}, |
||||
|
}, |
||||
|
}, |
||||
|
FollowRedirection: true, |
||||
|
}, |
||||
|
OriginInfo: &cos.BucketOriginInfo{ |
||||
|
HostInfo: "examplebucket-1250000000.cos.ap-shanghai.myqcloud.com", |
||||
|
}, |
||||
|
}, |
||||
|
}, |
||||
|
} |
||||
|
|
||||
|
_, err := c.Bucket.PutOrigin(context.Background(), opt) |
||||
|
log_status(err) |
||||
|
res, _, err := c.Bucket.GetOrigin(context.Background()) |
||||
|
log_status(err) |
||||
|
fmt.Printf("%+v\n", res) |
||||
|
fmt.Printf("%+v\n", res.Rule) |
||||
|
_, err = c.Bucket.DeleteOrigin(context.Background()) |
||||
|
log_status(err) |
||||
|
} |
@ -0,0 +1,75 @@ |
|||||
|
package main |
||||
|
|
||||
|
import ( |
||||
|
"context" |
||||
|
"fmt" |
||||
|
"net/url" |
||||
|
"os" |
||||
|
|
||||
|
"net/http" |
||||
|
|
||||
|
"github.com/tencentyun/cos-go-sdk-v5" |
||||
|
"github.com/tencentyun/cos-go-sdk-v5/debug" |
||||
|
) |
||||
|
|
||||
|
func log_status(err error) { |
||||
|
if err == nil { |
||||
|
return |
||||
|
} |
||||
|
if cos.IsNotFoundError(err) { |
||||
|
// WARN
|
||||
|
fmt.Println("WARN: Resource is not existed") |
||||
|
} else if e, ok := cos.IsCOSError(err); ok { |
||||
|
fmt.Printf("ERROR: Code: %v\n", e.Code) |
||||
|
fmt.Printf("ERROR: Message: %v\n", e.Message) |
||||
|
fmt.Printf("ERROR: Resource: %v\n", e.Resource) |
||||
|
fmt.Printf("ERROR: RequestId: %v\n", e.RequestID) |
||||
|
// ERROR
|
||||
|
} else { |
||||
|
fmt.Printf("ERROR: %v\n", err) |
||||
|
// ERROR
|
||||
|
} |
||||
|
} |
||||
|
|
||||
|
func main() { |
||||
|
u, _ := url.Parse("https://test-1259654469.cos.ap-guangzhou.myqcloud.com") |
||||
|
b := &cos.BaseURL{ |
||||
|
BucketURL: u, |
||||
|
} |
||||
|
c := cos.NewClient(b, &http.Client{ |
||||
|
Transport: &cos.AuthorizationTransport{ |
||||
|
SecretID: os.Getenv("COS_SECRETID"), |
||||
|
SecretKey: os.Getenv("COS_SECRETKEY"), |
||||
|
Transport: &debug.DebugRequestTransport{ |
||||
|
RequestHeader: true, |
||||
|
RequestBody: true, |
||||
|
ResponseHeader: true, |
||||
|
ResponseBody: true, |
||||
|
}, |
||||
|
}, |
||||
|
}) |
||||
|
name := "test" |
||||
|
|
||||
|
opt := &cos.ObjectPutTaggingOptions{ |
||||
|
TagSet: []cos.ObjectTaggingTag{ |
||||
|
{ |
||||
|
Key: "test_k2", |
||||
|
Value: "test_v2", |
||||
|
}, |
||||
|
{ |
||||
|
Key: "test_k3", |
||||
|
Value: "test_v3", |
||||
|
}, |
||||
|
}, |
||||
|
} |
||||
|
|
||||
|
_, err := c.Object.PutTagging(context.Background(), name, opt) |
||||
|
log_status(err) |
||||
|
|
||||
|
res, _, err := c.Object.GetTagging(context.Background(), name) |
||||
|
log_status(err) |
||||
|
fmt.Printf("%v\n", res.TagSet) |
||||
|
|
||||
|
_, err = c.Object.DeleteTagging(context.Background(), name) |
||||
|
log_status(err) |
||||
|
} |
@ -0,0 +1,96 @@ |
|||||
|
package main |
||||
|
|
||||
|
import ( |
||||
|
"context" |
||||
|
"fmt" |
||||
|
"github.com/tencentyun/cos-go-sdk-v5" |
||||
|
"github.com/tencentyun/cos-go-sdk-v5/debug" |
||||
|
"github.com/tencentyun/qcloud-cos-sts-sdk/go" |
||||
|
"net/http" |
||||
|
"net/url" |
||||
|
"os" |
||||
|
"strings" |
||||
|
"time" |
||||
|
) |
||||
|
|
||||
|
func main() { |
||||
|
appid := "1259654469" |
||||
|
bucket := "test-1259654469" |
||||
|
c := sts.NewClient( |
||||
|
os.Getenv("COS_SECRETID"), |
||||
|
os.Getenv("COS_SECRETKEY"), |
||||
|
nil, |
||||
|
) |
||||
|
opt := &sts.CredentialOptions{ |
||||
|
DurationSeconds: int64(time.Hour.Seconds()), |
||||
|
Region: "ap-guangzhou", |
||||
|
Policy: &sts.CredentialPolicy{ |
||||
|
Statement: []sts.CredentialPolicyStatement{ |
||||
|
{ |
||||
|
Action: []string{ |
||||
|
"name/cos:PostObject", |
||||
|
"name/cos:PutObject", |
||||
|
"name/cos:GetObject", |
||||
|
}, |
||||
|
Effect: "allow", |
||||
|
Resource: []string{ |
||||
|
//这里改成允许的路径前缀,可以根据自己网站的用户登录态判断允许上传的具体路径,例子: a.jpg 或者 a/* 或者 * (使用通配符*存在重大安全风险, 请谨慎评估使用)
|
||||
|
"qcs::cos:ap-guangzhou:uid/" + appid + ":" + bucket + "/exampleobject", |
||||
|
}, |
||||
|
}, |
||||
|
}, |
||||
|
}, |
||||
|
} |
||||
|
res, err := c.GetCredential(opt) |
||||
|
if err != nil { |
||||
|
panic(err) |
||||
|
} |
||||
|
fmt.Printf("%+v\n", res.Credentials) |
||||
|
|
||||
|
//获取临时ak、sk、token
|
||||
|
tAk := res.Credentials.TmpSecretID |
||||
|
tSk := res.Credentials.TmpSecretKey |
||||
|
token := res.Credentials.SessionToken |
||||
|
|
||||
|
u, _ := url.Parse("https://" + bucket + ".cos.ap-guangzhou.myqcloud.com") |
||||
|
b := &cos.BaseURL{BucketURL: u} |
||||
|
client := cos.NewClient(b, &http.Client{ |
||||
|
Transport: &cos.AuthorizationTransport{ |
||||
|
// 使用临时密钥
|
||||
|
SecretID: tAk, |
||||
|
SecretKey: tSk, |
||||
|
SessionToken: token, |
||||
|
Transport: &debug.DebugRequestTransport{ |
||||
|
RequestHeader: true, |
||||
|
RequestBody: true, |
||||
|
ResponseHeader: true, |
||||
|
ResponseBody: true, |
||||
|
}, |
||||
|
}, |
||||
|
}) |
||||
|
|
||||
|
name := "exampleobject" |
||||
|
f := strings.NewReader("test") |
||||
|
|
||||
|
_, err = client.Object.Put(context.Background(), name, f, nil) |
||||
|
if err != nil { |
||||
|
panic(err) |
||||
|
} |
||||
|
|
||||
|
name = "exampleobject" |
||||
|
f = strings.NewReader("test xxx") |
||||
|
optc := &cos.ObjectPutOptions{ |
||||
|
ObjectPutHeaderOptions: &cos.ObjectPutHeaderOptions{ |
||||
|
ContentType: "text/html", |
||||
|
}, |
||||
|
ACLHeaderOptions: &cos.ACLHeaderOptions{ |
||||
|
//XCosACL: "public-read",
|
||||
|
XCosACL: "private", |
||||
|
}, |
||||
|
} |
||||
|
_, err = client.Object.Put(context.Background(), name, f, optc) |
||||
|
if err != nil { |
||||
|
panic(err) |
||||
|
} |
||||
|
|
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue