Skip to content

Commit b720e89

Browse files
author
wanjiewu
committed
Merge branch 'master' into asrjob
2 parents 99c1f41 + 1a1a581 commit b720e89

File tree

8 files changed

+184
-27
lines changed

8 files changed

+184
-27
lines changed

auth.go

Lines changed: 56 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ type CVMSecurityCredentials struct {
339339
Code string `json:",omitempty"`
340340
}
341341

342-
type CVMCredentialsTransport struct {
342+
type CVMCredentialTransport struct {
343343
RoleName string
344344
Transport http.RoundTripper
345345
secretID string
@@ -349,7 +349,7 @@ type CVMCredentialsTransport struct {
349349
rwLocker sync.RWMutex
350350
}
351351

352-
func (t *CVMCredentialsTransport) GetRoles() ([]string, error) {
352+
func (t *CVMCredentialTransport) GetRoles() ([]string, error) {
353353
urlname := fmt.Sprintf("%s://%s/%s", defaultCVMSchema, defaultCVMMetaHost, defaultCVMCredURI)
354354
resp, err := http.Get(urlname)
355355
if err != nil {
@@ -372,7 +372,7 @@ func (t *CVMCredentialsTransport) GetRoles() ([]string, error) {
372372
}
373373

374374
// https://cloud.tencent.com/document/product/213/4934
375-
func (t *CVMCredentialsTransport) UpdateCredential(now int64) (string, string, string, error) {
375+
func (t *CVMCredentialTransport) UpdateCredential(now int64) (string, string, string, error) {
376376
t.rwLocker.Lock()
377377
defer t.rwLocker.Unlock()
378378
if t.expiredTime > now+defaultCVMAuthExpire {
@@ -408,7 +408,7 @@ func (t *CVMCredentialsTransport) UpdateCredential(now int64) (string, string, s
408408
return t.secretID, t.secretKey, t.sessionToken, nil
409409
}
410410

411-
func (t *CVMCredentialsTransport) GetCredential() (string, string, string, error) {
411+
func (t *CVMCredentialTransport) GetCredential() (string, string, string, error) {
412412
now := time.Now().Unix()
413413
t.rwLocker.RLock()
414414
// 提前 defaultCVMAuthExpire 获取重新获取临时密钥
@@ -426,7 +426,7 @@ func (t *CVMCredentialsTransport) GetCredential() (string, string, string, error
426426
return t.secretID, t.secretKey, t.sessionToken, nil
427427
}
428428

429-
func (t *CVMCredentialsTransport) RoundTrip(req *http.Request) (*http.Response, error) {
429+
func (t *CVMCredentialTransport) RoundTrip(req *http.Request) (*http.Response, error) {
430430
ak, sk, token, err := t.GetCredential()
431431
if err != nil {
432432
return nil, err
@@ -440,9 +440,59 @@ func (t *CVMCredentialsTransport) RoundTrip(req *http.Request) (*http.Response,
440440
return resp, err
441441
}
442442

443-
func (t *CVMCredentialsTransport) transport() http.RoundTripper {
443+
func (t *CVMCredentialTransport) transport() http.RoundTripper {
444444
if t.Transport != nil {
445445
return t.Transport
446446
}
447447
return http.DefaultTransport
448448
}
449+
450+
type CredentialTransport struct {
451+
Transport http.RoundTripper
452+
Credential CredentialIface
453+
}
454+
455+
func (t *CredentialTransport) RoundTrip(req *http.Request) (*http.Response, error) {
456+
ak, sk, token := t.Credential.GetSecretId(), t.Credential.GetSecretKey(), t.Credential.GetToken()
457+
458+
req = cloneRequest(req)
459+
// 增加 Authorization header
460+
authTime := NewAuthTime(defaultAuthExpire)
461+
AddAuthorizationHeader(ak, sk, token, req, authTime)
462+
463+
resp, err := t.transport().RoundTrip(req)
464+
return resp, err
465+
}
466+
467+
func (t *CredentialTransport) transport() http.RoundTripper {
468+
if t.Transport != nil {
469+
return t.Transport
470+
}
471+
return http.DefaultTransport
472+
}
473+
474+
type CredentialIface interface {
475+
GetSecretId() string
476+
GetToken() string
477+
GetSecretKey() string
478+
}
479+
480+
func NewTokenCredential(secretId, secretKey, token string) *Credential {
481+
return &Credential{
482+
SecretID: secretId,
483+
SecretKey: secretKey,
484+
SessionToken: token,
485+
}
486+
}
487+
488+
func (c *Credential) GetSecretKey() string {
489+
return c.SecretKey
490+
}
491+
492+
func (c *Credential) GetSecretId() string {
493+
return c.SecretID
494+
}
495+
496+
func (c *Credential) GetToken() string {
497+
return c.SessionToken
498+
}

auth_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ func TestAuthorizationTransport(t *testing.T) {
5757
client.doAPI(context.Background(), req, nil, true)
5858
}
5959

60-
func TestCVMCredentialsTransport(t *testing.T) {
60+
func TestCVMCredentialTransport(t *testing.T) {
6161
setup()
6262
defer teardown()
6363
uri := client.BaseURL.BucketURL.String()
@@ -67,15 +67,15 @@ func TestCVMCredentialsTransport(t *testing.T) {
6767

6868
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
6969
if r.Header.Get("x-cos-security-token") != token {
70-
t.Errorf("CVMCredentialsTransport x-cos-security-token error, want:%v, return:%v\n", token, r.Header.Get("x-cos-security-token"))
70+
t.Errorf("CVMCredentialTransport x-cos-security-token error, want:%v, return:%v\n", token, r.Header.Get("x-cos-security-token"))
7171
}
7272
auth := r.Header.Get("Authorization")
7373
if auth == "" {
74-
t.Error("CVMCredentialsTransport didn't add Authorization header")
74+
t.Error("CVMCredentialTransport didn't add Authorization header")
7575
}
7676
field := strings.Split(auth, "&")
7777
if len(field) != 7 {
78-
t.Errorf("CVMCredentialsTransport Authorization header format error: %v\n", auth)
78+
t.Errorf("CVMCredentialTransport Authorization header format error: %v\n", auth)
7979
}
8080
st_et := strings.Split(strings.Split(field[2], "=")[1], ";")
8181
st, _ := strconv.ParseInt(st_et[0], 10, 64)
@@ -91,7 +91,7 @@ func TestCVMCredentialsTransport(t *testing.T) {
9191
req.Header.Add("Host", host)
9292
expect := newAuthorization(ak, sk, req, authTime, true)
9393
if expect != auth {
94-
t.Errorf("CVMCredentialsTransport Authorization error, want:%v, return:%v\n", expect, auth)
94+
t.Errorf("CVMCredentialTransport Authorization error, want:%v, return:%v\n", expect, auth)
9595
}
9696
})
9797

@@ -116,7 +116,7 @@ func TestCVMCredentialsTransport(t *testing.T) {
116116
}`, ak, sk, time.Now().Unix()+3600, token))
117117
})
118118

119-
client.client.Transport = &CVMCredentialsTransport{}
119+
client.client.Transport = &CVMCredentialTransport{}
120120
req, _ := http.NewRequest("GET", client.BaseURL.BucketURL.String(), nil)
121121
client.doAPI(context.Background(), req, nil, true)
122122

bucket_inventory.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,15 @@ type BucketGetInventoryResult BucketPutInventoryOptions
1515
// BucketListInventoryConfiguartion same struct to options
1616
type BucketListInventoryConfiguartion BucketPutInventoryOptions
1717

18+
type BucketInventoryFilterPeriod struct {
19+
StartTime int64 `xml:"StartTime,omitempty"`
20+
EndTime int64 `xml:"EndTime,omitempty"`
21+
}
22+
1823
// BucketInventoryFilter ...
1924
type BucketInventoryFilter struct {
20-
Prefix string `xml:"Prefix,omitempty"`
25+
Prefix string `xml:"Prefix,omitempty"`
26+
Period *BucketInventoryFilterPeriod `xml:"Period,omitempty"`
2127
}
2228

2329
// BucketInventoryOptionalFields ...

cos.go

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import (
2323

2424
const (
2525
// Version current go sdk version
26-
Version = "0.7.33"
26+
Version = "0.7.34"
2727
userAgent = "cos-go-sdk-v5/" + Version
2828
contentTypeXML = "application/xml"
2929
defaultServiceBaseURL = "http://service.cos.myqcloud.com"
@@ -160,17 +160,35 @@ type Credential struct {
160160
}
161161

162162
func (c *Client) GetCredential() *Credential {
163-
auth, ok := c.client.Transport.(*AuthorizationTransport)
164-
if !ok {
165-
return nil
163+
if auth, ok := c.client.Transport.(*AuthorizationTransport); ok {
164+
auth.rwLocker.Lock()
165+
defer auth.rwLocker.Unlock()
166+
return &Credential{
167+
SecretID: auth.SecretID,
168+
SecretKey: auth.SecretKey,
169+
SessionToken: auth.SessionToken,
170+
}
171+
}
172+
if auth, ok := c.client.Transport.(*CVMCredentialTransport); ok {
173+
ak, sk, token, err := auth.GetCredential()
174+
if err != nil {
175+
return nil
176+
}
177+
return &Credential{
178+
SecretID: ak,
179+
SecretKey: sk,
180+
SessionToken: token,
181+
}
166182
}
167-
auth.rwLocker.Lock()
168-
defer auth.rwLocker.Unlock()
169-
return &Credential{
170-
SecretID: auth.SecretID,
171-
SecretKey: auth.SecretKey,
172-
SessionToken: auth.SessionToken,
183+
if auth, ok := c.client.Transport.(*CredentialTransport); ok {
184+
ak, sk, token := auth.Credential.GetSecretId(), auth.Credential.GetSecretKey(), auth.Credential.GetToken()
185+
return &Credential{
186+
SecretID: ak,
187+
SecretKey: sk,
188+
SessionToken: token,
189+
}
173190
}
191+
return nil
174192
}
175193

176194
func (c *Client) newRequest(ctx context.Context, baseURL *url.URL, uri, method string, body interface{}, optQuery interface{}, optHeader interface{}) (req *http.Request, err error) {

cos_test.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,15 +124,17 @@ func TestNewClient(t *testing.T) {
124124
}
125125

126126
func TestNewBucketURL_secure_false(t *testing.T) {
127-
got := NewBucketURL("bname-idx", "ap-guangzhou", false).String()
127+
u, _ := NewBucketURL("bname-idx", "ap-guangzhou", false)
128+
got := u.String()
128129
want := "http://bname-idx.cos.ap-guangzhou.myqcloud.com"
129130
if got != want {
130131
t.Errorf("NewBucketURL is %v, want %v", got, want)
131132
}
132133
}
133134

134135
func TestNewBucketURL_secure_true(t *testing.T) {
135-
got := NewBucketURL("bname-idx", "ap-guangzhou", true).String()
136+
u, _ := NewBucketURL("bname-idx", "ap-guangzhou", true)
137+
got := u.String()
136138
want := "https://bname-idx.cos.ap-guangzhou.myqcloud.com"
137139
if got != want {
138140
t.Errorf("NewBucketURL is %v, want %v", got, want)
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"net/url"
7+
8+
"net/http"
9+
"os"
10+
11+
"github.com/tencentyun/cos-go-sdk-v5"
12+
"github.com/tencentyun/cos-go-sdk-v5/debug"
13+
)
14+
15+
func log_status(err error) {
16+
if err == nil {
17+
return
18+
}
19+
if cos.IsNotFoundError(err) {
20+
// WARN
21+
fmt.Println("WARN: Resource is not existed")
22+
} else if e, ok := cos.IsCOSError(err); ok {
23+
fmt.Printf("ERROR: Code: %v\n", e.Code)
24+
fmt.Printf("ERROR: Message: %v\n", e.Message)
25+
fmt.Printf("ERROR: Resource: %v\n", e.Resource)
26+
fmt.Printf("ERROR: RequestId: %v\n", e.RequestID)
27+
// ERROR
28+
} else {
29+
fmt.Printf("ERROR: %v\n", err)
30+
// ERROR
31+
}
32+
}
33+
34+
type Credential struct {
35+
}
36+
37+
// 需实现 CredentialIface 三个方法
38+
func (c *Credential) GetSecretId() string {
39+
return os.Getenv("COS_SECRETID")
40+
}
41+
42+
func (c *Credential) GetSecretKey() string {
43+
return os.Getenv("COS_SECRETKEY")
44+
}
45+
46+
func (c *Credential) GetToken() string {
47+
return ""
48+
}
49+
50+
func main() {
51+
u, _ := url.Parse("https://test-1259654469.cos.ap-guangzhou.myqcloud.com")
52+
b := &cos.BaseURL{BucketURL: u}
53+
c := cos.NewClient(b, &http.Client{
54+
// 使用 CredentialsTransport
55+
Transport: &cos.CredentialTransport{
56+
// 通过 CredentialIface 获取密钥, 需实现 GetSecretKey,GetSecretId,GetToken 方法。
57+
Credential: &Credential{},
58+
Transport: &debug.DebugRequestTransport{
59+
RequestHeader: true,
60+
// Notice when put a large file and set need the request body, might happend out of memory error.
61+
RequestBody: false,
62+
ResponseHeader: true,
63+
ResponseBody: false,
64+
},
65+
},
66+
})
67+
68+
name := "exampleobject"
69+
_, err := c.Object.Get(context.Background(), name, nil)
70+
log_status(err)
71+
}

example/object/get_with_cvm_role.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ func main() {
3434
u, _ := url.Parse("https://test-1259654469.cos.ap-guangzhou.myqcloud.com")
3535
b := &cos.BaseURL{BucketURL: u}
3636
c := cos.NewClient(b, &http.Client{
37-
// 使用 CVMCredentialsTransport
38-
Transport: &cos.CVMCredentialsTransport{
37+
// 使用 CVMCredentialTransport
38+
Transport: &cos.CVMCredentialTransport{
3939
Transport: &debug.DebugRequestTransport{
4040
RequestHeader: true,
4141
// Notice when put a large file and set need the request body, might happend out of memory error.

object_part.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,10 @@ func copyworker(ctx context.Context, s *ObjectService, jobs <-chan *CopyJobs, re
371371
results <- &copyres
372372
break
373373
}
374+
if resp != nil && resp.StatusCode < 499 {
375+
results <- &copyres
376+
break
377+
}
374378
time.Sleep(10 * time.Millisecond)
375379
continue
376380
}
@@ -465,6 +469,12 @@ func (s *ObjectService) MultiCopy(ctx context.Context, name string, sourceURL st
465469
partOpt := &ObjectCopyPartOptions{
466470
XCosCopySource: u,
467471
}
472+
if opt.OptCopy != nil && opt.OptCopy.ObjectCopyHeaderOptions != nil {
473+
partOpt.XCosCopySourceIfModifiedSince = opt.OptCopy.XCosCopySourceIfModifiedSince
474+
partOpt.XCosCopySourceIfUnmodifiedSince = opt.OptCopy.XCosCopySourceIfUnmodifiedSince
475+
partOpt.XCosCopySourceIfMatch = opt.OptCopy.XCosCopySourceIfMatch
476+
partOpt.XCosCopySourceIfNoneMatch = opt.OptCopy.XCosCopySourceIfNoneMatch
477+
}
468478
job := &CopyJobs{
469479
Name: name,
470480
RetryTimes: 3,

0 commit comments

Comments
 (0)