alibabacloud-gateway-pop/ts/src/client.ts (285 lines of code) (raw):
// This file is auto-generated, don't edit it
import SPI, * as $SPI from '@alicloud/gateway-spi';
import Credential, * as $Credential from '@alicloud/credentials';
import Util from '@alicloud/tea-util';
import OpenApiUtil from '@alicloud/openapi-util';
import EndpointUtil from '@alicloud/endpoint-util';
import EncodeUtil from '@alicloud/darabonba-encode-util';
import SignatureUtil from '@alicloud/darabonba-signature-util';
import String from '@alicloud/darabonba-string';
import Map from '@alicloud/darabonba-map';
import Array from '@alicloud/darabonba-array';
import * as $tea from '@alicloud/tea-typescript';
export default class Client extends SPI {
_endpointSuffix: string;
_signatureTypePrefix: string;
_signPrefix: string;
_sha256: string;
_sm3: string;
constructor() {
super();
// CLOUD4-
this._signatureTypePrefix = "ACS4-";
// cloud_v4
this._signPrefix = "aliyun_v4";
this._endpointSuffix = "aliyuncs.com";
this._sha256 = `${this._signatureTypePrefix}HMAC-SHA256`;
this._sm3 = `${this._signatureTypePrefix}HMAC-SM3`;
}
async modifyConfiguration(context: $SPI.InterceptorContext, attributeMap: $SPI.AttributeMap): Promise<void> {
let request = context.request;
let config = context.configuration;
let attributes = attributeMap.key;
if (!Util.isUnset(attributes)) {
this._signatureTypePrefix = attributes["signatureTypePrefix"];
this._signPrefix = attributes["signPrefix"];
this._endpointSuffix = attributes["endpointSuffix"];
this._sha256 = `${this._signatureTypePrefix}HMAC-SHA256`;
this._sm3 = `${this._signatureTypePrefix}HMAC-SM3`;
}
config.endpoint = this.getEndpoint(request.productId, config.regionId, config.endpointRule, config.network, config.suffix, config.endpointMap, config.endpoint);
}
async modifyRequest(context: $SPI.InterceptorContext, attributeMap: $SPI.AttributeMap): Promise<void> {
let request = context.request;
let config = context.configuration;
let date = OpenApiUtil.getTimestamp();
request.headers = {
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: "application/json",
...request.headers,
};
let signatureAlgorithm : string = Util.defaultString(request.signatureAlgorithm, this._sha256);
let hashedRequestPayload = EncodeUtil.hexEncode(EncodeUtil.hash(Util.toBytes(""), signatureAlgorithm));
if (!Util.isUnset(request.stream)) {
let tmp = await Util.readAsBytes(request.stream);
hashedRequestPayload = EncodeUtil.hexEncode(EncodeUtil.hash(tmp, signatureAlgorithm));
request.stream = new $tea.BytesReadable(tmp);
request.headers["content-type"] = "application/octet-stream";
} else {
if (!Util.isUnset(request.body)) {
if (Util.equalString(request.reqBodyType, "json")) {
let jsonObj = Util.toJSONString(request.body);
hashedRequestPayload = EncodeUtil.hexEncode(EncodeUtil.hash(Util.toBytes(jsonObj), signatureAlgorithm));
request.stream = new $tea.BytesReadable(jsonObj);
request.headers["content-type"] = "application/json; charset=utf-8";
} else {
let m = Util.assertAsMap(request.body);
let formObj = OpenApiUtil.toForm(m);
hashedRequestPayload = EncodeUtil.hexEncode(EncodeUtil.hash(Util.toBytes(formObj), signatureAlgorithm));
request.stream = new $tea.BytesReadable(formObj);
request.headers["content-type"] = "application/x-www-form-urlencoded";
}
}
}
if (Util.equalString(signatureAlgorithm, this._sm3)) {
request.headers["x-acs-content-sm3"] = hashedRequestPayload;
} else {
request.headers["x-acs-content-sha256"] = hashedRequestPayload;
}
if (!Util.equalString(request.authType, "Anonymous")) {
let credential : Credential = request.credential;
if (Util.isUnset(credential)) {
throw $tea.newError({
code: "ParameterMissing",
message: "'config.credential' can not be unset",
});
}
let credentialModel = await credential.getCredential();
if (!Util.empty(credentialModel.providerName)) {
request.headers["x-acs-credentials-provider"] = credentialModel.providerName;
}
let authType = credentialModel.type;
if (Util.equalString(authType, "bearer")) {
let bearerToken = credential.getBearerToken();
request.headers["x-acs-bearer-token"] = bearerToken;
request.headers["x-acs-signature-type"] = "BEARERTOKEN";
request.headers["Authorization"] = `Bearer ${bearerToken}`;
} else if (Util.equalString(authType, "id_token")) {
let idToken = credentialModel.securityToken;
request.headers["x-acs-zero-trust-idtoken"] = idToken;
} else {
let accessKeyId = credentialModel.accessKeyId;
let accessKeySecret = credentialModel.accessKeySecret;
let securityToken = credentialModel.securityToken;
if (!Util.empty(securityToken)) {
request.headers["x-acs-accesskey-id"] = accessKeyId;
request.headers["x-acs-security-token"] = securityToken;
}
let dateNew = String.subString(date, 0, 10);
dateNew = String.replace(dateNew, "-", "", null);
let region = this.getRegion(request.productId, config.endpoint, config.regionId);
let signingkey = await this.getSigningkey(signatureAlgorithm, accessKeySecret, request.productId, region, dateNew);
request.headers["Authorization"] = await this.getAuthorization(request.pathname, request.method, request.query, request.headers, signatureAlgorithm, hashedRequestPayload, accessKeyId, signingkey, request.productId, region, dateNew);
}
}
}
async modifyResponse(context: $SPI.InterceptorContext, attributeMap: $SPI.AttributeMap): Promise<void> {
let request = context.request;
let response = context.response;
if (Util.is4xx(response.statusCode) || Util.is5xx(response.statusCode)) {
let _res = await Util.readAsJSON(response.body);
let err = Util.assertAsMap(_res);
let requestId = this.defaultAny(err["RequestId"], err["requestId"]);
if (!Util.isUnset(response.headers["x-acs-request-id"])) {
requestId = response.headers["x-acs-request-id"];
}
err["statusCode"] = response.statusCode;
throw $tea.newError({
code: `${this.defaultAny(err["Code"], err["code"])}`,
message: `code: ${response.statusCode}, ${this.defaultAny(err["Message"], err["message"])} request id: ${requestId}`,
data: err,
description: `${this.defaultAny(err["Description"], err["description"])}`,
accessDeniedDetail: this.defaultAny(err["AccessDeniedDetail"], err["accessDeniedDetail"]),
});
}
if (Util.equalNumber(response.statusCode, 204)) {
await Util.readAsString(response.body);
} else if (Util.equalString(request.bodyType, "binary")) {
response.deserializedBody = response.body;
} else if (Util.equalString(request.bodyType, "byte")) {
let byt = await Util.readAsBytes(response.body);
response.deserializedBody = byt;
} else if (Util.equalString(request.bodyType, "string")) {
let str = await Util.readAsString(response.body);
response.deserializedBody = str;
} else if (Util.equalString(request.bodyType, "json")) {
let obj = await Util.readAsJSON(response.body);
let res = Util.assertAsMap(obj);
response.deserializedBody = res;
} else if (Util.equalString(request.bodyType, "array")) {
let arr = await Util.readAsJSON(response.body);
response.deserializedBody = arr;
} else {
response.deserializedBody = await Util.readAsString(response.body);
}
}
getEndpoint(productId: string, regionId: string, endpointRule: string, network: string, suffix: string, endpointMap: {[key: string ]: string}, endpoint: string): string {
if (!Util.empty(endpoint)) {
return endpoint;
}
if (!Util.isUnset(endpointMap) && !Util.empty(endpointMap[regionId])) {
return endpointMap[regionId];
}
return EndpointUtil.getEndpointRules(productId, regionId, endpointRule, network, suffix);
}
defaultAny(inputValue: any, defaultValue: any): any {
if (Util.isUnset(inputValue)) {
return defaultValue;
}
return inputValue;
}
async getAuthorization(pathname: string, method: string, query: {[key: string ]: string}, headers: {[key: string ]: string}, signatureAlgorithm: string, payload: string, ak: string, signingkey: Buffer, product: string, region: string, date: string): Promise<string> {
let signature = await this.getSignature(pathname, method, query, headers, signatureAlgorithm, payload, signingkey);
let signedHeaders = await this.getSignedHeaders(headers);
let signedHeadersStr = Array.join(signedHeaders, ";");
return `${signatureAlgorithm} Credential=${ak}/${date}/${region}/${product}/${this._signPrefix}_request,SignedHeaders=${signedHeadersStr},Signature=${signature}`;
}
async getSignature(pathname: string, method: string, query: {[key: string ]: string}, headers: {[key: string ]: string}, signatureAlgorithm: string, payload: string, signingkey: Buffer): Promise<string> {
let canonicalURI : string = "/";
if (!Util.empty(pathname)) {
canonicalURI = pathname;
}
let stringToSign : string = "";
let canonicalizedResource = await this.buildCanonicalizedResource(query);
let canonicalizedHeaders = await this.buildCanonicalizedHeaders(headers);
let signedHeaders = await this.getSignedHeaders(headers);
let signedHeadersStr = Array.join(signedHeaders, ";");
stringToSign = `${method}\n${canonicalURI}\n${canonicalizedResource}\n${canonicalizedHeaders}\n${signedHeadersStr}\n${payload}`;
let hex = EncodeUtil.hexEncode(EncodeUtil.hash(Util.toBytes(stringToSign), signatureAlgorithm));
stringToSign = `${signatureAlgorithm}\n${hex}`;
let signature = Util.toBytes("");
if (Util.equalString(signatureAlgorithm, this._sha256)) {
signature = SignatureUtil.HmacSHA256SignByBytes(stringToSign, signingkey);
} else if (Util.equalString(signatureAlgorithm, this._sm3)) {
signature = SignatureUtil.HmacSM3SignByBytes(stringToSign, signingkey);
}
return EncodeUtil.hexEncode(signature);
}
async getSigningkey(signatureAlgorithm: string, secret: string, product: string, region: string, date: string): Promise<Buffer> {
let sc1 = `${this._signPrefix}${secret}`;
let sc2 = Util.toBytes("");
if (Util.equalString(signatureAlgorithm, this._sha256)) {
sc2 = SignatureUtil.HmacSHA256Sign(date, sc1);
} else if (Util.equalString(signatureAlgorithm, this._sm3)) {
sc2 = SignatureUtil.HmacSM3Sign(date, sc1);
}
let sc3 = Util.toBytes("");
if (Util.equalString(signatureAlgorithm, this._sha256)) {
sc3 = SignatureUtil.HmacSHA256SignByBytes(region, sc2);
} else if (Util.equalString(signatureAlgorithm, this._sm3)) {
sc3 = SignatureUtil.HmacSM3SignByBytes(region, sc2);
}
let sc4 = Util.toBytes("");
if (Util.equalString(signatureAlgorithm, this._sha256)) {
sc4 = SignatureUtil.HmacSHA256SignByBytes(product, sc3);
} else if (Util.equalString(signatureAlgorithm, this._sm3)) {
sc4 = SignatureUtil.HmacSM3SignByBytes(product, sc3);
}
let hmac = Util.toBytes("");
if (Util.equalString(signatureAlgorithm, this._sha256)) {
hmac = SignatureUtil.HmacSHA256SignByBytes(`${this._signPrefix}_request`, sc4);
} else if (Util.equalString(signatureAlgorithm, this._sm3)) {
hmac = SignatureUtil.HmacSM3SignByBytes(`${this._signPrefix}_request`, sc4);
}
return hmac;
}
getRegion(product: string, endpoint: string, regionId: string): string {
if (!Util.empty(regionId)) {
return regionId;
}
let region = "center";
if (Util.empty(product) || Util.empty(endpoint)) {
return region;
}
let strs : string[] = String.split(endpoint, ":", null);
let withoutPort : string = strs[0];
let preRegion : string = String.replace(withoutPort, `.${this._endpointSuffix}`, "", null);
let nodes = String.split(preRegion, ".", null);
if (Util.equalNumber(Array.size(nodes), 2)) {
region = nodes[1];
}
return region;
}
async buildCanonicalizedResource(query: {[key: string ]: string}): Promise<string> {
let canonicalizedResource : string = "";
if (!Util.isUnset(query)) {
let queryArray : string[] = Map.keySet(query);
let sortedQueryArray = Array.ascSort(queryArray);
let separator : string = "";
for (let key of sortedQueryArray) {
canonicalizedResource = `${canonicalizedResource}${separator}${EncodeUtil.percentEncode(key)}`;
if (!Util.empty(query[key])) {
canonicalizedResource = `${canonicalizedResource}=${EncodeUtil.percentEncode(query[key])}`;
}
separator = "&";
}
}
return canonicalizedResource;
}
async buildCanonicalizedHeaders(headers: {[key: string ]: string}): Promise<string> {
let canonicalizedHeaders : string = "";
let sortedHeaders : string[] = await this.getSignedHeaders(headers);
for (let header of sortedHeaders) {
canonicalizedHeaders = `${canonicalizedHeaders}${header}:${String.trim(headers[header])}\n`;
}
return canonicalizedHeaders;
}
async getSignedHeaders(headers: {[key: string ]: string}): Promise<string[]> {
let headersArray : string[] = Map.keySet(headers);
let sortedHeadersArray = Array.ascSort(headersArray);
let tmp : string = "";
let separator : string = "";
for (let key of sortedHeadersArray) {
let lowerKey = String.toLower(key);
if (String.hasPrefix(lowerKey, "x-acs-") || String.equals(lowerKey, "host") || String.equals(lowerKey, "content-type")) {
if (!String.contains(tmp, lowerKey)) {
tmp = `${tmp}${separator}${lowerKey}`;
separator = ";";
}
}
}
return String.split(tmp, ";", null);
}
}