@@ -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+ }
0 commit comments