Skip to content

Commit d7b789b

Browse files
authored
Merge pull request #307 from tencentyun/feature_jojoliang_7228e310
Feature jojoliang 7228e310
2 parents 1496ed5 + 9a785eb commit d7b789b

File tree

7 files changed

+71
-32
lines changed

7 files changed

+71
-32
lines changed

auth.go

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,10 @@ func isSignHeader(key string) bool {
328328
return strings.HasPrefix(key, privateHeaderPrefix)
329329
}
330330

331+
type TransportIface interface {
332+
GetCredential() (string, string, string, error)
333+
}
334+
331335
// AuthorizationTransport 给请求增加 Authorization header
332336
type AuthorizationTransport struct {
333337
SecretID string
@@ -349,17 +353,17 @@ func (t *AuthorizationTransport) SetCredential(ak, sk, token string) {
349353
}
350354

351355
// GetCredential get the ak, sk, token
352-
func (t *AuthorizationTransport) GetCredential() (string, string, string) {
356+
func (t *AuthorizationTransport) GetCredential() (string, string, string, error) {
353357
t.rwLocker.RLock()
354358
defer t.rwLocker.RUnlock()
355-
return t.SecretID, t.SecretKey, t.SessionToken
359+
return t.SecretID, t.SecretKey, t.SessionToken, nil
356360
}
357361

358362
// RoundTrip implements the RoundTripper interface.
359363
func (t *AuthorizationTransport) RoundTrip(req *http.Request) (*http.Response, error) {
360364
req = cloneRequest(req) // per RoundTrip contract
361365

362-
ak, sk, token := t.GetCredential()
366+
ak, sk, token, _ := t.GetCredential()
363367
if strings.HasPrefix(ak, " ") || strings.HasSuffix(ak, " ") {
364368
return nil, fmt.Errorf("SecretID is invalid")
365369
}
@@ -508,6 +512,10 @@ type CredentialTransport struct {
508512
Credential CredentialIface
509513
}
510514

515+
func (t *CredentialTransport) GetCredential() (string, string, string, error) {
516+
return t.Credential.GetSecretId(), t.Credential.GetSecretKey(), t.Credential.GetToken(), nil
517+
}
518+
511519
func (t *CredentialTransport) RoundTrip(req *http.Request) (*http.Response, error) {
512520
ak, sk, token := t.Credential.GetSecretId(), t.Credential.GetSecretKey(), t.Credential.GetToken()
513521

auth_test.go

Lines changed: 53 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,17 @@ func TestAuthorizationTransport(t *testing.T) {
5757
client.client.Transport = auth
5858
req, _ := http.NewRequest("GET", client.BaseURL.BucketURL.String(), nil)
5959
client.doAPI(context.Background(), req, nil, true)
60-
client.GetCredential()
60+
cred := client.GetCredential()
61+
if cred == nil {
62+
t.Error("GetCredential return nil")
63+
}
64+
if cred.SecretID != "ak" || cred.SecretKey != "sk" || cred.SessionToken != "token" {
65+
t.Errorf("GetCredential return %v, want %v", cred, &Credential{
66+
SecretID: "ak",
67+
SecretKey: "sk",
68+
SessionToken: "token",
69+
})
70+
}
6171
}
6272

6373
func TestAuthorizationTransportErr(t *testing.T) {
@@ -157,17 +167,35 @@ func TestCVMCredentialTransport(t *testing.T) {
157167
client.client.Transport = &CVMCredentialTransport{}
158168
req, _ := http.NewRequest("GET", client.BaseURL.BucketURL.String(), nil)
159169
client.doAPI(context.Background(), req, nil, true)
170+
cred := client.GetCredential()
171+
if cred == nil {
172+
t.Errorf("CVMCredentialTransport GetCredential error, return: %v", cred)
173+
}
174+
if cred.SecretID != ak || cred.SecretKey != sk || cred.SessionToken != token {
175+
t.Errorf("CVMCredentialTransport GetCredential error, return: %v", *cred)
176+
}
160177

161178
req, _ = http.NewRequest("GET", client.BaseURL.BucketURL.String(), nil)
162179
client.doAPI(context.Background(), req, nil, true)
163-
client.GetCredential()
164-
180+
cred = client.GetCredential()
181+
if cred == nil {
182+
t.Errorf("CVMCredentialTransport GetCredential error, return: %v", cred)
183+
}
184+
if cred.SecretID != ak || cred.SecretKey != sk || cred.SessionToken != token {
185+
t.Errorf("CVMCredentialTransport GetCredential error, return: %v", *cred)
186+
}
165187
client.client.Transport = &CVMCredentialTransport{
166188
Transport: http.DefaultTransport,
167189
}
168190
req, _ = http.NewRequest("GET", client.BaseURL.BucketURL.String(), nil)
169191
client.doAPI(context.Background(), req, nil, true)
170-
client.GetCredential()
192+
cred = client.GetCredential()
193+
if cred == nil {
194+
t.Errorf("CVMCredentialTransport GetCredential error, return: %v", cred)
195+
}
196+
if cred.SecretID != ak || cred.SecretKey != sk || cred.SessionToken != token {
197+
t.Errorf("CVMCredentialTransport GetCredential error, return: %v", *cred)
198+
}
171199
}
172200

173201
func TestCVMCredentialTransportErr(t *testing.T) {
@@ -307,16 +335,27 @@ func TestCredentialTransport(t *testing.T) {
307335
}
308336
req, _ := http.NewRequest("GET", client.BaseURL.BucketURL.String(), nil)
309337
client.doAPI(context.Background(), req, nil, true)
310-
client.GetCredential()
338+
cred := client.GetCredential()
339+
if cred == nil {
340+
t.Error("GetCredential failed")
341+
}
342+
if cred.SecretID != "test" || cred.SecretKey != "test" || cred.SessionToken != "" {
343+
t.Errorf("GetCredential failed, return: %v", *cred)
344+
}
311345

312346
client.client.Transport = &CredentialTransport{
313347
Credential: NewTokenCredential("test", "test", ""),
314348
Transport: http.DefaultTransport,
315349
}
316350
req, _ = http.NewRequest("GET", client.BaseURL.BucketURL.String(), nil)
317351
client.doAPI(context.Background(), req, nil, true)
318-
client.GetCredential()
319-
352+
cred = client.GetCredential()
353+
if cred == nil {
354+
t.Error("GetCredential failed")
355+
}
356+
if cred.SecretID != "test" || cred.SecretKey != "test" || cred.SessionToken != "" {
357+
t.Errorf("GetCredential failed, return: %v", *cred)
358+
}
320359
}
321360

322361
func TestStsCredentialTransport(t *testing.T) {
@@ -387,6 +426,13 @@ func TestStsCredentialTransport(t *testing.T) {
387426
if err != nil {
388427
t.Errorf("doAPI failed: %v", err)
389428
}
429+
cred := client.GetCredential()
430+
if cred == nil {
431+
t.Errorf("GetCredential error, return nil")
432+
}
433+
if cred.SecretID != ak || cred.SecretKey != sk || cred.SessionToken != token {
434+
t.Errorf("GetCredential error, return:%v", *cred)
435+
}
390436

391437
_, err = client.doAPI(context.Background(), req, nil, true)
392438
if err != nil {
@@ -418,7 +464,6 @@ func TestStsCredentialTransport(t *testing.T) {
418464
if err != nil {
419465
t.Errorf("doAPI failed: %v", err)
420466
}
421-
422467
}
423468

424469
func TestStsCredentialTransportErr(t *testing.T) {

cos.go

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -236,16 +236,7 @@ type Credential struct {
236236
}
237237

238238
func (c *Client) GetCredential() *Credential {
239-
if auth, ok := c.client.Transport.(*AuthorizationTransport); ok {
240-
auth.rwLocker.Lock()
241-
defer auth.rwLocker.Unlock()
242-
return &Credential{
243-
SecretID: auth.SecretID,
244-
SecretKey: auth.SecretKey,
245-
SessionToken: auth.SessionToken,
246-
}
247-
}
248-
if auth, ok := c.client.Transport.(*CVMCredentialTransport); ok {
239+
if auth, ok := c.client.Transport.(TransportIface); ok {
249240
ak, sk, token, err := auth.GetCredential()
250241
if err != nil {
251242
return nil
@@ -256,14 +247,6 @@ func (c *Client) GetCredential() *Credential {
256247
SessionToken: token,
257248
}
258249
}
259-
if auth, ok := c.client.Transport.(*CredentialTransport); ok {
260-
ak, sk, token := auth.Credential.GetSecretId(), auth.Credential.GetSecretKey(), auth.Credential.GetToken()
261-
return &Credential{
262-
SecretID: ak,
263-
SecretKey: sk,
264-
SessionToken: token,
265-
}
266-
}
267250
return nil
268251
}
269252

example/object/getByPresignedURL.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ func main() {
5959
ctx := context.Background()
6060

6161
// Get presigned
62+
// http Method需要和实际http请求一致,如PUT请求设置成http.MethodPut,GET请求设置成http.MethodGet
6263
presignedURL, err := c.Object.GetPresignedURL(ctx, http.MethodGet, name, ak, sk, time.Hour, nil)
6364
logStatus(err)
6465
fmt.Println(presignedURL.String())

example/object/getByPresignedURL2.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ func main() {
2828
ctx := context.Background()
2929

3030
// 获取预签名
31+
// http Method需要和实际http请求一致,如PUT请求设置成http.MethodPut,GET请求设置成http.MethodGet
3132
presignedURL, err := c.Object.GetPresignedURL2(ctx, http.MethodPut, name, time.Hour, nil)
3233
if err != nil {
3334
fmt.Printf("Error: %v\n", err)

example/object/presigned_url_with_token.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,12 @@ func main() {
2525
u, _ := url.Parse("https://test-1259654469.cos.ap-guangzhou.myqcloud.com")
2626
b := &cos.BaseURL{BucketURL: u}
2727
c := cos.NewClient(b, &http.Client{})
28-
29-
name := "exampleobject"
28+
name := "xx/../exampleobject"
3029
ctx := context.Background()
3130

3231
// 方法1 通过 tag 设置 x-cos-security-token
3332
// Get presigned
33+
// http Method需要和实际http请求一致,如PUT请求设置成http.MethodPut,GET请求设置成http.MethodGet
3434
presignedURL, err := c.Object.GetPresignedURL(ctx, http.MethodGet, name, tak, tsk, time.Hour, token)
3535
if err != nil {
3636
fmt.Printf("Error: %v\n", err)
@@ -45,6 +45,7 @@ func main() {
4545
}
4646
opt.Query.Add("x-cos-security-token", "<token>")
4747
// Get presigned
48+
// http Method需要和实际http请求一致,如PUT请求设置成http.MethodPut,GET请求设置成http.MethodGet
4849
presignedURL, err = c.Object.GetPresignedURL(ctx, http.MethodGet, name, tak, tsk, time.Hour, opt)
4950
if err != nil {
5051
fmt.Printf("Error: %v\n", err)

object.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2060,7 +2060,7 @@ func (s *ObjectService) PutFromURL(ctx context.Context, name string, downloadURL
20602060
}
20612061
if err != nil {
20622062
isErr = true
2063-
return nil, nil, err
2063+
return nil, nil, fmt.Errorf("url download failed: %v", err)
20642064
}
20652065
}
20662066
if partChannel == nil && errChannel == nil {

0 commit comments

Comments
 (0)