mirror of
https://github.com/certimate-go/certimate.git
synced 2026-09-21 12:43:46 +08:00
refactor: clean code
This commit is contained in:
@@ -81,7 +81,7 @@ func (d *Deployer) Deploy(ctx context.Context, certPEM, privkeyPEM string) (*Dep
|
||||
Cert: url.QueryEscape(certPEM),
|
||||
Key: url.QueryEscape(privkeyPEM),
|
||||
}
|
||||
createDomainWithCertResp, err := d.sdkClient.CreateDomainWithCert(createDomainWithCertReq)
|
||||
createDomainWithCertResp, err := d.sdkClient.CreateDomainWithCertWithContext(ctx, createDomainWithCertReq)
|
||||
d.logger.Debug("sdk request 'unicloud.host.CreateDomainWithCert'", slog.Any("request", createDomainWithCertReq), slog.Any("response", createDomainWithCertResp))
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to execute sdk request 'unicloud.host.CreateDomainWithCert': %w", err)
|
||||
|
||||
@@ -36,7 +36,7 @@ func (c *Client) DnsCreateRecordWithContext(ctx context.Context, domainId string
|
||||
return nil, fmt.Errorf("sdkerr: bad request: unset domainId")
|
||||
}
|
||||
|
||||
if err := c.ensureAccessTokenExists(); err != nil {
|
||||
if err := c.ensureToken(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ func (c *Client) DnsDeleteRecordWithContext(ctx context.Context, domainId string
|
||||
return nil, fmt.Errorf("sdkerr: bad request: unset recordId")
|
||||
}
|
||||
|
||||
if err := c.ensureAccessTokenExists(); err != nil {
|
||||
if err := c.ensureToken(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ func (c *Client) DnsGetDomainsList(req *DnsGetDomainsListRequest) (*DnsGetDomain
|
||||
}
|
||||
|
||||
func (c *Client) DnsGetDomainsListWithContext(ctx context.Context, req *DnsGetDomainsListRequest) (*DnsGetDomainsListResponse, error) {
|
||||
if err := c.ensureAccessTokenExists(); err != nil {
|
||||
if err := c.ensureToken(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
package v3
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto/tls"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
@@ -22,9 +23,9 @@ type Client struct {
|
||||
tenantId string
|
||||
tenantName string
|
||||
|
||||
accessToken string
|
||||
accessTokenExp time.Time
|
||||
accessTokenMtx sync.Mutex
|
||||
token string
|
||||
tokenAt time.Time
|
||||
tokenMu sync.Mutex
|
||||
|
||||
rc *resty.Client
|
||||
}
|
||||
@@ -57,8 +58,8 @@ func NewClient(optFns ...OptionsFunc) (*Client, error) {
|
||||
SetHeader("Content-Type", "application/json").
|
||||
SetHeader("User-Agent", app.AppUserAgent).
|
||||
SetPreRequestHook(func(_ *resty.Client, req *http.Request) error {
|
||||
if client.accessToken != "" {
|
||||
req.Header.Set("X-Auth-Token", client.accessToken)
|
||||
if client.token != "" {
|
||||
req.Header.Set("X-Auth-Token", client.token)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -135,10 +136,10 @@ func (c *Client) doRequestWithResult(req *resty.Request, res sdkResponse) (*rest
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func (c *Client) ensureAccessTokenExists() error {
|
||||
c.accessTokenMtx.Lock()
|
||||
defer c.accessTokenMtx.Unlock()
|
||||
if c.accessToken != "" && c.accessTokenExp.After(time.Now()) {
|
||||
func (c *Client) ensureToken(ctx context.Context) error {
|
||||
c.tokenMu.Lock()
|
||||
defer c.tokenMu.Unlock()
|
||||
if c.token != "" && c.tokenAt.After(time.Now()) {
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -175,6 +176,7 @@ func (c *Client) ensureAccessTokenExists() error {
|
||||
},
|
||||
},
|
||||
})
|
||||
httpreq.SetContext(ctx)
|
||||
}
|
||||
|
||||
type createAuthTokenResponse struct {
|
||||
@@ -189,20 +191,20 @@ func (c *Client) ensureAccessTokenExists() error {
|
||||
if httpresp, err := c.doRequestWithResult(httpreq, result); err != nil {
|
||||
return err
|
||||
} else if rCode := result.GetCode(); rCode != 0 {
|
||||
return fmt.Errorf("sdkerr: failed to get conoha access token: code='%d', error='%s'", rCode, result.GetError())
|
||||
return fmt.Errorf("sdkerr: auth error: code='%d', error='%s'", rCode, result.GetError())
|
||||
} else {
|
||||
token := httpresp.Header().Get("X-Subject-Token")
|
||||
if token == "" {
|
||||
return fmt.Errorf("sdkerr: api error: received empty auth token")
|
||||
return fmt.Errorf("sdkerr: auth error: received empty token")
|
||||
}
|
||||
|
||||
tokenExp, err := time.Parse(time.RFC3339Nano, result.Token.ExpiresAt)
|
||||
tokenAt, err := time.Parse(time.RFC3339Nano, result.Token.ExpiresAt)
|
||||
if err != nil {
|
||||
return fmt.Errorf("sdkerr: api error: received invalid auth token expiration: %w", err)
|
||||
return fmt.Errorf("sdkerr: auth error: received invalid token expiration: %w", err)
|
||||
}
|
||||
|
||||
c.accessToken = token
|
||||
c.accessTokenExp = tokenExp
|
||||
c.token = token
|
||||
c.tokenAt = tokenAt
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package unicloud
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
@@ -17,11 +18,15 @@ type CreateDomainWithCertResponse struct {
|
||||
}
|
||||
|
||||
func (c *Client) CreateDomainWithCert(req *CreateDomainWithCertRequest) (*CreateDomainWithCertResponse, error) {
|
||||
if err := c.ensureApiUserTokenExists(); err != nil {
|
||||
return c.CreateDomainWithCertWithContext(context.Background(), req)
|
||||
}
|
||||
|
||||
func (c *Client) CreateDomainWithCertWithContext(ctx context.Context, req *CreateDomainWithCertRequest) (*CreateDomainWithCertResponse, error) {
|
||||
if err := c.ensureApiUserToken(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
resp := &CreateDomainWithCertResponse{}
|
||||
err := c.sendRequestWithResult(http.MethodPost, "/host/create-domain-with-cert", req, resp)
|
||||
err := c.sendRequestWithResult(ctx, http.MethodPost, "/host/create-domain-with-cert", req, resp)
|
||||
return resp, err
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
package unicloud
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto/hmac"
|
||||
"crypto/md5"
|
||||
"encoding/hex"
|
||||
@@ -24,16 +25,15 @@ type Client struct {
|
||||
username string
|
||||
password string
|
||||
|
||||
serverlessJwtToken string
|
||||
serverlessJwtTokenExp time.Time
|
||||
serverlessJwtTokenMtx sync.Mutex
|
||||
serverlessToken string
|
||||
serverlessTokenAt time.Time
|
||||
serverlessTokenMu sync.Mutex
|
||||
|
||||
serverlessClient *resty.Client
|
||||
apiUserToken string
|
||||
apiUserTokenMu sync.Mutex
|
||||
|
||||
apiUserToken string
|
||||
apiUserTokenMtx sync.Mutex
|
||||
|
||||
apiClient *resty.Client
|
||||
rcForServerless *resty.Client
|
||||
rcForApiUser *resty.Client
|
||||
}
|
||||
|
||||
const (
|
||||
@@ -64,11 +64,11 @@ func NewClient(optFns ...OptionsFunc) (*Client, error) {
|
||||
username: opts.Username,
|
||||
password: opts.Password,
|
||||
}
|
||||
client.serverlessClient = resty.New().
|
||||
client.rcForServerless = resty.New().
|
||||
SetHeader("Accept", "application/json").
|
||||
SetHeader("Content-Type", "application/json").
|
||||
SetHeader("User-Agent", app.AppUserAgent)
|
||||
client.apiClient = resty.New().
|
||||
client.rcForApiUser = resty.New().
|
||||
SetBaseURL("https://unicloud-api.dcloud.net.cn/unicloud/api").
|
||||
SetHeader("Accept", "application/json").
|
||||
SetHeader("Content-Type", "application/json").
|
||||
@@ -85,7 +85,7 @@ func NewClient(optFns ...OptionsFunc) (*Client, error) {
|
||||
}
|
||||
|
||||
func (c *Client) SetTimeout(timeout time.Duration) *Client {
|
||||
c.serverlessClient.SetTimeout(timeout)
|
||||
c.rcForServerless.SetTimeout(timeout)
|
||||
return c
|
||||
}
|
||||
|
||||
@@ -120,7 +120,7 @@ func (c *Client) buildServerlessPayloadInfo(appId, spaceId, target, method, acti
|
||||
|
||||
functionArgs := map[string]any{
|
||||
"clientInfo": clientInfo,
|
||||
"uniIdToken": c.serverlessJwtToken,
|
||||
"uniIdToken": c.serverlessToken,
|
||||
}
|
||||
if method != "" {
|
||||
functionArgs["method"] = method
|
||||
@@ -156,14 +156,14 @@ func (c *Client) buildServerlessPayloadInfo(appId, spaceId, target, method, acti
|
||||
return payload, nil
|
||||
}
|
||||
|
||||
func (c *Client) invokeServerless(endpoint, clientSecret, appId, spaceId, target, method, action string, params, data interface{}) (*resty.Response, error) {
|
||||
func (c *Client) invokeServerless(ctx context.Context, endpoint, clientSecret, appId, spaceId, target, method, action string, params, data interface{}) (*resty.Response, error) {
|
||||
if endpoint == "" {
|
||||
return nil, fmt.Errorf("unicloud api error: endpoint cannot be empty")
|
||||
return nil, fmt.Errorf("sdkerr: bad request: endpoint cannot be empty")
|
||||
}
|
||||
|
||||
payload, err := c.buildServerlessPayloadInfo(appId, spaceId, target, method, action, params, data)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("unicloud api error: failed to build request: %w", err)
|
||||
return nil, fmt.Errorf("sdkerr: bad request: failed to build request: %w", err)
|
||||
}
|
||||
|
||||
clientInfo, _ := c.buildServerlessClientInfo(appId)
|
||||
@@ -171,26 +171,27 @@ func (c *Client) invokeServerless(endpoint, clientSecret, appId, spaceId, target
|
||||
|
||||
sign := generateSignature(payload, clientSecret)
|
||||
|
||||
req := c.serverlessClient.R().
|
||||
req := c.rcForServerless.R().
|
||||
SetHeader("Content-Type", "application/json").
|
||||
SetHeader("Origin", "https://unicloud.dcloud.net.cn").
|
||||
SetHeader("Referer", "https://unicloud.dcloud.net.cn").
|
||||
SetHeader("X-Client-Info", string(clientInfoJsonb)).
|
||||
SetHeader("X-Client-Token", c.serverlessJwtToken).
|
||||
SetHeader("X-Client-Token", c.serverlessToken).
|
||||
SetHeader("X-Serverless-Sign", sign).
|
||||
SetBody(payload)
|
||||
SetBody(payload).
|
||||
SetContext(ctx)
|
||||
resp, err := req.Post(endpoint)
|
||||
if err != nil {
|
||||
return resp, fmt.Errorf("unicloud api error: failed to send request: %w", err)
|
||||
return resp, fmt.Errorf("sdkerr: failed to send request: %w", err)
|
||||
} else if resp.IsError() {
|
||||
return resp, fmt.Errorf("unicloud api error: unexpected status code: %d (resp: %s)", resp.StatusCode(), resp.String())
|
||||
return resp, fmt.Errorf("sdkerr: unexpected status code: %d (resp: %s)", resp.StatusCode(), resp.String())
|
||||
}
|
||||
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func (c *Client) invokeServerlessWithResult(endpoint, clientSecret, appId, spaceId, target, method, action string, params, data interface{}, result sdkResponse) error {
|
||||
resp, err := c.invokeServerless(endpoint, clientSecret, appId, spaceId, target, method, action, params, data)
|
||||
func (c *Client) invokeServerlessWithResult(ctx context.Context, endpoint, clientSecret, appId, spaceId, target, method, action string, params, data interface{}, result sdkResponse) error {
|
||||
resp, err := c.invokeServerless(ctx, endpoint, clientSecret, appId, spaceId, target, method, action, params, data)
|
||||
if err != nil {
|
||||
if resp != nil {
|
||||
json.Unmarshal(resp.Body(), &result)
|
||||
@@ -199,16 +200,17 @@ func (c *Client) invokeServerlessWithResult(endpoint, clientSecret, appId, space
|
||||
}
|
||||
|
||||
if err := json.Unmarshal(resp.Body(), &result); err != nil {
|
||||
return fmt.Errorf("unicloud api error: failed to unmarshal response: %w", err)
|
||||
return fmt.Errorf("sdkerr: failed to unmarshal response: %w", err)
|
||||
} else if rSuccess := result.GetSuccess(); !rSuccess {
|
||||
return fmt.Errorf("unicloud api error: code='%s', message='%s'", result.GetErrorCode(), result.GetErrorMessage())
|
||||
return fmt.Errorf("sdkerr: code='%s', message='%s'", result.GetErrorCode(), result.GetErrorMessage())
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *Client) sendRequest(method string, path string, params interface{}) (*resty.Response, error) {
|
||||
req := c.apiClient.R()
|
||||
func (c *Client) sendRequest(ctx context.Context, method string, path string, params interface{}) (*resty.Response, error) {
|
||||
req := c.rcForApiUser.R().
|
||||
SetContext(ctx)
|
||||
if strings.EqualFold(method, http.MethodGet) {
|
||||
qs := make(map[string]string)
|
||||
if params != nil {
|
||||
@@ -229,16 +231,16 @@ func (c *Client) sendRequest(method string, path string, params interface{}) (*r
|
||||
|
||||
resp, err := req.Execute(method, path)
|
||||
if err != nil {
|
||||
return resp, fmt.Errorf("unicloud api error: failed to send request: %w", err)
|
||||
return resp, fmt.Errorf("sdkerr: failed to send request: %w", err)
|
||||
} else if resp.IsError() {
|
||||
return resp, fmt.Errorf("unicloud api error: unexpected status code: %d (resp: %s)", resp.StatusCode(), resp.String())
|
||||
return resp, fmt.Errorf("sdkerr: unexpected status code: %d (resp: %s)", resp.StatusCode(), resp.String())
|
||||
}
|
||||
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func (c *Client) sendRequestWithResult(method string, path string, params interface{}, result sdkResponse) error {
|
||||
resp, err := c.sendRequest(method, path, params)
|
||||
func (c *Client) sendRequestWithResult(ctx context.Context, method string, path string, params interface{}, result sdkResponse) error {
|
||||
resp, err := c.sendRequest(ctx, method, path, params)
|
||||
if err != nil {
|
||||
if resp != nil {
|
||||
json.Unmarshal(resp.Body(), &result)
|
||||
@@ -247,18 +249,18 @@ func (c *Client) sendRequestWithResult(method string, path string, params interf
|
||||
}
|
||||
|
||||
if err := json.Unmarshal(resp.Body(), &result); err != nil {
|
||||
return fmt.Errorf("unicloud api error: failed to unmarshal response: %w", err)
|
||||
return fmt.Errorf("sdkerr: failed to unmarshal response: %w", err)
|
||||
} else if rReturnCode := result.GetReturnCode(); rReturnCode != 0 {
|
||||
return fmt.Errorf("unicloud api error: ret='%d', desc='%s'", rReturnCode, result.GetReturnDesc())
|
||||
return fmt.Errorf("sdkerr: ret='%d', desc='%s'", rReturnCode, result.GetReturnDesc())
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *Client) ensureServerlessJwtTokenExists() error {
|
||||
c.serverlessJwtTokenMtx.Lock()
|
||||
defer c.serverlessJwtTokenMtx.Unlock()
|
||||
if c.serverlessJwtToken != "" && c.serverlessJwtTokenExp.After(time.Now()) {
|
||||
func (c *Client) ensureServerlessToken(ctx context.Context) error {
|
||||
c.serverlessTokenMu.Lock()
|
||||
defer c.serverlessTokenMu.Unlock()
|
||||
if c.serverlessToken != "" && c.serverlessTokenAt.After(time.Now()) {
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -286,28 +288,35 @@ func (c *Client) ensureServerlessJwtTokenExists() error {
|
||||
}
|
||||
|
||||
resp := &loginResponse{}
|
||||
if err := c.invokeServerlessWithResult(
|
||||
if err := c.invokeServerlessWithResult(ctx,
|
||||
uniIdentityEndpoint, uniIdentityClientSecret, uniIdentityAppId, uniIdentitySpaceId,
|
||||
"uni-id-co", "login", "", params, nil,
|
||||
resp); err != nil {
|
||||
return err
|
||||
} else if resp.Data == nil || resp.Data.NewToken == nil || resp.Data.NewToken.Token == "" {
|
||||
return fmt.Errorf("unicloud api error: received empty token")
|
||||
}
|
||||
} else {
|
||||
if resp.Data == nil || resp.Data.NewToken == nil || resp.Data.NewToken.Token == "" {
|
||||
return fmt.Errorf("sdkerr: auth error: received empty token")
|
||||
}
|
||||
|
||||
c.serverlessJwtToken = resp.Data.NewToken.Token
|
||||
c.serverlessJwtTokenExp = time.UnixMilli(resp.Data.NewToken.TokenExpired)
|
||||
tokenAt := time.UnixMilli(resp.Data.NewToken.TokenExpired)
|
||||
if tokenAt.IsZero() {
|
||||
return fmt.Errorf("sdkerr: auth error: received invalid token expiration")
|
||||
}
|
||||
|
||||
c.serverlessToken = resp.Data.NewToken.Token
|
||||
c.serverlessTokenAt = tokenAt
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *Client) ensureApiUserTokenExists() error {
|
||||
if err := c.ensureServerlessJwtTokenExists(); err != nil {
|
||||
func (c *Client) ensureApiUserToken(ctx context.Context) error {
|
||||
if err := c.ensureServerlessToken(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
c.apiUserTokenMtx.Lock()
|
||||
defer c.apiUserTokenMtx.Unlock()
|
||||
c.apiUserTokenMu.Lock()
|
||||
defer c.apiUserTokenMu.Unlock()
|
||||
if c.apiUserToken != "" {
|
||||
return nil
|
||||
}
|
||||
@@ -328,16 +337,18 @@ func (c *Client) ensureApiUserTokenExists() error {
|
||||
}
|
||||
|
||||
resp := &getUserTokenResponse{}
|
||||
if err := c.invokeServerlessWithResult(
|
||||
if err := c.invokeServerlessWithResult(ctx,
|
||||
uniConsoleEndpoint, uniConsoleClientSecret, uniConsoleAppId, uniConsoleSpaceId,
|
||||
"uni-cloud-kernel", "", "user/getUserToken", nil, map[string]any{"isLogin": true},
|
||||
resp); err != nil {
|
||||
return err
|
||||
} else if resp.Data == nil || resp.Data.Data == nil || resp.Data.Data.Data == nil || resp.Data.Data.Data.Token == "" {
|
||||
return fmt.Errorf("unicloud api error: received empty user token")
|
||||
}
|
||||
} else {
|
||||
if resp.Data == nil || resp.Data.Data == nil || resp.Data.Data.Data == nil || resp.Data.Data.Data.Token == "" {
|
||||
return fmt.Errorf("sdkerr: auth error: received empty token")
|
||||
}
|
||||
|
||||
c.apiUserToken = resp.Data.Data.Data.Token
|
||||
c.apiUserToken = resp.Data.Data.Data.Token
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -29,7 +29,7 @@ func (c *Client) UpdateSSLCert(req *UpdateSSLCertRequest) (*UpdateSSLCertRespons
|
||||
}
|
||||
|
||||
func (c *Client) UpdateSSLCertWithContext(ctx context.Context, req *UpdateSSLCertRequest) (*UpdateSSLCertResponse, error) {
|
||||
if err := c.ensureAccessTokenExists(); err != nil {
|
||||
if err := c.ensureToken(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
package flexcdn
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto/tls"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
@@ -22,9 +23,9 @@ type Client struct {
|
||||
accessKeyId string
|
||||
accessKey string
|
||||
|
||||
accessToken string
|
||||
accessTokenExp time.Time
|
||||
accessTokenMtx sync.Mutex
|
||||
token string
|
||||
tokenAt time.Time
|
||||
tokenMu sync.Mutex
|
||||
|
||||
rc *resty.Client
|
||||
}
|
||||
@@ -65,8 +66,8 @@ func NewClient(serverUrl string, optFns ...OptionsFunc) (*Client, error) {
|
||||
SetHeader("Content-Type", "application/json").
|
||||
SetHeader("User-Agent", app.AppUserAgent).
|
||||
SetPreRequestHook(func(_ *resty.Client, req *http.Request) error {
|
||||
if client.accessToken != "" {
|
||||
req.Header.Set("X-Cloud-Access-Token", client.accessToken)
|
||||
if client.token != "" {
|
||||
req.Header.Set("X-Cloud-Access-Token", client.token)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -143,10 +144,10 @@ func (c *Client) doRequestWithResult(req *resty.Request, res sdkResponse) (*rest
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func (c *Client) ensureAccessTokenExists() error {
|
||||
c.accessTokenMtx.Lock()
|
||||
defer c.accessTokenMtx.Unlock()
|
||||
if c.accessToken != "" && c.accessTokenExp.After(time.Now()) {
|
||||
func (c *Client) ensureToken(ctx context.Context) error {
|
||||
c.tokenMu.Lock()
|
||||
defer c.tokenMu.Unlock()
|
||||
if c.token != "" && c.tokenAt.After(time.Now()) {
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -159,6 +160,7 @@ func (c *Client) ensureAccessTokenExists() error {
|
||||
"accessKeyId": c.accessKeyId,
|
||||
"accessKey": c.accessKey,
|
||||
})
|
||||
httpreq.SetContext(ctx)
|
||||
}
|
||||
|
||||
type getAPIAccessTokenResponse struct {
|
||||
@@ -173,10 +175,19 @@ func (c *Client) ensureAccessTokenExists() error {
|
||||
if _, err := c.doRequestWithResult(httpreq, result); err != nil {
|
||||
return err
|
||||
} else if rCode := result.GetCode(); rCode != 200 {
|
||||
return fmt.Errorf("sdkerr: failed to get flexcdn access token: code='%d', message='%s'", rCode, result.GetMessage())
|
||||
return fmt.Errorf("sdkerr: auth error: code='%d', message='%s'", rCode, result.GetMessage())
|
||||
} else {
|
||||
c.accessToken = result.Data.Token
|
||||
c.accessTokenExp = time.Unix(result.Data.ExpiresAt, 0)
|
||||
if result.Data == nil || result.Data.Token == "" {
|
||||
return fmt.Errorf("sdkerr: auth error: received empty token")
|
||||
}
|
||||
|
||||
tokenAt := time.Unix(result.Data.ExpiresAt, 0)
|
||||
if tokenAt.IsZero() {
|
||||
return fmt.Errorf("sdkerr: auth error: received invalid token expiration")
|
||||
}
|
||||
|
||||
c.token = result.Data.Token
|
||||
c.tokenAt = tokenAt
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
@@ -29,7 +29,7 @@ func (c *Client) UpdateSSLCert(req *UpdateSSLCertRequest) (*UpdateSSLCertRespons
|
||||
}
|
||||
|
||||
func (c *Client) UpdateSSLCertWithContext(ctx context.Context, req *UpdateSSLCertRequest) (*UpdateSSLCertResponse, error) {
|
||||
if err := c.ensureAccessTokenExists(); err != nil {
|
||||
if err := c.ensureToken(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
||||
+23
-12
@@ -3,6 +3,7 @@
|
||||
package goedge
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto/tls"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
@@ -22,9 +23,9 @@ type Client struct {
|
||||
accessKeyId string
|
||||
accessKey string
|
||||
|
||||
accessToken string
|
||||
accessTokenExp time.Time
|
||||
accessTokenMtx sync.Mutex
|
||||
token string
|
||||
tokenAt time.Time
|
||||
tokenMu sync.Mutex
|
||||
|
||||
rc *resty.Client
|
||||
}
|
||||
@@ -65,8 +66,8 @@ func NewClient(serverUrl string, optFns ...OptionsFunc) (*Client, error) {
|
||||
SetHeader("Content-Type", "application/json").
|
||||
SetHeader("User-Agent", app.AppUserAgent).
|
||||
SetPreRequestHook(func(_ *resty.Client, req *http.Request) error {
|
||||
if client.accessToken != "" {
|
||||
req.Header.Set("X-Edge-Access-Token", client.accessToken)
|
||||
if client.token != "" {
|
||||
req.Header.Set("X-Edge-Access-Token", client.token)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -143,10 +144,10 @@ func (c *Client) doRequestWithResult(req *resty.Request, res sdkResponse) (*rest
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func (c *Client) ensureAccessTokenExists() error {
|
||||
c.accessTokenMtx.Lock()
|
||||
defer c.accessTokenMtx.Unlock()
|
||||
if c.accessToken != "" && c.accessTokenExp.After(time.Now()) {
|
||||
func (c *Client) ensureToken(ctx context.Context) error {
|
||||
c.tokenMu.Lock()
|
||||
defer c.tokenMu.Unlock()
|
||||
if c.token != "" && c.tokenAt.After(time.Now()) {
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -159,6 +160,7 @@ func (c *Client) ensureAccessTokenExists() error {
|
||||
"accessKeyId": c.accessKeyId,
|
||||
"accessKey": c.accessKey,
|
||||
})
|
||||
httpreq.SetContext(ctx)
|
||||
}
|
||||
|
||||
type getAPIAccessTokenResponse struct {
|
||||
@@ -173,10 +175,19 @@ func (c *Client) ensureAccessTokenExists() error {
|
||||
if _, err := c.doRequestWithResult(httpreq, result); err != nil {
|
||||
return err
|
||||
} else if rCode := result.GetCode(); rCode != 200 {
|
||||
return fmt.Errorf("sdkerr: failed to get goedge access token: code='%d', message='%s'", rCode, result.GetMessage())
|
||||
return fmt.Errorf("sdkerr: auth error: code='%d', message='%s'", rCode, result.GetMessage())
|
||||
} else {
|
||||
c.accessToken = result.Data.Token
|
||||
c.accessTokenExp = time.Unix(result.Data.ExpiresAt, 0)
|
||||
if result.Data == nil || result.Data.Token == "" {
|
||||
return fmt.Errorf("sdkerr: auth error: received empty token")
|
||||
}
|
||||
|
||||
tokenAt := time.Unix(result.Data.ExpiresAt, 0)
|
||||
if tokenAt.IsZero() {
|
||||
return fmt.Errorf("sdkerr: auth error: received invalid token expiration")
|
||||
}
|
||||
|
||||
c.token = result.Data.Token
|
||||
c.tokenAt = tokenAt
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
@@ -28,7 +28,7 @@ func (c *Client) UpdateCertificateWithContext(ctx context.Context, certId int64,
|
||||
return nil, fmt.Errorf("sdkerr: bad request: unset certId")
|
||||
}
|
||||
|
||||
if err := c.ensureAccessTokenExists(); err != nil {
|
||||
if err := c.ensureToken(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
package client
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto/tls"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
@@ -20,8 +21,8 @@ type Client struct {
|
||||
username string
|
||||
password string
|
||||
|
||||
accessToken string
|
||||
accessTokenMtx sync.Mutex
|
||||
token string
|
||||
tokenMu sync.Mutex
|
||||
|
||||
rc *resty.Client
|
||||
}
|
||||
@@ -53,8 +54,8 @@ func NewClient(serverUrl string, optFns ...OptionsFunc) (*Client, error) {
|
||||
SetBaseURL(strings.TrimSuffix(serverUrl, "/")+"/prod-api").
|
||||
SetHeader("User-Agent", app.AppUserAgent).
|
||||
SetPreRequestHook(func(_ *resty.Client, req *http.Request) error {
|
||||
if client.accessToken != "" {
|
||||
req.Header.Set("Authorization", "Bearer "+client.accessToken)
|
||||
if client.token != "" {
|
||||
req.Header.Set("Authorization", "Bearer "+client.token)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -131,10 +132,10 @@ func (c *Client) doRequestWithResult(req *resty.Request, res sdkResponse) (*rest
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func (c *Client) ensureAccessTokenExists() error {
|
||||
c.accessTokenMtx.Lock()
|
||||
defer c.accessTokenMtx.Unlock()
|
||||
if c.accessToken != "" {
|
||||
func (c *Client) ensureToken(ctx context.Context) error {
|
||||
c.tokenMu.Lock()
|
||||
defer c.tokenMu.Unlock()
|
||||
if c.token != "" {
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -147,6 +148,7 @@ func (c *Client) ensureAccessTokenExists() error {
|
||||
"username": c.username,
|
||||
"password": c.password,
|
||||
})
|
||||
httpreq.SetContext(ctx)
|
||||
}
|
||||
|
||||
type loginResponse struct {
|
||||
@@ -162,7 +164,11 @@ func (c *Client) ensureAccessTokenExists() error {
|
||||
if _, err := c.doRequestWithResult(httpreq, result); err != nil {
|
||||
return err
|
||||
} else {
|
||||
c.accessToken = result.Data.Token
|
||||
if result.Data == nil || result.Data.Token == "" {
|
||||
return fmt.Errorf("sdkerr: auth error: received empty token")
|
||||
}
|
||||
|
||||
c.token = result.Data.Token
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
@@ -29,7 +29,7 @@ func (c *Client) UpdateCertificateWithContext(ctx context.Context, certId int64,
|
||||
return nil, fmt.Errorf("sdkerr: bad request: unset certId")
|
||||
}
|
||||
|
||||
if err := c.ensureAccessTokenExists(); err != nil {
|
||||
if err := c.ensureToken(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
package master
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto/tls"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
@@ -20,8 +21,8 @@ type Client struct {
|
||||
username string
|
||||
password string
|
||||
|
||||
accessToken string
|
||||
accessTokenMtx sync.Mutex
|
||||
token string
|
||||
tokenMu sync.Mutex
|
||||
|
||||
rc *resty.Client
|
||||
}
|
||||
@@ -55,8 +56,8 @@ func NewClient(serverUrl string, optFns ...OptionsFunc) (*Client, error) {
|
||||
SetHeader("Content-Type", "application/json").
|
||||
SetHeader("User-Agent", app.AppUserAgent).
|
||||
SetPreRequestHook(func(_ *resty.Client, req *http.Request) error {
|
||||
if client.accessToken != "" {
|
||||
req.Header.Set("Authorization", "Bearer "+client.accessToken)
|
||||
if client.token != "" {
|
||||
req.Header.Set("Authorization", "Bearer "+client.token)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -133,10 +134,10 @@ func (c *Client) doRequestWithResult(req *resty.Request, res sdkResponse) (*rest
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func (c *Client) ensureAccessTokenExists() error {
|
||||
c.accessTokenMtx.Lock()
|
||||
defer c.accessTokenMtx.Unlock()
|
||||
if c.accessToken != "" {
|
||||
func (c *Client) ensureToken(ctx context.Context) error {
|
||||
c.tokenMu.Lock()
|
||||
defer c.tokenMu.Unlock()
|
||||
if c.token != "" {
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -148,6 +149,7 @@ func (c *Client) ensureAccessTokenExists() error {
|
||||
"username": c.username,
|
||||
"password": c.password,
|
||||
})
|
||||
httpreq.SetContext(ctx)
|
||||
}
|
||||
|
||||
type loginResponse struct {
|
||||
@@ -163,7 +165,11 @@ func (c *Client) ensureAccessTokenExists() error {
|
||||
if _, err := c.doRequestWithResult(httpreq, result); err != nil {
|
||||
return err
|
||||
} else {
|
||||
c.accessToken = result.Data.Token
|
||||
if result.Data == nil || result.Data.Token == "" {
|
||||
return fmt.Errorf("sdkerr: auth error: received empty token")
|
||||
}
|
||||
|
||||
c.token = result.Data.Token
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
@@ -22,7 +22,7 @@ func (c *Client) ListVirtualHostDomainsWithContext(ctx context.Context, hostId s
|
||||
return nil, fmt.Errorf("sdkerr: bad request: unset hostId")
|
||||
}
|
||||
|
||||
if err := c.ensureJwtTokenExists(); err != nil {
|
||||
if err := c.ensureToken(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@ func (c *Client) SetVirtualHostSSLWithContext(ctx context.Context, hostId string
|
||||
return nil, fmt.Errorf("sdkerr: bad request: unset hostId")
|
||||
}
|
||||
|
||||
if err := c.ensureJwtTokenExists(); err != nil {
|
||||
if err := c.ensureToken(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
||||
+15
-10
@@ -2,6 +2,7 @@
|
||||
package mohua
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto/tls"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
@@ -18,8 +19,8 @@ type Client struct {
|
||||
username string
|
||||
password string
|
||||
|
||||
jwtToken string
|
||||
jwtTokenMtx sync.Mutex
|
||||
token string
|
||||
tokenMu sync.Mutex
|
||||
|
||||
rc *resty.Client
|
||||
}
|
||||
@@ -37,7 +38,7 @@ func NewClient(optFns ...OptionsFunc) (*Client, error) {
|
||||
client := &Client{
|
||||
username: opts.Username,
|
||||
password: opts.Password,
|
||||
jwtToken: opts.JwtToken,
|
||||
token: opts.JwtToken,
|
||||
}
|
||||
client.rc = resty.New().
|
||||
SetBaseURL("https://cloud.mhjz1.cn").
|
||||
@@ -45,8 +46,8 @@ func NewClient(optFns ...OptionsFunc) (*Client, error) {
|
||||
SetHeader("Content-Type", "application/json").
|
||||
SetHeader("User-Agent", app.AppUserAgent).
|
||||
SetPreRequestHook(func(_ *resty.Client, req *http.Request) error {
|
||||
if client.jwtToken != "" {
|
||||
req.Header.Set("JWT", "Bearer "+client.jwtToken)
|
||||
if client.token != "" {
|
||||
req.Header.Set("JWT", "Bearer "+client.token)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -126,10 +127,10 @@ func (c *Client) doRequestWithResult(req *resty.Request, res any) (*resty.Respon
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func (c *Client) ensureJwtTokenExists() error {
|
||||
c.jwtTokenMtx.Lock()
|
||||
defer c.jwtTokenMtx.Unlock()
|
||||
if c.jwtToken != "" {
|
||||
func (c *Client) ensureToken(ctx context.Context) error {
|
||||
c.tokenMu.Lock()
|
||||
defer c.tokenMu.Unlock()
|
||||
if c.token != "" {
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -154,7 +155,11 @@ func (c *Client) ensureJwtTokenExists() error {
|
||||
} else if rStatus := result.GetStatus(); rStatus != 200 {
|
||||
return fmt.Errorf("sdkerr: failed to create npm token: status='%d', msg='%s'", rStatus, result.GetMsg())
|
||||
} else {
|
||||
c.jwtToken = result.JWT
|
||||
if result.JWT == "" {
|
||||
return fmt.Errorf("sdkerr: auth error: received empty token")
|
||||
}
|
||||
|
||||
c.token = result.JWT
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
@@ -19,7 +19,7 @@ func (c *Client) NginxCreateCertificate(req *NginxCreateCertificateRequest) (*Ng
|
||||
}
|
||||
|
||||
func (c *Client) NginxCreateCertificateWithContext(ctx context.Context, req *NginxCreateCertificateRequest) (*NginxCreateCertificateResponse, error) {
|
||||
if err := c.ensureJwtTokenExists(); err != nil {
|
||||
if err := c.ensureToken(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ func (c *Client) NginxListCertificates(req *NginxListCertificatesRequest) (*Ngin
|
||||
}
|
||||
|
||||
func (c *Client) NginxListCertificatesWithContext(ctx context.Context, req *NginxListCertificatesRequest) (*NginxListCertificatesResponse, error) {
|
||||
if err := c.ensureJwtTokenExists(); err != nil {
|
||||
if err := c.ensureToken(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ func (c *Client) NginxListDeadHosts(req *NginxListDeadHostsRequest) (*NginxListD
|
||||
}
|
||||
|
||||
func (c *Client) NginxListDeadHostsWithContext(ctx context.Context, req *NginxListDeadHostsRequest) (*NginxListDeadHostsResponse, error) {
|
||||
if err := c.ensureJwtTokenExists(); err != nil {
|
||||
if err := c.ensureToken(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ func (c *Client) NginxListProxyHosts(req *NginxListProxyHostsRequest) (*NginxLis
|
||||
}
|
||||
|
||||
func (c *Client) NginxListProxyHostsWithContext(ctx context.Context, req *NginxListProxyHostsRequest) (*NginxListProxyHostsResponse, error) {
|
||||
if err := c.ensureJwtTokenExists(); err != nil {
|
||||
if err := c.ensureToken(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ func (c *Client) NginxListRedirectionHosts(req *NginxListRedirectionHostsRequest
|
||||
}
|
||||
|
||||
func (c *Client) NginxListRedirectionHostsWithContext(ctx context.Context, req *NginxListRedirectionHostsRequest) (*NginxListRedirectionHostsResponse, error) {
|
||||
if err := c.ensureJwtTokenExists(); err != nil {
|
||||
if err := c.ensureToken(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ func (c *Client) NginxListStreams(req *NginxListStreamsRequest) (*NginxListStrea
|
||||
}
|
||||
|
||||
func (c *Client) NginxListStreamsWithContext(ctx context.Context, req *NginxListStreamsRequest) (*NginxListStreamsResponse, error) {
|
||||
if err := c.ensureJwtTokenExists(); err != nil {
|
||||
if err := c.ensureToken(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ func (c *Client) NginxUpdateDeadHostWithContext(ctx context.Context, hostId int6
|
||||
return nil, fmt.Errorf("sdkerr: bad request: unset hostId")
|
||||
}
|
||||
|
||||
if err := c.ensureJwtTokenExists(); err != nil {
|
||||
if err := c.ensureToken(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ func (c *Client) NginxUpdateProxyHostWithContext(ctx context.Context, hostId int
|
||||
return nil, fmt.Errorf("sdkerr: bad request: unset hostId")
|
||||
}
|
||||
|
||||
if err := c.ensureJwtTokenExists(); err != nil {
|
||||
if err := c.ensureToken(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ func (c *Client) NginxUpdateRedirectionHostWithContext(ctx context.Context, host
|
||||
return nil, fmt.Errorf("sdkerr: bad request: unset hostId")
|
||||
}
|
||||
|
||||
if err := c.ensureJwtTokenExists(); err != nil {
|
||||
if err := c.ensureToken(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ func (c *Client) NginxUpdateStreamWithContext(ctx context.Context, hostId int64,
|
||||
return nil, fmt.Errorf("sdkerr: bad request: unset hostId")
|
||||
}
|
||||
|
||||
if err := c.ensureJwtTokenExists(); err != nil {
|
||||
if err := c.ensureToken(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ func (c *Client) NginxUploadCertificateWithContext(ctx context.Context, certId i
|
||||
return nil, fmt.Errorf("sdkerr: bad request: unset certId")
|
||||
}
|
||||
|
||||
if err := c.ensureJwtTokenExists(); err != nil {
|
||||
if err := c.ensureToken(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ func (c *Client) SettingsGetDefaultSite(req *SettingsGetDefaultSiteRequest) (*Se
|
||||
}
|
||||
|
||||
func (c *Client) SettingsGetDefaultSiteWithContext(ctx context.Context, req *SettingsGetDefaultSiteRequest) (*SettingsGetDefaultSiteResponse, error) {
|
||||
if err := c.ensureJwtTokenExists(); err != nil {
|
||||
if err := c.ensureToken(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ func (c *Client) SettingsSetDefaultSite(req *SettingsSetDefaultSiteRequest) (*Se
|
||||
}
|
||||
|
||||
func (c *Client) SettingsSetDefaultSiteWithContext(ctx context.Context, req *SettingsSetDefaultSiteRequest) (*SettingsSetDefaultSiteResponse, error) {
|
||||
if err := c.ensureJwtTokenExists(); err != nil {
|
||||
if err := c.ensureToken(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
package nginxproxymanager
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto/tls"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
@@ -21,8 +22,8 @@ type Client struct {
|
||||
username string
|
||||
password string
|
||||
|
||||
jwtToken string
|
||||
jwtTokenMtx sync.Mutex
|
||||
token string
|
||||
tokenMu sync.Mutex
|
||||
|
||||
rc *resty.Client
|
||||
}
|
||||
@@ -46,7 +47,7 @@ func NewClient(serverUrl string, optFns ...OptionsFunc) (*Client, error) {
|
||||
client := &Client{
|
||||
username: opts.Username,
|
||||
password: opts.Password,
|
||||
jwtToken: opts.JwtToken,
|
||||
token: opts.JwtToken,
|
||||
}
|
||||
client.rc = resty.New().
|
||||
SetBaseURL(strings.TrimSuffix(serverUrl, "/")+"/api").
|
||||
@@ -54,8 +55,8 @@ func NewClient(serverUrl string, optFns ...OptionsFunc) (*Client, error) {
|
||||
SetHeader("Content-Type", "application/json").
|
||||
SetHeader("User-Agent", app.AppUserAgent).
|
||||
SetPreRequestHook(func(_ *resty.Client, req *http.Request) error {
|
||||
if client.jwtToken != "" {
|
||||
req.Header.Set("Authorization", "Bearer "+client.jwtToken)
|
||||
if client.token != "" {
|
||||
req.Header.Set("Authorization", "Bearer "+client.token)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -135,10 +136,10 @@ func (c *Client) doRequestWithResult(req *resty.Request, res any) (*resty.Respon
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func (c *Client) ensureJwtTokenExists() error {
|
||||
c.jwtTokenMtx.Lock()
|
||||
defer c.jwtTokenMtx.Unlock()
|
||||
if c.jwtToken != "" {
|
||||
func (c *Client) ensureToken(ctx context.Context) error {
|
||||
c.tokenMu.Lock()
|
||||
defer c.tokenMu.Unlock()
|
||||
if c.token != "" {
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -150,6 +151,7 @@ func (c *Client) ensureJwtTokenExists() error {
|
||||
"identity": c.username,
|
||||
"secret": c.password,
|
||||
})
|
||||
httpreq.SetContext(ctx)
|
||||
}
|
||||
|
||||
type tokensResponse struct {
|
||||
@@ -162,9 +164,13 @@ func (c *Client) ensureJwtTokenExists() error {
|
||||
if _, err := c.doRequestWithResult(httpreq, result); err != nil {
|
||||
return err
|
||||
} else if rError := result.GetError(); rError != "" {
|
||||
return fmt.Errorf("sdkerr: failed to create npm token: error='%s'", rError)
|
||||
return fmt.Errorf("sdkerr: auth error: error='%s'", rError)
|
||||
} else {
|
||||
c.jwtToken = result.Token
|
||||
if result.Token == "" {
|
||||
return fmt.Errorf("sdkerr: auth error: received empty token")
|
||||
}
|
||||
|
||||
c.token = result.Token
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
@@ -57,7 +57,7 @@ func (c *Client) GetBuckets(req *GetBucketsRequest) (*GetBucketsResponse, error)
|
||||
}
|
||||
|
||||
func (c *Client) GetBucketsWithContext(ctx context.Context, req *GetBucketsRequest) (*GetBucketsResponse, error) {
|
||||
if err := c.ensureCookieExists(); err != nil {
|
||||
if err := c.ensureCookies(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@ func (c *Client) GetHttpsCertificateManagerWithContext(ctx context.Context, cert
|
||||
return nil, fmt.Errorf("sdkerr: bad request: unset certificateId")
|
||||
}
|
||||
|
||||
if err := c.ensureCookieExists(); err != nil {
|
||||
if err := c.ensureCookies(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ func (c *Client) GetHttpsServiceManagerWithContext(ctx context.Context, domain s
|
||||
return nil, fmt.Errorf("sdkerr: bad request: unset domain")
|
||||
}
|
||||
|
||||
if err := c.ensureCookieExists(); err != nil {
|
||||
if err := c.ensureCookies(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@ func (c *Client) MigrateHttpsDomain(req *MigrateHttpsDomainRequest) (*MigrateHtt
|
||||
}
|
||||
|
||||
func (c *Client) MigrateHttpsDomainWithContext(ctx context.Context, req *MigrateHttpsDomainRequest) (*MigrateHttpsDomainResponse, error) {
|
||||
if err := c.ensureCookieExists(); err != nil {
|
||||
if err := c.ensureCookies(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ func (c *Client) UpdateHttpsCertificateManager(req *UpdateHttpsCertificateManage
|
||||
}
|
||||
|
||||
func (c *Client) UpdateHttpsCertificateManagerWithContext(ctx context.Context, req *UpdateHttpsCertificateManagerRequest) (*UpdateHttpsCertificateManagerResponse, error) {
|
||||
if err := c.ensureCookieExists(); err != nil {
|
||||
if err := c.ensureCookies(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@ func (c *Client) UploadHttpsCertificate(req *UploadHttpsCertificateRequest) (*Up
|
||||
}
|
||||
|
||||
func (c *Client) UploadHttpsCertificateWithContext(ctx context.Context, req *UploadHttpsCertificateRequest) (*UploadHttpsCertificateResponse, error) {
|
||||
if err := c.ensureCookieExists(); err != nil {
|
||||
if err := c.ensureCookies(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
package console
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net/http"
|
||||
@@ -17,8 +18,8 @@ type Client struct {
|
||||
username string
|
||||
password string
|
||||
|
||||
loginCookie string
|
||||
loginCookieMtx sync.Mutex
|
||||
cookies string
|
||||
cookiesMu sync.Mutex
|
||||
|
||||
rc *resty.Client
|
||||
}
|
||||
@@ -46,8 +47,8 @@ func NewClient(optFns ...OptionsFunc) (*Client, error) {
|
||||
SetHeader("Content-Type", "application/json").
|
||||
SetHeader("User-Agent", app.AppUserAgent).
|
||||
SetPreRequestHook(func(_ *resty.Client, req *http.Request) error {
|
||||
if client.loginCookie != "" {
|
||||
req.Header.Set("Cookie", client.loginCookie)
|
||||
if client.cookies != "" {
|
||||
req.Header.Set("Cookie", client.cookies)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -124,10 +125,10 @@ func (c *Client) doRequestWithResult(req *resty.Request, res sdkResponse) (*rest
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func (c *Client) ensureCookieExists() error {
|
||||
c.loginCookieMtx.Lock()
|
||||
defer c.loginCookieMtx.Unlock()
|
||||
if c.loginCookie != "" {
|
||||
func (c *Client) ensureCookies(ctx context.Context) error {
|
||||
c.cookiesMu.Lock()
|
||||
defer c.cookiesMu.Unlock()
|
||||
if c.cookies != "" {
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -139,6 +140,7 @@ func (c *Client) ensureCookieExists() error {
|
||||
"username": c.username,
|
||||
"password": c.password,
|
||||
})
|
||||
httpreq.SetContext(ctx)
|
||||
}
|
||||
|
||||
type signinResponse struct {
|
||||
@@ -154,9 +156,14 @@ func (c *Client) ensureCookieExists() error {
|
||||
if err != nil {
|
||||
return err
|
||||
} else if !result.Data.Result {
|
||||
return fmt.Errorf("sdkerr: failed to signin upyun console")
|
||||
return fmt.Errorf("sdkerr: auth error")
|
||||
} else {
|
||||
c.loginCookie = httpresp.Header().Get("Set-Cookie")
|
||||
cookies := httpresp.Header().Get("Set-Cookie")
|
||||
if cookies == "" {
|
||||
return fmt.Errorf("sdkerr: auth error: received empty cookies")
|
||||
}
|
||||
|
||||
c.cookies = cookies
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
Reference in New Issue
Block a user