refactor: clean code

This commit is contained in:
Fu Diwei
2026-06-22 16:32:18 +08:00
committed by RHQYZ
parent 6d6b79f7e2
commit c21da2e6ee
39 changed files with 240 additions and 170 deletions
@@ -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
}
+17 -15
View File
@@ -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
}
+62 -51
View File
@@ -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
}
+1 -1
View File
@@ -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
View File
@@ -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
+1 -1
View File
@@ -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
View File
@@ -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
}
+15 -9
View File
@@ -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
}
+15 -9
View File
@@ -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
}
+1 -1
View File
@@ -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
View File
@@ -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
}
+17 -11
View File
@@ -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
+1 -1
View File
@@ -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
}
+17 -10
View File
@@ -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