alibabacloud-gateway-pop/golang/client/client.go (385 lines of code) (raw):
// This file is auto-generated, don't edit it. Thanks.
package client
import (
spi "github.com/alibabacloud-go/alibabacloud-gateway-spi/client"
array "github.com/alibabacloud-go/darabonba-array/client"
encodeutil "github.com/alibabacloud-go/darabonba-encode-util/client"
map_ "github.com/alibabacloud-go/darabonba-map/client"
signatureutil "github.com/alibabacloud-go/darabonba-signature-util/client"
string_ "github.com/alibabacloud-go/darabonba-string/client"
endpointutil "github.com/alibabacloud-go/endpoint-util/service"
openapiutil "github.com/alibabacloud-go/openapi-util/service"
util "github.com/alibabacloud-go/tea-utils/v2/service"
"github.com/alibabacloud-go/tea/tea"
)
type Client struct {
spi.Client
EndpointSuffix *string
SignatureTypePrefix *string
SignPrefix *string
Sha256 *string
Sm3 *string
}
func NewClient() (*Client, error) {
client := new(Client)
err := client.Init()
return client, err
}
func (client *Client) Init() (_err error) {
_err = client.Client.Init()
if _err != nil {
return _err
}
// CLOUD4-
client.SignatureTypePrefix = tea.String("ACS4-")
// cloud_v4
client.SignPrefix = tea.String("aliyun_v4")
client.EndpointSuffix = tea.String("aliyuncs.com")
client.Sha256 = tea.String(tea.StringValue(client.SignatureTypePrefix) + "HMAC-SHA256")
client.Sm3 = tea.String(tea.StringValue(client.SignatureTypePrefix) + "HMAC-SM3")
return nil
}
func (client *Client) ModifyConfiguration(context *spi.InterceptorContext, attributeMap *spi.AttributeMap) (_err error) {
request := context.Request
config := context.Configuration
attributes := attributeMap.Key
if !tea.BoolValue(util.IsUnset(attributes)) {
client.SignatureTypePrefix = attributes["signatureTypePrefix"]
client.SignPrefix = attributes["signPrefix"]
client.EndpointSuffix = attributes["endpointSuffix"]
client.Sha256 = tea.String(tea.StringValue(client.SignatureTypePrefix) + "HMAC-SHA256")
client.Sm3 = tea.String(tea.StringValue(client.SignatureTypePrefix) + "HMAC-SM3")
}
config.Endpoint, _err = client.GetEndpoint(request.ProductId, config.RegionId, config.EndpointRule, config.Network, config.Suffix, config.EndpointMap, config.Endpoint)
if _err != nil {
return _err
}
return _err
}
func (client *Client) ModifyRequest(context *spi.InterceptorContext, attributeMap *spi.AttributeMap) (_err error) {
request := context.Request
config := context.Configuration
date := openapiutil.GetTimestamp()
request.Headers = tea.Merge(map[string]*string{
"host": config.Endpoint,
"x-acs-version": request.Version,
"x-acs-action": request.Action,
"user-agent": request.UserAgent,
"x-acs-date": date,
"x-acs-signature-nonce": util.GetNonce(),
"accept": tea.String("application/json"),
}, request.Headers)
signatureAlgorithm := util.DefaultString(request.SignatureAlgorithm, client.Sha256)
hashedRequestPayload := encodeutil.HexEncode(encodeutil.Hash(util.ToBytes(tea.String("")), signatureAlgorithm))
if !tea.BoolValue(util.IsUnset(request.Stream)) {
tmp, _err := util.ReadAsBytes(request.Stream)
if _err != nil {
return _err
}
hashedRequestPayload = encodeutil.HexEncode(encodeutil.Hash(tmp, signatureAlgorithm))
request.Stream = tea.ToReader(tmp)
request.Headers["content-type"] = tea.String("application/octet-stream")
} else {
if !tea.BoolValue(util.IsUnset(request.Body)) {
if tea.BoolValue(util.EqualString(request.ReqBodyType, tea.String("json"))) {
jsonObj := util.ToJSONString(request.Body)
hashedRequestPayload = encodeutil.HexEncode(encodeutil.Hash(util.ToBytes(jsonObj), signatureAlgorithm))
request.Stream = tea.ToReader(jsonObj)
request.Headers["content-type"] = tea.String("application/json; charset=utf-8")
} else {
m, _err := util.AssertAsMap(request.Body)
if _err != nil {
return _err
}
formObj := openapiutil.ToForm(m)
hashedRequestPayload = encodeutil.HexEncode(encodeutil.Hash(util.ToBytes(formObj), signatureAlgorithm))
request.Stream = tea.ToReader(formObj)
request.Headers["content-type"] = tea.String("application/x-www-form-urlencoded")
}
}
}
if tea.BoolValue(util.EqualString(signatureAlgorithm, client.Sm3)) {
request.Headers["x-acs-content-sm3"] = hashedRequestPayload
} else {
request.Headers["x-acs-content-sha256"] = hashedRequestPayload
}
if !tea.BoolValue(util.EqualString(request.AuthType, tea.String("Anonymous"))) {
credential := request.Credential
if tea.BoolValue(util.IsUnset(credential)) {
_err = tea.NewSDKError(map[string]interface{}{
"code": "ParameterMissing",
"message": "'config.credential' can not be unset",
})
return _err
}
credentialModel, _err := credential.GetCredential()
if _err != nil {
return _err
}
if !tea.BoolValue(util.Empty(credentialModel.ProviderName)) {
request.Headers["x-acs-credentials-provider"] = credentialModel.ProviderName
}
authType := credentialModel.Type
if tea.BoolValue(util.EqualString(authType, tea.String("bearer"))) {
bearerToken := credential.GetBearerToken()
request.Headers["x-acs-bearer-token"] = bearerToken
request.Headers["x-acs-signature-type"] = tea.String("BEARERTOKEN")
request.Headers["Authorization"] = tea.String("Bearer " + tea.StringValue(bearerToken))
} else if tea.BoolValue(util.EqualString(authType, tea.String("id_token"))) {
idToken := credentialModel.SecurityToken
request.Headers["x-acs-zero-trust-idtoken"] = idToken
} else {
accessKeyId := credentialModel.AccessKeyId
accessKeySecret := credentialModel.AccessKeySecret
securityToken := credentialModel.SecurityToken
if !tea.BoolValue(util.Empty(securityToken)) {
request.Headers["x-acs-accesskey-id"] = accessKeyId
request.Headers["x-acs-security-token"] = securityToken
}
dateNew := string_.SubString(date, tea.Int(0), tea.Int(10))
dateNew = string_.Replace(dateNew, tea.String("-"), tea.String(""), nil)
region := client.GetRegion(request.ProductId, config.Endpoint, config.RegionId)
signingkey, _err := client.GetSigningkey(signatureAlgorithm, accessKeySecret, request.ProductId, region, dateNew)
if _err != nil {
return _err
}
request.Headers["Authorization"], _err = client.GetAuthorization(request.Pathname, request.Method, request.Query, request.Headers, signatureAlgorithm, hashedRequestPayload, accessKeyId, signingkey, request.ProductId, region, dateNew)
if _err != nil {
return _err
}
}
}
return _err
}
func (client *Client) ModifyResponse(context *spi.InterceptorContext, attributeMap *spi.AttributeMap) (_err error) {
request := context.Request
response := context.Response
if tea.BoolValue(util.Is4xx(response.StatusCode)) || tea.BoolValue(util.Is5xx(response.StatusCode)) {
_res, _err := util.ReadAsJSON(response.Body)
if _err != nil {
return _err
}
err, _err := util.AssertAsMap(_res)
if _err != nil {
return _err
}
requestId := client.DefaultAny(err["RequestId"], err["requestId"])
if !tea.BoolValue(util.IsUnset(response.Headers["x-acs-request-id"])) {
requestId = response.Headers["x-acs-request-id"]
}
err["statusCode"] = response.StatusCode
_err = tea.NewSDKError(map[string]interface{}{
"code": tea.ToString(client.DefaultAny(err["Code"], err["code"])),
"message": "code: " + tea.ToString(tea.IntValue(response.StatusCode)) + ", " + tea.ToString(client.DefaultAny(err["Message"], err["message"])) + " request id: " + tea.ToString(requestId),
"data": err,
"description": tea.ToString(client.DefaultAny(err["Description"], err["description"])),
"accessDeniedDetail": client.DefaultAny(err["AccessDeniedDetail"], err["accessDeniedDetail"]),
})
return _err
}
if tea.BoolValue(util.EqualNumber(response.StatusCode, tea.Int(204))) {
_, _err = util.ReadAsString(response.Body)
if _err != nil {
return _err
}
} else if tea.BoolValue(util.EqualString(request.BodyType, tea.String("binary"))) {
response.DeserializedBody = response.Body
} else if tea.BoolValue(util.EqualString(request.BodyType, tea.String("byte"))) {
byt, _err := util.ReadAsBytes(response.Body)
if _err != nil {
return _err
}
response.DeserializedBody = byt
} else if tea.BoolValue(util.EqualString(request.BodyType, tea.String("string"))) {
str, _err := util.ReadAsString(response.Body)
if _err != nil {
return _err
}
response.DeserializedBody = str
} else if tea.BoolValue(util.EqualString(request.BodyType, tea.String("json"))) {
obj, _err := util.ReadAsJSON(response.Body)
if _err != nil {
return _err
}
res, _err := util.AssertAsMap(obj)
if _err != nil {
return _err
}
response.DeserializedBody = res
} else if tea.BoolValue(util.EqualString(request.BodyType, tea.String("array"))) {
arr, _err := util.ReadAsJSON(response.Body)
if _err != nil {
return _err
}
response.DeserializedBody = arr
} else {
response.DeserializedBody, _err = util.ReadAsString(response.Body)
if _err != nil {
return _err
}
}
return _err
}
func (client *Client) GetEndpoint(productId *string, regionId *string, endpointRule *string, network *string, suffix *string, endpointMap map[string]*string, endpoint *string) (_result *string, _err error) {
if !tea.BoolValue(util.Empty(endpoint)) {
_result = endpoint
return _result, _err
}
if !tea.BoolValue(util.IsUnset(endpointMap)) && !tea.BoolValue(util.Empty(endpointMap[tea.StringValue(regionId)])) {
_result = endpointMap[tea.StringValue(regionId)]
return _result, _err
}
_body, _err := endpointutil.GetEndpointRules(productId, regionId, endpointRule, network, suffix)
if _err != nil {
return _result, _err
}
_result = _body
return _result, _err
}
func (client *Client) DefaultAny(inputValue interface{}, defaultValue interface{}) (_result interface{}) {
if tea.BoolValue(util.IsUnset(inputValue)) {
_result = defaultValue
return _result
}
_result = inputValue
return _result
}
func (client *Client) GetAuthorization(pathname *string, method *string, query map[string]*string, headers map[string]*string, signatureAlgorithm *string, payload *string, ak *string, signingkey []byte, product *string, region *string, date *string) (_result *string, _err error) {
signature, _err := client.GetSignature(pathname, method, query, headers, signatureAlgorithm, payload, signingkey)
if _err != nil {
return _result, _err
}
signedHeaders, _err := client.GetSignedHeaders(headers)
if _err != nil {
return _result, _err
}
signedHeadersStr := array.Join(signedHeaders, tea.String(";"))
_result = tea.String(tea.StringValue(signatureAlgorithm) + " Credential=" + tea.StringValue(ak) + "/" + tea.StringValue(date) + "/" + tea.StringValue(region) + "/" + tea.StringValue(product) + "/" + tea.StringValue(client.SignPrefix) + "_request,SignedHeaders=" + tea.StringValue(signedHeadersStr) + ",Signature=" + tea.StringValue(signature))
return _result, _err
}
func (client *Client) GetSignature(pathname *string, method *string, query map[string]*string, headers map[string]*string, signatureAlgorithm *string, payload *string, signingkey []byte) (_result *string, _err error) {
canonicalURI := tea.String("/")
if !tea.BoolValue(util.Empty(pathname)) {
canonicalURI = pathname
}
stringToSign := tea.String("")
canonicalizedResource, _err := client.BuildCanonicalizedResource(query)
if _err != nil {
return _result, _err
}
canonicalizedHeaders, _err := client.BuildCanonicalizedHeaders(headers)
if _err != nil {
return _result, _err
}
signedHeaders, _err := client.GetSignedHeaders(headers)
if _err != nil {
return _result, _err
}
signedHeadersStr := array.Join(signedHeaders, tea.String(";"))
stringToSign = tea.String(tea.StringValue(method) + "\n" + tea.StringValue(canonicalURI) + "\n" + tea.StringValue(canonicalizedResource) + "\n" + tea.StringValue(canonicalizedHeaders) + "\n" + tea.StringValue(signedHeadersStr) + "\n" + tea.StringValue(payload))
hex := encodeutil.HexEncode(encodeutil.Hash(util.ToBytes(stringToSign), signatureAlgorithm))
stringToSign = tea.String(tea.StringValue(signatureAlgorithm) + "\n" + tea.StringValue(hex))
signature := util.ToBytes(tea.String(""))
if tea.BoolValue(util.EqualString(signatureAlgorithm, client.Sha256)) {
signature = signatureutil.HmacSHA256SignByBytes(stringToSign, signingkey)
} else if tea.BoolValue(util.EqualString(signatureAlgorithm, client.Sm3)) {
signature = signatureutil.HmacSM3SignByBytes(stringToSign, signingkey)
}
_body := encodeutil.HexEncode(signature)
_result = _body
return _result, _err
}
func (client *Client) GetSigningkey(signatureAlgorithm *string, secret *string, product *string, region *string, date *string) (_result []byte, _err error) {
sc1 := tea.String(tea.StringValue(client.SignPrefix) + tea.StringValue(secret))
sc2 := util.ToBytes(tea.String(""))
if tea.BoolValue(util.EqualString(signatureAlgorithm, client.Sha256)) {
sc2 = signatureutil.HmacSHA256Sign(date, sc1)
} else if tea.BoolValue(util.EqualString(signatureAlgorithm, client.Sm3)) {
sc2 = signatureutil.HmacSM3Sign(date, sc1)
}
sc3 := util.ToBytes(tea.String(""))
if tea.BoolValue(util.EqualString(signatureAlgorithm, client.Sha256)) {
sc3 = signatureutil.HmacSHA256SignByBytes(region, sc2)
} else if tea.BoolValue(util.EqualString(signatureAlgorithm, client.Sm3)) {
sc3 = signatureutil.HmacSM3SignByBytes(region, sc2)
}
sc4 := util.ToBytes(tea.String(""))
if tea.BoolValue(util.EqualString(signatureAlgorithm, client.Sha256)) {
sc4 = signatureutil.HmacSHA256SignByBytes(product, sc3)
} else if tea.BoolValue(util.EqualString(signatureAlgorithm, client.Sm3)) {
sc4 = signatureutil.HmacSM3SignByBytes(product, sc3)
}
hmac := util.ToBytes(tea.String(""))
if tea.BoolValue(util.EqualString(signatureAlgorithm, client.Sha256)) {
hmac = signatureutil.HmacSHA256SignByBytes(tea.String(tea.StringValue(client.SignPrefix)+"_request"), sc4)
} else if tea.BoolValue(util.EqualString(signatureAlgorithm, client.Sm3)) {
hmac = signatureutil.HmacSM3SignByBytes(tea.String(tea.StringValue(client.SignPrefix)+"_request"), sc4)
}
_result = hmac
return _result, _err
}
func (client *Client) GetRegion(product *string, endpoint *string, regionId *string) (_result *string) {
if !tea.BoolValue(util.Empty(regionId)) {
_result = regionId
return _result
}
region := tea.String("center")
if tea.BoolValue(util.Empty(product)) || tea.BoolValue(util.Empty(endpoint)) {
_result = region
return _result
}
strs := string_.Split(endpoint, tea.String(":"), nil)
withoutPort := strs[0]
preRegion := string_.Replace(withoutPort, tea.String("."+tea.StringValue(client.EndpointSuffix)), tea.String(""), nil)
nodes := string_.Split(preRegion, tea.String("."), nil)
if tea.BoolValue(util.EqualNumber(array.Size(nodes), tea.Int(2))) {
region = nodes[1]
}
_result = region
return _result
}
func (client *Client) BuildCanonicalizedResource(query map[string]*string) (_result *string, _err error) {
canonicalizedResource := tea.String("")
if !tea.BoolValue(util.IsUnset(query)) {
queryArray := map_.KeySet(query)
sortedQueryArray := array.AscSort(queryArray)
separator := tea.String("")
for _, key := range sortedQueryArray {
canonicalizedResource = tea.String(tea.StringValue(canonicalizedResource) + tea.StringValue(separator) + tea.StringValue(encodeutil.PercentEncode(key)))
if !tea.BoolValue(util.Empty(query[tea.StringValue(key)])) {
canonicalizedResource = tea.String(tea.StringValue(canonicalizedResource) + "=" + tea.StringValue(encodeutil.PercentEncode(query[tea.StringValue(key)])))
}
separator = tea.String("&")
}
}
_result = canonicalizedResource
return _result, _err
}
func (client *Client) BuildCanonicalizedHeaders(headers map[string]*string) (_result *string, _err error) {
canonicalizedHeaders := tea.String("")
sortedHeaders, _err := client.GetSignedHeaders(headers)
if _err != nil {
return _result, _err
}
for _, header := range sortedHeaders {
canonicalizedHeaders = tea.String(tea.StringValue(canonicalizedHeaders) + tea.StringValue(header) + ":" + tea.StringValue(string_.Trim(headers[tea.StringValue(header)])) + "\n")
}
_result = canonicalizedHeaders
return _result, _err
}
func (client *Client) GetSignedHeaders(headers map[string]*string) (_result []*string, _err error) {
headersArray := map_.KeySet(headers)
sortedHeadersArray := array.AscSort(headersArray)
tmp := tea.String("")
separator := tea.String("")
for _, key := range sortedHeadersArray {
lowerKey := string_.ToLower(key)
if tea.BoolValue(string_.HasPrefix(lowerKey, tea.String("x-acs-"))) || tea.BoolValue(string_.Equals(lowerKey, tea.String("host"))) || tea.BoolValue(string_.Equals(lowerKey, tea.String("content-type"))) {
if !tea.BoolValue(string_.Contains(tmp, lowerKey)) {
tmp = tea.String(tea.StringValue(tmp) + tea.StringValue(separator) + tea.StringValue(lowerKey))
separator = tea.String(";")
}
}
}
_result = make([]*string, 0)
_body := string_.Split(tmp, tea.String(";"), nil)
_result = _body
return _result, _err
}