- 新增图像生成接口,支持试用、积分和自定义API Key模式 - 实现生成图片结果异步上传至MinIO存储,带重试机制 - 优化积分预扣除和异常退还逻辑,保障用户积分准确 - 添加获取生成历史记录接口,支持时间范围和分页 - 提供本地字典配置接口,支持模型、比例、提示模板和尺寸 - 实现图片批量上传接口,支持S3兼容对象存储 feat(admin): 增加管理员角色管理与权限分配接口 - 实现角色列表查询、角色创建、更新及删除功能 - 增加权限列表查询接口 - 实现用户角色分配接口,便于统一管理用户权限 - 增加系统字典增删查改接口,支持分类过滤和排序 - 权限控制全面覆盖管理接口,保证安全访问 feat(auth): 完善用户登录注册及权限相关接口与页面 - 实现手机号验证码发送及校验功能,保障注册安全 - 支持手机号注册、登录及退出接口,集成日志记录 - 增加修改密码功能,验证原密码后更新 - 提供动态导航菜单接口,基于权限展示不同菜单 - 实现管理界面路由及日志、角色、字典管理页面访问权限控制 - 添加系统日志查询接口,支持关键词和等级筛选 feat(app): 初始化Flask应用并配置蓝图与数据库 - 创建应用程序工厂,加载配置,初始化数据库和Redis客户端 - 注册认证、API及管理员蓝图,整合路由 - 根路由渲染主页模板 - 应用上下文中自动创建数据库表,保证运行环境准备完毕 feat(database): 提供数据库创建与迁移支持脚本 - 新增数据库创建脚本,支持自动检测是否已存在 - 添加数据库表初始化脚本,支持创建和删除所有表 - 实现RBAC权限初始化,包含基础权限和角色创建 - 新增字段手动修复脚本,添加用户API Key和积分字段 - 强制迁移脚本支持清理连接和修复表结构,初始化默认数据及角色分配 feat(config): 新增系统配置参数 - 配置数据库、Redis、Session和MinIO相关参数 - 添加AI接口地址及试用Key配置 - 集成阿里云短信服务配置及开发模式相关参数 feat(extensions): 初始化数据库、Redis和MinIO客户端 - 创建全局SQLAlchemy数据库实例和Redis客户端 - 配置基于boto3的MinIO兼容S3客户端 chore(logs): 添加示例系统日志文件 - 记录用户请求、验证码发送成功与失败的日志信息
2592 lines
136 KiB
Python
2592 lines
136 KiB
Python
# -*- coding: utf-8 -*-
|
||
# This file is auto-generated, don't edit it. Thanks.
|
||
from __future__ import annotations
|
||
|
||
from typing import Dict, Generator, AsyncGenerator, Any
|
||
|
||
from alibabacloud_credentials import models as credential_models
|
||
from alibabacloud_credentials.client import Client as CredentialClient
|
||
from alibabacloud_gateway_spi import models as spi_models
|
||
from alibabacloud_gateway_spi.client import Client as SPIClient
|
||
from alibabacloud_tea_openapi import exceptions as main_exceptions
|
||
from alibabacloud_tea_openapi import models as main_models
|
||
from alibabacloud_tea_openapi import utils_models as open_api_util_models
|
||
from alibabacloud_tea_openapi.utils import Utils
|
||
from darabonba.core import DaraCore as DaraCore
|
||
from darabonba.core import DaraCore
|
||
from darabonba.exceptions import DaraException, UnretryableException
|
||
from darabonba.policy.retry import RetryOptions, RetryPolicyContext
|
||
from darabonba.request import DaraRequest
|
||
from darabonba.runtime import RuntimeOptions
|
||
from darabonba.utils.bytes import Bytes as DaraBytes
|
||
from darabonba.utils.form import Form as DaraForm
|
||
from darabonba.utils.stream import Stream as DaraStream
|
||
from darabonba.utils.xml import XML as DaraXML
|
||
|
||
"""
|
||
* @remarks
|
||
* This is for OpenApi SDK
|
||
"""
|
||
class Client:
|
||
_endpoint: str = None
|
||
_region_id: str = None
|
||
_protocol: str = None
|
||
_method: str = None
|
||
_user_agent: str = None
|
||
_endpoint_rule: str = None
|
||
_endpoint_map: Dict[str, str] = None
|
||
_suffix: str = None
|
||
_read_timeout: int = None
|
||
_connect_timeout: int = None
|
||
_http_proxy: str = None
|
||
_https_proxy: str = None
|
||
_socks_5proxy: str = None
|
||
_socks_5net_work: str = None
|
||
_no_proxy: str = None
|
||
_network: str = None
|
||
_product_id: str = None
|
||
_max_idle_conns: int = None
|
||
_endpoint_type: str = None
|
||
_open_platform_endpoint: str = None
|
||
_credential: CredentialClient = None
|
||
_signature_version: str = None
|
||
_signature_algorithm: str = None
|
||
_headers: Dict[str, str] = None
|
||
_spi: SPIClient = None
|
||
_global_parameters: open_api_util_models.GlobalParameters = None
|
||
_key: str = None
|
||
_cert: str = None
|
||
_ca: str = None
|
||
_disable_http_2: bool = None
|
||
_retry_options: RetryOptions = None
|
||
_tls_min_version: str = None
|
||
_attribute_map: spi_models.AttributeMap = None
|
||
|
||
def __init__(
|
||
self,
|
||
config: open_api_util_models.Config,
|
||
):
|
||
if DaraCore.is_null(config):
|
||
raise main_exceptions.ClientException(
|
||
code = 'ParameterMissing',
|
||
message = '\'config\' can not be unset'
|
||
)
|
||
if (not DaraCore.is_null(config.access_key_id) and config.access_key_id != '') and (not DaraCore.is_null(config.access_key_secret) and config.access_key_secret != ''):
|
||
if not DaraCore.is_null(config.security_token) and config.security_token != '':
|
||
config.type = 'sts'
|
||
else:
|
||
config.type = 'access_key'
|
||
|
||
credential_config = credential_models.Config(
|
||
access_key_id = config.access_key_id,
|
||
type = config.type,
|
||
access_key_secret = config.access_key_secret
|
||
)
|
||
credential_config.security_token = config.security_token
|
||
self._credential = CredentialClient(credential_config)
|
||
elif not DaraCore.is_null(config.bearer_token) and config.bearer_token != '':
|
||
cc = credential_models.Config(
|
||
type = 'bearer',
|
||
bearer_token = config.bearer_token
|
||
)
|
||
self._credential = CredentialClient(cc)
|
||
elif not DaraCore.is_null(config.credential):
|
||
self._credential = config.credential
|
||
self._endpoint = config.endpoint
|
||
self._endpoint_type = config.endpoint_type
|
||
self._network = config.network
|
||
self._suffix = config.suffix
|
||
self._protocol = config.protocol
|
||
self._method = config.method
|
||
self._region_id = config.region_id
|
||
self._user_agent = config.user_agent
|
||
self._read_timeout = config.read_timeout
|
||
self._connect_timeout = config.connect_timeout
|
||
self._http_proxy = config.http_proxy
|
||
self._https_proxy = config.https_proxy
|
||
self._no_proxy = config.no_proxy
|
||
self._socks_5proxy = config.socks_5proxy
|
||
self._socks_5net_work = config.socks_5net_work
|
||
self._max_idle_conns = config.max_idle_conns
|
||
self._signature_version = config.signature_version
|
||
self._signature_algorithm = config.signature_algorithm
|
||
self._global_parameters = config.global_parameters
|
||
self._key = config.key
|
||
self._cert = config.cert
|
||
self._ca = config.ca
|
||
self._disable_http_2 = config.disable_http_2
|
||
self._retry_options = config.retry_options
|
||
self._tls_min_version = config.tls_min_version
|
||
|
||
"""
|
||
* @remarks
|
||
* Encapsulate the request and invoke the network
|
||
*
|
||
* @param action - api name
|
||
* @param version - product version
|
||
* @param protocol - http or https
|
||
* @param method - e.g. GET
|
||
* @param authType - authorization type e.g. AK
|
||
* @param bodyType - response body type e.g. String
|
||
* @param request - object of OpenApiRequest
|
||
* @param runtime - which controls some details of call api, such as retry times
|
||
* @returns the response
|
||
"""
|
||
def do_rpcrequest(
|
||
self,
|
||
action: str,
|
||
version: str,
|
||
protocol: str,
|
||
method: str,
|
||
auth_type: str,
|
||
body_type: str,
|
||
request: open_api_util_models.OpenApiRequest,
|
||
runtime: RuntimeOptions,
|
||
) -> dict:
|
||
_runtime = {
|
||
'key': runtime.key or self._key,
|
||
'cert': runtime.cert or self._cert,
|
||
'ca': runtime.ca or self._ca,
|
||
'readTimeout': DaraCore.to_number(runtime.read_timeout or self._read_timeout),
|
||
'connectTimeout': DaraCore.to_number(runtime.connect_timeout or self._connect_timeout),
|
||
'httpProxy': runtime.http_proxy or self._http_proxy,
|
||
'httpsProxy': runtime.https_proxy or self._https_proxy,
|
||
'noProxy': runtime.no_proxy or self._no_proxy,
|
||
'socks5Proxy': runtime.socks_5proxy or self._socks_5proxy,
|
||
'socks5NetWork': runtime.socks_5net_work or self._socks_5net_work,
|
||
'maxIdleConns': DaraCore.to_number(runtime.max_idle_conns or self._max_idle_conns),
|
||
'retryOptions': self._retry_options,
|
||
'ignoreSSL': runtime.ignore_ssl,
|
||
'tlsMinVersion': self._tls_min_version,
|
||
}
|
||
_last_request = None
|
||
_last_response = None
|
||
_retries_attempted = 0
|
||
_context = RetryPolicyContext(
|
||
retries_attempted= _retries_attempted
|
||
)
|
||
while DaraCore.should_retry(_runtime.get('retryOptions'), _context):
|
||
if _retries_attempted > 0:
|
||
_backoff_time = DaraCore.get_backoff_time(_runtime.get('retryOptions'), _context)
|
||
if _backoff_time > 0:
|
||
DaraCore.sleep(_backoff_time)
|
||
_retries_attempted = _retries_attempted + 1
|
||
try:
|
||
_request = DaraRequest()
|
||
_request.protocol = self._protocol or protocol
|
||
_request.method = method
|
||
_request.pathname = '/'
|
||
global_queries = {}
|
||
global_headers = {}
|
||
if not DaraCore.is_null(self._global_parameters):
|
||
global_params = self._global_parameters
|
||
if not DaraCore.is_null(global_params.queries):
|
||
global_queries = global_params.queries
|
||
if not DaraCore.is_null(global_params.headers):
|
||
global_headers = global_params.headers
|
||
extends_headers = {}
|
||
extends_queries = {}
|
||
if not DaraCore.is_null(runtime.extends_parameters):
|
||
extends_parameters = runtime.extends_parameters
|
||
if not DaraCore.is_null(extends_parameters.headers):
|
||
extends_headers = extends_parameters.headers
|
||
if not DaraCore.is_null(extends_parameters.queries):
|
||
extends_queries = extends_parameters.queries
|
||
_request.query = DaraCore.merge({
|
||
'Action': action,
|
||
'Format': 'json',
|
||
'Version': version,
|
||
'Timestamp': Utils.get_timestamp(),
|
||
'SignatureNonce': Utils.get_nonce(),
|
||
}, global_queries, extends_queries, request.query)
|
||
headers = self.get_rpc_headers()
|
||
if DaraCore.is_null(headers):
|
||
# endpoint is setted in product client
|
||
_request.headers = DaraCore.merge({
|
||
'host': self._endpoint,
|
||
'x-acs-version': version,
|
||
'x-acs-action': action,
|
||
'user-agent': Utils.get_user_agent(self._user_agent),
|
||
}, global_headers, extends_headers, request.headers)
|
||
else:
|
||
_request.headers = DaraCore.merge({
|
||
'host': self._endpoint,
|
||
'x-acs-version': version,
|
||
'x-acs-action': action,
|
||
'user-agent': Utils.get_user_agent(self._user_agent),
|
||
}, global_headers, extends_headers, request.headers, headers)
|
||
|
||
if not DaraCore.is_null(request.body):
|
||
m = request.body
|
||
tmp = Utils.query(m)
|
||
_request.body = DaraForm.to_form_string(tmp)
|
||
_request.headers["content-type"] = 'application/x-www-form-urlencoded'
|
||
if auth_type != 'Anonymous':
|
||
if DaraCore.is_null(self._credential):
|
||
raise main_exceptions.ClientException(
|
||
code = f'InvalidCredentials',
|
||
message = f'Please set up the credentials correctly. If you are setting them through environment variables, please ensure that ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET are set correctly. See https://help.aliyun.com/zh/sdk/developer-reference/configure-the-alibaba-cloud-accesskey-environment-variable-on-linux-macos-and-windows-systems for more details.'
|
||
)
|
||
credential_model = self._credential.get_credential()
|
||
if not DaraCore.is_null(credential_model.provider_name):
|
||
_request.headers["x-acs-credentials-provider"] = credential_model.provider_name
|
||
credential_type = credential_model.type
|
||
if credential_type == 'bearer':
|
||
bearer_token = credential_model.bearer_token
|
||
_request.query["BearerToken"] = bearer_token
|
||
_request.query["SignatureType"] = 'BEARERTOKEN'
|
||
elif credential_type == 'id_token':
|
||
id_token = credential_model.security_token
|
||
_request.headers["x-acs-zero-trust-idtoken"] = id_token
|
||
else:
|
||
access_key_id = credential_model.access_key_id
|
||
access_key_secret = credential_model.access_key_secret
|
||
security_token = credential_model.security_token
|
||
if not DaraCore.is_null(security_token) and security_token != '':
|
||
_request.query["SecurityToken"] = security_token
|
||
_request.query["SignatureMethod"] = 'HMAC-SHA1'
|
||
_request.query["SignatureVersion"] = '1.0'
|
||
_request.query["AccessKeyId"] = access_key_id
|
||
t = None
|
||
if not DaraCore.is_null(request.body):
|
||
t = request.body
|
||
signed_param = DaraCore.merge({}, _request.query, Utils.query(t))
|
||
_request.query["Signature"] = Utils.get_rpcsignature(signed_param, _request.method, access_key_secret)
|
||
|
||
_last_request = _request
|
||
_response = DaraCore.do_action(_request, _runtime)
|
||
_last_response = _response
|
||
if (_response.status_code >= 400) and (_response.status_code < 600):
|
||
_res = DaraStream.read_as_json(_response.body)
|
||
err = _res
|
||
request_id = err.get("RequestId") or err.get("requestId")
|
||
code = err.get("Code") or err.get("code")
|
||
if (f'{code}' == 'Throttling') or (f'{code}' == 'Throttling.User') or (f'{code}' == 'Throttling.Api'):
|
||
raise main_exceptions.ThrottlingException(
|
||
status_code = _response.status_code,
|
||
code = f'{code}',
|
||
message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
|
||
description = f'{err.get("Description") or err.get("description")}',
|
||
retry_after = Utils.get_throttling_time_left(_response.headers),
|
||
data = err,
|
||
request_id = f'{request_id}'
|
||
)
|
||
elif (_response.status_code >= 400) and (_response.status_code < 500):
|
||
raise main_exceptions.ClientException(
|
||
status_code = _response.status_code,
|
||
code = f'{code}',
|
||
message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
|
||
description = f'{err.get("Description") or err.get("description")}',
|
||
data = err,
|
||
access_denied_detail = self.get_access_denied_detail(err),
|
||
request_id = f'{request_id}'
|
||
)
|
||
else:
|
||
raise main_exceptions.ServerException(
|
||
status_code = _response.status_code,
|
||
code = f'{code}',
|
||
message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
|
||
description = f'{err.get("Description") or err.get("description")}',
|
||
data = err,
|
||
request_id = f'{request_id}'
|
||
)
|
||
|
||
if body_type == 'binary':
|
||
resp = {
|
||
'body': _response.body,
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
return resp
|
||
elif body_type == 'byte':
|
||
byt = DaraStream.read_as_bytes(_response.body)
|
||
return {
|
||
'body': byt,
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
elif body_type == 'string':
|
||
_str = DaraStream.read_as_string(_response.body)
|
||
return {
|
||
'body': _str,
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
elif body_type == 'json':
|
||
obj = DaraStream.read_as_json(_response.body)
|
||
res = obj
|
||
return {
|
||
'body': res,
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
elif body_type == 'array':
|
||
arr = DaraStream.read_as_json(_response.body)
|
||
return {
|
||
'body': arr,
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
else:
|
||
return {
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
|
||
except Exception as e:
|
||
_context = RetryPolicyContext(
|
||
retries_attempted= _retries_attempted,
|
||
http_request = _last_request,
|
||
http_response = _last_response,
|
||
exception = e
|
||
)
|
||
continue
|
||
raise UnretryableException(_context)
|
||
|
||
async def do_rpcrequest_async(
|
||
self,
|
||
action: str,
|
||
version: str,
|
||
protocol: str,
|
||
method: str,
|
||
auth_type: str,
|
||
body_type: str,
|
||
request: open_api_util_models.OpenApiRequest,
|
||
runtime: RuntimeOptions,
|
||
) -> dict:
|
||
_runtime = {
|
||
'key': runtime.key or self._key,
|
||
'cert': runtime.cert or self._cert,
|
||
'ca': runtime.ca or self._ca,
|
||
'readTimeout': DaraCore.to_number(runtime.read_timeout or self._read_timeout),
|
||
'connectTimeout': DaraCore.to_number(runtime.connect_timeout or self._connect_timeout),
|
||
'httpProxy': runtime.http_proxy or self._http_proxy,
|
||
'httpsProxy': runtime.https_proxy or self._https_proxy,
|
||
'noProxy': runtime.no_proxy or self._no_proxy,
|
||
'socks5Proxy': runtime.socks_5proxy or self._socks_5proxy,
|
||
'socks5NetWork': runtime.socks_5net_work or self._socks_5net_work,
|
||
'maxIdleConns': DaraCore.to_number(runtime.max_idle_conns or self._max_idle_conns),
|
||
'retryOptions': self._retry_options,
|
||
'ignoreSSL': runtime.ignore_ssl,
|
||
'tlsMinVersion': self._tls_min_version,
|
||
}
|
||
_last_request = None
|
||
_last_response = None
|
||
_retries_attempted = 0
|
||
_context = RetryPolicyContext(
|
||
retries_attempted= _retries_attempted
|
||
)
|
||
while DaraCore.should_retry(_runtime.get('retryOptions'), _context):
|
||
if _retries_attempted > 0:
|
||
_backoff_time = DaraCore.get_backoff_time(_runtime.get('retryOptions'), _context)
|
||
if _backoff_time > 0:
|
||
DaraCore.sleep(_backoff_time)
|
||
_retries_attempted = _retries_attempted + 1
|
||
try:
|
||
_request = DaraRequest()
|
||
_request.protocol = self._protocol or protocol
|
||
_request.method = method
|
||
_request.pathname = '/'
|
||
global_queries = {}
|
||
global_headers = {}
|
||
if not DaraCore.is_null(self._global_parameters):
|
||
global_params = self._global_parameters
|
||
if not DaraCore.is_null(global_params.queries):
|
||
global_queries = global_params.queries
|
||
if not DaraCore.is_null(global_params.headers):
|
||
global_headers = global_params.headers
|
||
extends_headers = {}
|
||
extends_queries = {}
|
||
if not DaraCore.is_null(runtime.extends_parameters):
|
||
extends_parameters = runtime.extends_parameters
|
||
if not DaraCore.is_null(extends_parameters.headers):
|
||
extends_headers = extends_parameters.headers
|
||
if not DaraCore.is_null(extends_parameters.queries):
|
||
extends_queries = extends_parameters.queries
|
||
_request.query = DaraCore.merge({
|
||
'Action': action,
|
||
'Format': 'json',
|
||
'Version': version,
|
||
'Timestamp': Utils.get_timestamp(),
|
||
'SignatureNonce': Utils.get_nonce(),
|
||
}, global_queries, extends_queries, request.query)
|
||
headers = self.get_rpc_headers()
|
||
if DaraCore.is_null(headers):
|
||
# endpoint is setted in product client
|
||
_request.headers = DaraCore.merge({
|
||
'host': self._endpoint,
|
||
'x-acs-version': version,
|
||
'x-acs-action': action,
|
||
'user-agent': Utils.get_user_agent(self._user_agent),
|
||
}, global_headers, extends_headers, request.headers)
|
||
else:
|
||
_request.headers = DaraCore.merge({
|
||
'host': self._endpoint,
|
||
'x-acs-version': version,
|
||
'x-acs-action': action,
|
||
'user-agent': Utils.get_user_agent(self._user_agent),
|
||
}, global_headers, extends_headers, request.headers, headers)
|
||
|
||
if not DaraCore.is_null(request.body):
|
||
m = request.body
|
||
tmp = Utils.query(m)
|
||
_request.body = DaraForm.to_form_string(tmp)
|
||
_request.headers["content-type"] = 'application/x-www-form-urlencoded'
|
||
if auth_type != 'Anonymous':
|
||
if DaraCore.is_null(self._credential):
|
||
raise main_exceptions.ClientException(
|
||
code = f'InvalidCredentials',
|
||
message = f'Please set up the credentials correctly. If you are setting them through environment variables, please ensure that ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET are set correctly. See https://help.aliyun.com/zh/sdk/developer-reference/configure-the-alibaba-cloud-accesskey-environment-variable-on-linux-macos-and-windows-systems for more details.'
|
||
)
|
||
credential_model = await self._credential.get_credential_async()
|
||
if not DaraCore.is_null(credential_model.provider_name):
|
||
_request.headers["x-acs-credentials-provider"] = credential_model.provider_name
|
||
credential_type = credential_model.type
|
||
if credential_type == 'bearer':
|
||
bearer_token = credential_model.bearer_token
|
||
_request.query["BearerToken"] = bearer_token
|
||
_request.query["SignatureType"] = 'BEARERTOKEN'
|
||
elif credential_type == 'id_token':
|
||
id_token = credential_model.security_token
|
||
_request.headers["x-acs-zero-trust-idtoken"] = id_token
|
||
else:
|
||
access_key_id = credential_model.access_key_id
|
||
access_key_secret = credential_model.access_key_secret
|
||
security_token = credential_model.security_token
|
||
if not DaraCore.is_null(security_token) and security_token != '':
|
||
_request.query["SecurityToken"] = security_token
|
||
_request.query["SignatureMethod"] = 'HMAC-SHA1'
|
||
_request.query["SignatureVersion"] = '1.0'
|
||
_request.query["AccessKeyId"] = access_key_id
|
||
t = None
|
||
if not DaraCore.is_null(request.body):
|
||
t = request.body
|
||
signed_param = DaraCore.merge({}, _request.query, Utils.query(t))
|
||
_request.query["Signature"] = Utils.get_rpcsignature(signed_param, _request.method, access_key_secret)
|
||
|
||
_last_request = _request
|
||
_response = await DaraCore.async_do_action(_request, _runtime)
|
||
_last_response = _response
|
||
if (_response.status_code >= 400) and (_response.status_code < 600):
|
||
_res = await DaraStream.read_as_json_async(_response.body)
|
||
err = _res
|
||
request_id = err.get("RequestId") or err.get("requestId")
|
||
code = err.get("Code") or err.get("code")
|
||
if (f'{code}' == 'Throttling') or (f'{code}' == 'Throttling.User') or (f'{code}' == 'Throttling.Api'):
|
||
raise main_exceptions.ThrottlingException(
|
||
status_code = _response.status_code,
|
||
code = f'{code}',
|
||
message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
|
||
description = f'{err.get("Description") or err.get("description")}',
|
||
retry_after = Utils.get_throttling_time_left(_response.headers),
|
||
data = err,
|
||
request_id = f'{request_id}'
|
||
)
|
||
elif (_response.status_code >= 400) and (_response.status_code < 500):
|
||
raise main_exceptions.ClientException(
|
||
status_code = _response.status_code,
|
||
code = f'{code}',
|
||
message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
|
||
description = f'{err.get("Description") or err.get("description")}',
|
||
data = err,
|
||
access_denied_detail = self.get_access_denied_detail(err),
|
||
request_id = f'{request_id}'
|
||
)
|
||
else:
|
||
raise main_exceptions.ServerException(
|
||
status_code = _response.status_code,
|
||
code = f'{code}',
|
||
message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
|
||
description = f'{err.get("Description") or err.get("description")}',
|
||
data = err,
|
||
request_id = f'{request_id}'
|
||
)
|
||
|
||
if body_type == 'binary':
|
||
resp = {
|
||
'body': _response.body,
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
return resp
|
||
elif body_type == 'byte':
|
||
byt = await DaraStream.read_as_bytes_async(_response.body)
|
||
return {
|
||
'body': byt,
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
elif body_type == 'string':
|
||
_str = await DaraStream.read_as_string_async(_response.body)
|
||
return {
|
||
'body': _str,
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
elif body_type == 'json':
|
||
obj = await DaraStream.read_as_json_async(_response.body)
|
||
res = obj
|
||
return {
|
||
'body': res,
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
elif body_type == 'array':
|
||
arr = await DaraStream.read_as_json_async(_response.body)
|
||
return {
|
||
'body': arr,
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
else:
|
||
return {
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
|
||
except Exception as e:
|
||
_context = RetryPolicyContext(
|
||
retries_attempted= _retries_attempted,
|
||
http_request = _last_request,
|
||
http_response = _last_response,
|
||
exception = e
|
||
)
|
||
continue
|
||
raise UnretryableException(_context)
|
||
|
||
"""
|
||
* @remarks
|
||
* Encapsulate the request and invoke the network
|
||
*
|
||
* @param action - api name
|
||
* @param version - product version
|
||
* @param protocol - http or https
|
||
* @param method - e.g. GET
|
||
* @param authType - authorization type e.g. AK
|
||
* @param pathname - pathname of every api
|
||
* @param bodyType - response body type e.g. String
|
||
* @param request - object of OpenApiRequest
|
||
* @param runtime - which controls some details of call api, such as retry times
|
||
* @returns the response
|
||
"""
|
||
def do_roarequest(
|
||
self,
|
||
action: str,
|
||
version: str,
|
||
protocol: str,
|
||
method: str,
|
||
auth_type: str,
|
||
pathname: str,
|
||
body_type: str,
|
||
request: open_api_util_models.OpenApiRequest,
|
||
runtime: RuntimeOptions,
|
||
) -> dict:
|
||
_runtime = {
|
||
'key': runtime.key or self._key,
|
||
'cert': runtime.cert or self._cert,
|
||
'ca': runtime.ca or self._ca,
|
||
'readTimeout': DaraCore.to_number(runtime.read_timeout or self._read_timeout),
|
||
'connectTimeout': DaraCore.to_number(runtime.connect_timeout or self._connect_timeout),
|
||
'httpProxy': runtime.http_proxy or self._http_proxy,
|
||
'httpsProxy': runtime.https_proxy or self._https_proxy,
|
||
'noProxy': runtime.no_proxy or self._no_proxy,
|
||
'socks5Proxy': runtime.socks_5proxy or self._socks_5proxy,
|
||
'socks5NetWork': runtime.socks_5net_work or self._socks_5net_work,
|
||
'maxIdleConns': DaraCore.to_number(runtime.max_idle_conns or self._max_idle_conns),
|
||
'retryOptions': self._retry_options,
|
||
'ignoreSSL': runtime.ignore_ssl,
|
||
'tlsMinVersion': self._tls_min_version,
|
||
}
|
||
_last_request = None
|
||
_last_response = None
|
||
_retries_attempted = 0
|
||
_context = RetryPolicyContext(
|
||
retries_attempted= _retries_attempted
|
||
)
|
||
while DaraCore.should_retry(_runtime.get('retryOptions'), _context):
|
||
if _retries_attempted > 0:
|
||
_backoff_time = DaraCore.get_backoff_time(_runtime.get('retryOptions'), _context)
|
||
if _backoff_time > 0:
|
||
DaraCore.sleep(_backoff_time)
|
||
_retries_attempted = _retries_attempted + 1
|
||
try:
|
||
_request = DaraRequest()
|
||
_request.protocol = self._protocol or protocol
|
||
_request.method = method
|
||
_request.pathname = pathname
|
||
global_queries = {}
|
||
global_headers = {}
|
||
if not DaraCore.is_null(self._global_parameters):
|
||
global_params = self._global_parameters
|
||
if not DaraCore.is_null(global_params.queries):
|
||
global_queries = global_params.queries
|
||
if not DaraCore.is_null(global_params.headers):
|
||
global_headers = global_params.headers
|
||
extends_headers = {}
|
||
extends_queries = {}
|
||
if not DaraCore.is_null(runtime.extends_parameters):
|
||
extends_parameters = runtime.extends_parameters
|
||
if not DaraCore.is_null(extends_parameters.headers):
|
||
extends_headers = extends_parameters.headers
|
||
if not DaraCore.is_null(extends_parameters.queries):
|
||
extends_queries = extends_parameters.queries
|
||
_request.headers = DaraCore.merge({
|
||
'date': Utils.get_date_utcstring(),
|
||
'host': self._endpoint,
|
||
'accept': 'application/json',
|
||
'x-acs-signature-nonce': Utils.get_nonce(),
|
||
'x-acs-signature-method': 'HMAC-SHA1',
|
||
'x-acs-signature-version': '1.0',
|
||
'x-acs-version': version,
|
||
'x-acs-action': action,
|
||
'user-agent': Utils.get_user_agent(self._user_agent),
|
||
}, global_headers, extends_headers, request.headers)
|
||
if not DaraCore.is_null(request.body):
|
||
_request.body = DaraCore.to_json_string(request.body)
|
||
_request.headers["content-type"] = 'application/json; charset=utf-8'
|
||
_request.query = DaraCore.merge({}, global_queries, extends_queries)
|
||
if not DaraCore.is_null(request.query):
|
||
_request.query = DaraCore.merge({}, _request.query, request.query)
|
||
if auth_type != 'Anonymous':
|
||
if DaraCore.is_null(self._credential):
|
||
raise main_exceptions.ClientException(
|
||
code = f'InvalidCredentials',
|
||
message = f'Please set up the credentials correctly. If you are setting them through environment variables, please ensure that ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET are set correctly. See https://help.aliyun.com/zh/sdk/developer-reference/configure-the-alibaba-cloud-accesskey-environment-variable-on-linux-macos-and-windows-systems for more details.'
|
||
)
|
||
credential_model = self._credential.get_credential()
|
||
if not DaraCore.is_null(credential_model.provider_name):
|
||
_request.headers["x-acs-credentials-provider"] = credential_model.provider_name
|
||
credential_type = credential_model.type
|
||
if credential_type == 'bearer':
|
||
bearer_token = credential_model.bearer_token
|
||
_request.headers["x-acs-bearer-token"] = bearer_token
|
||
_request.headers["x-acs-signature-type"] = 'BEARERTOKEN'
|
||
elif credential_type == 'id_token':
|
||
id_token = credential_model.security_token
|
||
_request.headers["x-acs-zero-trust-idtoken"] = id_token
|
||
else:
|
||
access_key_id = credential_model.access_key_id
|
||
access_key_secret = credential_model.access_key_secret
|
||
security_token = credential_model.security_token
|
||
if not DaraCore.is_null(security_token) and security_token != '':
|
||
_request.headers["x-acs-accesskey-id"] = access_key_id
|
||
_request.headers["x-acs-security-token"] = security_token
|
||
string_to_sign = Utils.get_string_to_sign(_request)
|
||
_request.headers["authorization"] = f'acs {access_key_id}:{Utils.get_roasignature(string_to_sign, access_key_secret)}'
|
||
|
||
_last_request = _request
|
||
_response = DaraCore.do_action(_request, _runtime)
|
||
_last_response = _response
|
||
if _response.status_code == 204:
|
||
return {
|
||
'headers': _response.headers
|
||
}
|
||
if (_response.status_code >= 400) and (_response.status_code < 600):
|
||
_res = DaraStream.read_as_json(_response.body)
|
||
err = _res
|
||
request_id = err.get("RequestId") or err.get("requestId")
|
||
request_id = request_id or err.get("requestid")
|
||
code = err.get("Code") or err.get("code")
|
||
if (f'{code}' == 'Throttling') or (f'{code}' == 'Throttling.User') or (f'{code}' == 'Throttling.Api'):
|
||
raise main_exceptions.ThrottlingException(
|
||
status_code = _response.status_code,
|
||
code = f'{code}',
|
||
message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
|
||
description = f'{err.get("Description") or err.get("description")}',
|
||
retry_after = Utils.get_throttling_time_left(_response.headers),
|
||
data = err,
|
||
request_id = f'{request_id}'
|
||
)
|
||
elif (_response.status_code >= 400) and (_response.status_code < 500):
|
||
raise main_exceptions.ClientException(
|
||
status_code = _response.status_code,
|
||
code = f'{code}',
|
||
message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
|
||
description = f'{err.get("Description") or err.get("description")}',
|
||
data = err,
|
||
access_denied_detail = self.get_access_denied_detail(err),
|
||
request_id = f'{request_id}'
|
||
)
|
||
else:
|
||
raise main_exceptions.ServerException(
|
||
status_code = _response.status_code,
|
||
code = f'{code}',
|
||
message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
|
||
description = f'{err.get("Description") or err.get("description")}',
|
||
data = err,
|
||
request_id = f'{request_id}'
|
||
)
|
||
|
||
if body_type == 'binary':
|
||
resp = {
|
||
'body': _response.body,
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
return resp
|
||
elif body_type == 'byte':
|
||
byt = DaraStream.read_as_bytes(_response.body)
|
||
return {
|
||
'body': byt,
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
elif body_type == 'string':
|
||
_str = DaraStream.read_as_string(_response.body)
|
||
return {
|
||
'body': _str,
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
elif body_type == 'json':
|
||
obj = DaraStream.read_as_json(_response.body)
|
||
res = obj
|
||
return {
|
||
'body': res,
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
elif body_type == 'array':
|
||
arr = DaraStream.read_as_json(_response.body)
|
||
return {
|
||
'body': arr,
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
else:
|
||
return {
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
|
||
except Exception as e:
|
||
_context = RetryPolicyContext(
|
||
retries_attempted= _retries_attempted,
|
||
http_request = _last_request,
|
||
http_response = _last_response,
|
||
exception = e
|
||
)
|
||
continue
|
||
raise UnretryableException(_context)
|
||
|
||
async def do_roarequest_async(
|
||
self,
|
||
action: str,
|
||
version: str,
|
||
protocol: str,
|
||
method: str,
|
||
auth_type: str,
|
||
pathname: str,
|
||
body_type: str,
|
||
request: open_api_util_models.OpenApiRequest,
|
||
runtime: RuntimeOptions,
|
||
) -> dict:
|
||
_runtime = {
|
||
'key': runtime.key or self._key,
|
||
'cert': runtime.cert or self._cert,
|
||
'ca': runtime.ca or self._ca,
|
||
'readTimeout': DaraCore.to_number(runtime.read_timeout or self._read_timeout),
|
||
'connectTimeout': DaraCore.to_number(runtime.connect_timeout or self._connect_timeout),
|
||
'httpProxy': runtime.http_proxy or self._http_proxy,
|
||
'httpsProxy': runtime.https_proxy or self._https_proxy,
|
||
'noProxy': runtime.no_proxy or self._no_proxy,
|
||
'socks5Proxy': runtime.socks_5proxy or self._socks_5proxy,
|
||
'socks5NetWork': runtime.socks_5net_work or self._socks_5net_work,
|
||
'maxIdleConns': DaraCore.to_number(runtime.max_idle_conns or self._max_idle_conns),
|
||
'retryOptions': self._retry_options,
|
||
'ignoreSSL': runtime.ignore_ssl,
|
||
'tlsMinVersion': self._tls_min_version,
|
||
}
|
||
_last_request = None
|
||
_last_response = None
|
||
_retries_attempted = 0
|
||
_context = RetryPolicyContext(
|
||
retries_attempted= _retries_attempted
|
||
)
|
||
while DaraCore.should_retry(_runtime.get('retryOptions'), _context):
|
||
if _retries_attempted > 0:
|
||
_backoff_time = DaraCore.get_backoff_time(_runtime.get('retryOptions'), _context)
|
||
if _backoff_time > 0:
|
||
DaraCore.sleep(_backoff_time)
|
||
_retries_attempted = _retries_attempted + 1
|
||
try:
|
||
_request = DaraRequest()
|
||
_request.protocol = self._protocol or protocol
|
||
_request.method = method
|
||
_request.pathname = pathname
|
||
global_queries = {}
|
||
global_headers = {}
|
||
if not DaraCore.is_null(self._global_parameters):
|
||
global_params = self._global_parameters
|
||
if not DaraCore.is_null(global_params.queries):
|
||
global_queries = global_params.queries
|
||
if not DaraCore.is_null(global_params.headers):
|
||
global_headers = global_params.headers
|
||
extends_headers = {}
|
||
extends_queries = {}
|
||
if not DaraCore.is_null(runtime.extends_parameters):
|
||
extends_parameters = runtime.extends_parameters
|
||
if not DaraCore.is_null(extends_parameters.headers):
|
||
extends_headers = extends_parameters.headers
|
||
if not DaraCore.is_null(extends_parameters.queries):
|
||
extends_queries = extends_parameters.queries
|
||
_request.headers = DaraCore.merge({
|
||
'date': Utils.get_date_utcstring(),
|
||
'host': self._endpoint,
|
||
'accept': 'application/json',
|
||
'x-acs-signature-nonce': Utils.get_nonce(),
|
||
'x-acs-signature-method': 'HMAC-SHA1',
|
||
'x-acs-signature-version': '1.0',
|
||
'x-acs-version': version,
|
||
'x-acs-action': action,
|
||
'user-agent': Utils.get_user_agent(self._user_agent),
|
||
}, global_headers, extends_headers, request.headers)
|
||
if not DaraCore.is_null(request.body):
|
||
_request.body = DaraCore.to_json_string(request.body)
|
||
_request.headers["content-type"] = 'application/json; charset=utf-8'
|
||
_request.query = DaraCore.merge({}, global_queries, extends_queries)
|
||
if not DaraCore.is_null(request.query):
|
||
_request.query = DaraCore.merge({}, _request.query, request.query)
|
||
if auth_type != 'Anonymous':
|
||
if DaraCore.is_null(self._credential):
|
||
raise main_exceptions.ClientException(
|
||
code = f'InvalidCredentials',
|
||
message = f'Please set up the credentials correctly. If you are setting them through environment variables, please ensure that ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET are set correctly. See https://help.aliyun.com/zh/sdk/developer-reference/configure-the-alibaba-cloud-accesskey-environment-variable-on-linux-macos-and-windows-systems for more details.'
|
||
)
|
||
credential_model = await self._credential.get_credential_async()
|
||
if not DaraCore.is_null(credential_model.provider_name):
|
||
_request.headers["x-acs-credentials-provider"] = credential_model.provider_name
|
||
credential_type = credential_model.type
|
||
if credential_type == 'bearer':
|
||
bearer_token = credential_model.bearer_token
|
||
_request.headers["x-acs-bearer-token"] = bearer_token
|
||
_request.headers["x-acs-signature-type"] = 'BEARERTOKEN'
|
||
elif credential_type == 'id_token':
|
||
id_token = credential_model.security_token
|
||
_request.headers["x-acs-zero-trust-idtoken"] = id_token
|
||
else:
|
||
access_key_id = credential_model.access_key_id
|
||
access_key_secret = credential_model.access_key_secret
|
||
security_token = credential_model.security_token
|
||
if not DaraCore.is_null(security_token) and security_token != '':
|
||
_request.headers["x-acs-accesskey-id"] = access_key_id
|
||
_request.headers["x-acs-security-token"] = security_token
|
||
string_to_sign = Utils.get_string_to_sign(_request)
|
||
_request.headers["authorization"] = f'acs {access_key_id}:{Utils.get_roasignature(string_to_sign, access_key_secret)}'
|
||
|
||
_last_request = _request
|
||
_response = await DaraCore.async_do_action(_request, _runtime)
|
||
_last_response = _response
|
||
if _response.status_code == 204:
|
||
return {
|
||
'headers': _response.headers
|
||
}
|
||
if (_response.status_code >= 400) and (_response.status_code < 600):
|
||
_res = await DaraStream.read_as_json_async(_response.body)
|
||
err = _res
|
||
request_id = err.get("RequestId") or err.get("requestId")
|
||
request_id = request_id or err.get("requestid")
|
||
code = err.get("Code") or err.get("code")
|
||
if (f'{code}' == 'Throttling') or (f'{code}' == 'Throttling.User') or (f'{code}' == 'Throttling.Api'):
|
||
raise main_exceptions.ThrottlingException(
|
||
status_code = _response.status_code,
|
||
code = f'{code}',
|
||
message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
|
||
description = f'{err.get("Description") or err.get("description")}',
|
||
retry_after = Utils.get_throttling_time_left(_response.headers),
|
||
data = err,
|
||
request_id = f'{request_id}'
|
||
)
|
||
elif (_response.status_code >= 400) and (_response.status_code < 500):
|
||
raise main_exceptions.ClientException(
|
||
status_code = _response.status_code,
|
||
code = f'{code}',
|
||
message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
|
||
description = f'{err.get("Description") or err.get("description")}',
|
||
data = err,
|
||
access_denied_detail = self.get_access_denied_detail(err),
|
||
request_id = f'{request_id}'
|
||
)
|
||
else:
|
||
raise main_exceptions.ServerException(
|
||
status_code = _response.status_code,
|
||
code = f'{code}',
|
||
message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
|
||
description = f'{err.get("Description") or err.get("description")}',
|
||
data = err,
|
||
request_id = f'{request_id}'
|
||
)
|
||
|
||
if body_type == 'binary':
|
||
resp = {
|
||
'body': _response.body,
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
return resp
|
||
elif body_type == 'byte':
|
||
byt = await DaraStream.read_as_bytes_async(_response.body)
|
||
return {
|
||
'body': byt,
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
elif body_type == 'string':
|
||
_str = await DaraStream.read_as_string_async(_response.body)
|
||
return {
|
||
'body': _str,
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
elif body_type == 'json':
|
||
obj = await DaraStream.read_as_json_async(_response.body)
|
||
res = obj
|
||
return {
|
||
'body': res,
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
elif body_type == 'array':
|
||
arr = await DaraStream.read_as_json_async(_response.body)
|
||
return {
|
||
'body': arr,
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
else:
|
||
return {
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
|
||
except Exception as e:
|
||
_context = RetryPolicyContext(
|
||
retries_attempted= _retries_attempted,
|
||
http_request = _last_request,
|
||
http_response = _last_response,
|
||
exception = e
|
||
)
|
||
continue
|
||
raise UnretryableException(_context)
|
||
|
||
"""
|
||
* @remarks
|
||
* Encapsulate the request and invoke the network with form body
|
||
*
|
||
* @param action - api name
|
||
* @param version - product version
|
||
* @param protocol - http or https
|
||
* @param method - e.g. GET
|
||
* @param authType - authorization type e.g. AK
|
||
* @param pathname - pathname of every api
|
||
* @param bodyType - response body type e.g. String
|
||
* @param request - object of OpenApiRequest
|
||
* @param runtime - which controls some details of call api, such as retry times
|
||
* @returns the response
|
||
"""
|
||
def do_roarequest_with_form(
|
||
self,
|
||
action: str,
|
||
version: str,
|
||
protocol: str,
|
||
method: str,
|
||
auth_type: str,
|
||
pathname: str,
|
||
body_type: str,
|
||
request: open_api_util_models.OpenApiRequest,
|
||
runtime: RuntimeOptions,
|
||
) -> dict:
|
||
_runtime = {
|
||
'key': runtime.key or self._key,
|
||
'cert': runtime.cert or self._cert,
|
||
'ca': runtime.ca or self._ca,
|
||
'readTimeout': DaraCore.to_number(runtime.read_timeout or self._read_timeout),
|
||
'connectTimeout': DaraCore.to_number(runtime.connect_timeout or self._connect_timeout),
|
||
'httpProxy': runtime.http_proxy or self._http_proxy,
|
||
'httpsProxy': runtime.https_proxy or self._https_proxy,
|
||
'noProxy': runtime.no_proxy or self._no_proxy,
|
||
'socks5Proxy': runtime.socks_5proxy or self._socks_5proxy,
|
||
'socks5NetWork': runtime.socks_5net_work or self._socks_5net_work,
|
||
'maxIdleConns': DaraCore.to_number(runtime.max_idle_conns or self._max_idle_conns),
|
||
'retryOptions': self._retry_options,
|
||
'ignoreSSL': runtime.ignore_ssl,
|
||
'tlsMinVersion': self._tls_min_version,
|
||
}
|
||
_last_request = None
|
||
_last_response = None
|
||
_retries_attempted = 0
|
||
_context = RetryPolicyContext(
|
||
retries_attempted= _retries_attempted
|
||
)
|
||
while DaraCore.should_retry(_runtime.get('retryOptions'), _context):
|
||
if _retries_attempted > 0:
|
||
_backoff_time = DaraCore.get_backoff_time(_runtime.get('retryOptions'), _context)
|
||
if _backoff_time > 0:
|
||
DaraCore.sleep(_backoff_time)
|
||
_retries_attempted = _retries_attempted + 1
|
||
try:
|
||
_request = DaraRequest()
|
||
_request.protocol = self._protocol or protocol
|
||
_request.method = method
|
||
_request.pathname = pathname
|
||
global_queries = {}
|
||
global_headers = {}
|
||
if not DaraCore.is_null(self._global_parameters):
|
||
global_params = self._global_parameters
|
||
if not DaraCore.is_null(global_params.queries):
|
||
global_queries = global_params.queries
|
||
if not DaraCore.is_null(global_params.headers):
|
||
global_headers = global_params.headers
|
||
extends_headers = {}
|
||
extends_queries = {}
|
||
if not DaraCore.is_null(runtime.extends_parameters):
|
||
extends_parameters = runtime.extends_parameters
|
||
if not DaraCore.is_null(extends_parameters.headers):
|
||
extends_headers = extends_parameters.headers
|
||
if not DaraCore.is_null(extends_parameters.queries):
|
||
extends_queries = extends_parameters.queries
|
||
_request.headers = DaraCore.merge({
|
||
'date': Utils.get_date_utcstring(),
|
||
'host': self._endpoint,
|
||
'accept': 'application/json',
|
||
'x-acs-signature-nonce': Utils.get_nonce(),
|
||
'x-acs-signature-method': 'HMAC-SHA1',
|
||
'x-acs-signature-version': '1.0',
|
||
'x-acs-version': version,
|
||
'x-acs-action': action,
|
||
'user-agent': Utils.get_user_agent(self._user_agent),
|
||
}, global_headers, extends_headers, request.headers)
|
||
if not DaraCore.is_null(request.body):
|
||
m = request.body
|
||
_request.body = Utils.to_form(m)
|
||
_request.headers["content-type"] = 'application/x-www-form-urlencoded'
|
||
_request.query = DaraCore.merge({}, global_queries, extends_queries)
|
||
if not DaraCore.is_null(request.query):
|
||
_request.query = DaraCore.merge({}, _request.query, request.query)
|
||
if auth_type != 'Anonymous':
|
||
if DaraCore.is_null(self._credential):
|
||
raise main_exceptions.ClientException(
|
||
code = f'InvalidCredentials',
|
||
message = f'Please set up the credentials correctly. If you are setting them through environment variables, please ensure that ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET are set correctly. See https://help.aliyun.com/zh/sdk/developer-reference/configure-the-alibaba-cloud-accesskey-environment-variable-on-linux-macos-and-windows-systems for more details.'
|
||
)
|
||
credential_model = self._credential.get_credential()
|
||
if not DaraCore.is_null(credential_model.provider_name):
|
||
_request.headers["x-acs-credentials-provider"] = credential_model.provider_name
|
||
credential_type = credential_model.type
|
||
if credential_type == 'bearer':
|
||
bearer_token = credential_model.bearer_token
|
||
_request.headers["x-acs-bearer-token"] = bearer_token
|
||
_request.headers["x-acs-signature-type"] = 'BEARERTOKEN'
|
||
elif credential_type == 'id_token':
|
||
id_token = credential_model.security_token
|
||
_request.headers["x-acs-zero-trust-idtoken"] = id_token
|
||
else:
|
||
access_key_id = credential_model.access_key_id
|
||
access_key_secret = credential_model.access_key_secret
|
||
security_token = credential_model.security_token
|
||
if not DaraCore.is_null(security_token) and security_token != '':
|
||
_request.headers["x-acs-accesskey-id"] = access_key_id
|
||
_request.headers["x-acs-security-token"] = security_token
|
||
string_to_sign = Utils.get_string_to_sign(_request)
|
||
_request.headers["authorization"] = f'acs {access_key_id}:{Utils.get_roasignature(string_to_sign, access_key_secret)}'
|
||
|
||
_last_request = _request
|
||
_response = DaraCore.do_action(_request, _runtime)
|
||
_last_response = _response
|
||
if _response.status_code == 204:
|
||
return {
|
||
'headers': _response.headers
|
||
}
|
||
if (_response.status_code >= 400) and (_response.status_code < 600):
|
||
_res = DaraStream.read_as_json(_response.body)
|
||
err = _res
|
||
request_id = err.get("RequestId") or err.get("requestId")
|
||
code = err.get("Code") or err.get("code")
|
||
if (f'{code}' == 'Throttling') or (f'{code}' == 'Throttling.User') or (f'{code}' == 'Throttling.Api'):
|
||
raise main_exceptions.ThrottlingException(
|
||
status_code = _response.status_code,
|
||
code = f'{code}',
|
||
message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
|
||
description = f'{err.get("Description") or err.get("description")}',
|
||
retry_after = Utils.get_throttling_time_left(_response.headers),
|
||
data = err,
|
||
request_id = f'{request_id}'
|
||
)
|
||
elif (_response.status_code >= 400) and (_response.status_code < 500):
|
||
raise main_exceptions.ClientException(
|
||
status_code = _response.status_code,
|
||
code = f'{code}',
|
||
message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
|
||
description = f'{err.get("Description") or err.get("description")}',
|
||
data = err,
|
||
access_denied_detail = self.get_access_denied_detail(err),
|
||
request_id = f'{request_id}'
|
||
)
|
||
else:
|
||
raise main_exceptions.ServerException(
|
||
status_code = _response.status_code,
|
||
code = f'{code}',
|
||
message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
|
||
description = f'{err.get("Description") or err.get("description")}',
|
||
data = err,
|
||
request_id = f'{request_id}'
|
||
)
|
||
|
||
if body_type == 'binary':
|
||
resp = {
|
||
'body': _response.body,
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
return resp
|
||
elif body_type == 'byte':
|
||
byt = DaraStream.read_as_bytes(_response.body)
|
||
return {
|
||
'body': byt,
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
elif body_type == 'string':
|
||
_str = DaraStream.read_as_string(_response.body)
|
||
return {
|
||
'body': _str,
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
elif body_type == 'json':
|
||
obj = DaraStream.read_as_json(_response.body)
|
||
res = obj
|
||
return {
|
||
'body': res,
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
elif body_type == 'array':
|
||
arr = DaraStream.read_as_json(_response.body)
|
||
return {
|
||
'body': arr,
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
else:
|
||
return {
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
|
||
except Exception as e:
|
||
_context = RetryPolicyContext(
|
||
retries_attempted= _retries_attempted,
|
||
http_request = _last_request,
|
||
http_response = _last_response,
|
||
exception = e
|
||
)
|
||
continue
|
||
raise UnretryableException(_context)
|
||
|
||
async def do_roarequest_with_form_async(
|
||
self,
|
||
action: str,
|
||
version: str,
|
||
protocol: str,
|
||
method: str,
|
||
auth_type: str,
|
||
pathname: str,
|
||
body_type: str,
|
||
request: open_api_util_models.OpenApiRequest,
|
||
runtime: RuntimeOptions,
|
||
) -> dict:
|
||
_runtime = {
|
||
'key': runtime.key or self._key,
|
||
'cert': runtime.cert or self._cert,
|
||
'ca': runtime.ca or self._ca,
|
||
'readTimeout': DaraCore.to_number(runtime.read_timeout or self._read_timeout),
|
||
'connectTimeout': DaraCore.to_number(runtime.connect_timeout or self._connect_timeout),
|
||
'httpProxy': runtime.http_proxy or self._http_proxy,
|
||
'httpsProxy': runtime.https_proxy or self._https_proxy,
|
||
'noProxy': runtime.no_proxy or self._no_proxy,
|
||
'socks5Proxy': runtime.socks_5proxy or self._socks_5proxy,
|
||
'socks5NetWork': runtime.socks_5net_work or self._socks_5net_work,
|
||
'maxIdleConns': DaraCore.to_number(runtime.max_idle_conns or self._max_idle_conns),
|
||
'retryOptions': self._retry_options,
|
||
'ignoreSSL': runtime.ignore_ssl,
|
||
'tlsMinVersion': self._tls_min_version,
|
||
}
|
||
_last_request = None
|
||
_last_response = None
|
||
_retries_attempted = 0
|
||
_context = RetryPolicyContext(
|
||
retries_attempted= _retries_attempted
|
||
)
|
||
while DaraCore.should_retry(_runtime.get('retryOptions'), _context):
|
||
if _retries_attempted > 0:
|
||
_backoff_time = DaraCore.get_backoff_time(_runtime.get('retryOptions'), _context)
|
||
if _backoff_time > 0:
|
||
DaraCore.sleep(_backoff_time)
|
||
_retries_attempted = _retries_attempted + 1
|
||
try:
|
||
_request = DaraRequest()
|
||
_request.protocol = self._protocol or protocol
|
||
_request.method = method
|
||
_request.pathname = pathname
|
||
global_queries = {}
|
||
global_headers = {}
|
||
if not DaraCore.is_null(self._global_parameters):
|
||
global_params = self._global_parameters
|
||
if not DaraCore.is_null(global_params.queries):
|
||
global_queries = global_params.queries
|
||
if not DaraCore.is_null(global_params.headers):
|
||
global_headers = global_params.headers
|
||
extends_headers = {}
|
||
extends_queries = {}
|
||
if not DaraCore.is_null(runtime.extends_parameters):
|
||
extends_parameters = runtime.extends_parameters
|
||
if not DaraCore.is_null(extends_parameters.headers):
|
||
extends_headers = extends_parameters.headers
|
||
if not DaraCore.is_null(extends_parameters.queries):
|
||
extends_queries = extends_parameters.queries
|
||
_request.headers = DaraCore.merge({
|
||
'date': Utils.get_date_utcstring(),
|
||
'host': self._endpoint,
|
||
'accept': 'application/json',
|
||
'x-acs-signature-nonce': Utils.get_nonce(),
|
||
'x-acs-signature-method': 'HMAC-SHA1',
|
||
'x-acs-signature-version': '1.0',
|
||
'x-acs-version': version,
|
||
'x-acs-action': action,
|
||
'user-agent': Utils.get_user_agent(self._user_agent),
|
||
}, global_headers, extends_headers, request.headers)
|
||
if not DaraCore.is_null(request.body):
|
||
m = request.body
|
||
_request.body = Utils.to_form(m)
|
||
_request.headers["content-type"] = 'application/x-www-form-urlencoded'
|
||
_request.query = DaraCore.merge({}, global_queries, extends_queries)
|
||
if not DaraCore.is_null(request.query):
|
||
_request.query = DaraCore.merge({}, _request.query, request.query)
|
||
if auth_type != 'Anonymous':
|
||
if DaraCore.is_null(self._credential):
|
||
raise main_exceptions.ClientException(
|
||
code = f'InvalidCredentials',
|
||
message = f'Please set up the credentials correctly. If you are setting them through environment variables, please ensure that ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET are set correctly. See https://help.aliyun.com/zh/sdk/developer-reference/configure-the-alibaba-cloud-accesskey-environment-variable-on-linux-macos-and-windows-systems for more details.'
|
||
)
|
||
credential_model = await self._credential.get_credential_async()
|
||
if not DaraCore.is_null(credential_model.provider_name):
|
||
_request.headers["x-acs-credentials-provider"] = credential_model.provider_name
|
||
credential_type = credential_model.type
|
||
if credential_type == 'bearer':
|
||
bearer_token = credential_model.bearer_token
|
||
_request.headers["x-acs-bearer-token"] = bearer_token
|
||
_request.headers["x-acs-signature-type"] = 'BEARERTOKEN'
|
||
elif credential_type == 'id_token':
|
||
id_token = credential_model.security_token
|
||
_request.headers["x-acs-zero-trust-idtoken"] = id_token
|
||
else:
|
||
access_key_id = credential_model.access_key_id
|
||
access_key_secret = credential_model.access_key_secret
|
||
security_token = credential_model.security_token
|
||
if not DaraCore.is_null(security_token) and security_token != '':
|
||
_request.headers["x-acs-accesskey-id"] = access_key_id
|
||
_request.headers["x-acs-security-token"] = security_token
|
||
string_to_sign = Utils.get_string_to_sign(_request)
|
||
_request.headers["authorization"] = f'acs {access_key_id}:{Utils.get_roasignature(string_to_sign, access_key_secret)}'
|
||
|
||
_last_request = _request
|
||
_response = await DaraCore.async_do_action(_request, _runtime)
|
||
_last_response = _response
|
||
if _response.status_code == 204:
|
||
return {
|
||
'headers': _response.headers
|
||
}
|
||
if (_response.status_code >= 400) and (_response.status_code < 600):
|
||
_res = await DaraStream.read_as_json_async(_response.body)
|
||
err = _res
|
||
request_id = err.get("RequestId") or err.get("requestId")
|
||
code = err.get("Code") or err.get("code")
|
||
if (f'{code}' == 'Throttling') or (f'{code}' == 'Throttling.User') or (f'{code}' == 'Throttling.Api'):
|
||
raise main_exceptions.ThrottlingException(
|
||
status_code = _response.status_code,
|
||
code = f'{code}',
|
||
message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
|
||
description = f'{err.get("Description") or err.get("description")}',
|
||
retry_after = Utils.get_throttling_time_left(_response.headers),
|
||
data = err,
|
||
request_id = f'{request_id}'
|
||
)
|
||
elif (_response.status_code >= 400) and (_response.status_code < 500):
|
||
raise main_exceptions.ClientException(
|
||
status_code = _response.status_code,
|
||
code = f'{code}',
|
||
message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
|
||
description = f'{err.get("Description") or err.get("description")}',
|
||
data = err,
|
||
access_denied_detail = self.get_access_denied_detail(err),
|
||
request_id = f'{request_id}'
|
||
)
|
||
else:
|
||
raise main_exceptions.ServerException(
|
||
status_code = _response.status_code,
|
||
code = f'{code}',
|
||
message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
|
||
description = f'{err.get("Description") or err.get("description")}',
|
||
data = err,
|
||
request_id = f'{request_id}'
|
||
)
|
||
|
||
if body_type == 'binary':
|
||
resp = {
|
||
'body': _response.body,
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
return resp
|
||
elif body_type == 'byte':
|
||
byt = await DaraStream.read_as_bytes_async(_response.body)
|
||
return {
|
||
'body': byt,
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
elif body_type == 'string':
|
||
_str = await DaraStream.read_as_string_async(_response.body)
|
||
return {
|
||
'body': _str,
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
elif body_type == 'json':
|
||
obj = await DaraStream.read_as_json_async(_response.body)
|
||
res = obj
|
||
return {
|
||
'body': res,
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
elif body_type == 'array':
|
||
arr = await DaraStream.read_as_json_async(_response.body)
|
||
return {
|
||
'body': arr,
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
else:
|
||
return {
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
|
||
except Exception as e:
|
||
_context = RetryPolicyContext(
|
||
retries_attempted= _retries_attempted,
|
||
http_request = _last_request,
|
||
http_response = _last_response,
|
||
exception = e
|
||
)
|
||
continue
|
||
raise UnretryableException(_context)
|
||
|
||
"""
|
||
* @remarks
|
||
* Encapsulate the request and invoke the network
|
||
*
|
||
* @param action - api name
|
||
* @param version - product version
|
||
* @param protocol - http or https
|
||
* @param method - e.g. GET
|
||
* @param authType - authorization type e.g. AK
|
||
* @param bodyType - response body type e.g. String
|
||
* @param request - object of OpenApiRequest
|
||
* @param runtime - which controls some details of call api, such as retry times
|
||
* @returns the response
|
||
"""
|
||
def do_request(
|
||
self,
|
||
params: open_api_util_models.Params,
|
||
request: open_api_util_models.OpenApiRequest,
|
||
runtime: RuntimeOptions,
|
||
) -> dict:
|
||
_runtime = {
|
||
'key': runtime.key or self._key,
|
||
'cert': runtime.cert or self._cert,
|
||
'ca': runtime.ca or self._ca,
|
||
'readTimeout': DaraCore.to_number(runtime.read_timeout or self._read_timeout),
|
||
'connectTimeout': DaraCore.to_number(runtime.connect_timeout or self._connect_timeout),
|
||
'httpProxy': runtime.http_proxy or self._http_proxy,
|
||
'httpsProxy': runtime.https_proxy or self._https_proxy,
|
||
'noProxy': runtime.no_proxy or self._no_proxy,
|
||
'socks5Proxy': runtime.socks_5proxy or self._socks_5proxy,
|
||
'socks5NetWork': runtime.socks_5net_work or self._socks_5net_work,
|
||
'maxIdleConns': DaraCore.to_number(runtime.max_idle_conns or self._max_idle_conns),
|
||
'retryOptions': self._retry_options,
|
||
'ignoreSSL': runtime.ignore_ssl,
|
||
'tlsMinVersion': self._tls_min_version,
|
||
}
|
||
_last_request = None
|
||
_last_response = None
|
||
_retries_attempted = 0
|
||
_context = RetryPolicyContext(
|
||
retries_attempted= _retries_attempted
|
||
)
|
||
while DaraCore.should_retry(_runtime.get('retryOptions'), _context):
|
||
if _retries_attempted > 0:
|
||
_backoff_time = DaraCore.get_backoff_time(_runtime.get('retryOptions'), _context)
|
||
if _backoff_time > 0:
|
||
DaraCore.sleep(_backoff_time)
|
||
_retries_attempted = _retries_attempted + 1
|
||
try:
|
||
_request = DaraRequest()
|
||
_request.protocol = self._protocol or params.protocol
|
||
_request.method = params.method
|
||
_request.pathname = params.pathname
|
||
global_queries = {}
|
||
global_headers = {}
|
||
if not DaraCore.is_null(self._global_parameters):
|
||
global_params = self._global_parameters
|
||
if not DaraCore.is_null(global_params.queries):
|
||
global_queries = global_params.queries
|
||
if not DaraCore.is_null(global_params.headers):
|
||
global_headers = global_params.headers
|
||
extends_headers = {}
|
||
extends_queries = {}
|
||
if not DaraCore.is_null(runtime.extends_parameters):
|
||
extends_parameters = runtime.extends_parameters
|
||
if not DaraCore.is_null(extends_parameters.headers):
|
||
extends_headers = extends_parameters.headers
|
||
if not DaraCore.is_null(extends_parameters.queries):
|
||
extends_queries = extends_parameters.queries
|
||
_request.query = DaraCore.merge({}, global_queries, extends_queries, request.query)
|
||
# endpoint is setted in product client
|
||
_request.headers = DaraCore.merge({
|
||
'host': self._endpoint,
|
||
'x-acs-version': params.version,
|
||
'x-acs-action': params.action,
|
||
'user-agent': Utils.get_user_agent(self._user_agent),
|
||
'x-acs-date': Utils.get_timestamp(),
|
||
'x-acs-signature-nonce': Utils.get_nonce(),
|
||
'accept': 'application/json',
|
||
}, global_headers, extends_headers, request.headers)
|
||
if params.style == 'RPC':
|
||
headers = self.get_rpc_headers()
|
||
if not DaraCore.is_null(headers):
|
||
_request.headers = DaraCore.merge({}, _request.headers, headers)
|
||
signature_algorithm = self._signature_algorithm or 'ACS3-HMAC-SHA256'
|
||
hashed_request_payload = Utils.hash(DaraBytes.from_('', 'utf-8'), signature_algorithm)
|
||
if not DaraCore.is_null(request.stream):
|
||
tmp = DaraStream.read_as_bytes(request.stream)
|
||
hashed_request_payload = Utils.hash(tmp, signature_algorithm)
|
||
_request.body = tmp
|
||
_request.headers["content-type"] = 'application/octet-stream'
|
||
else:
|
||
if not DaraCore.is_null(request.body):
|
||
if params.req_body_type == 'byte':
|
||
byte_obj = bytes(request.body)
|
||
hashed_request_payload = Utils.hash(byte_obj, signature_algorithm)
|
||
_request.body = byte_obj
|
||
elif params.req_body_type == 'json':
|
||
json_obj = DaraCore.to_json_string(request.body)
|
||
hashed_request_payload = Utils.hash(json_obj.encode('utf-8'), signature_algorithm)
|
||
_request.body = json_obj
|
||
_request.headers["content-type"] = 'application/json; charset=utf-8'
|
||
else:
|
||
m = request.body
|
||
form_obj = Utils.to_form(m)
|
||
hashed_request_payload = Utils.hash(form_obj.encode('utf-8'), signature_algorithm)
|
||
_request.body = form_obj
|
||
_request.headers["content-type"] = 'application/x-www-form-urlencoded'
|
||
|
||
|
||
_request.headers["x-acs-content-sha256"] = hashed_request_payload.hex()
|
||
if params.auth_type != 'Anonymous':
|
||
if DaraCore.is_null(self._credential):
|
||
raise main_exceptions.ClientException(
|
||
code = f'InvalidCredentials',
|
||
message = f'Please set up the credentials correctly. If you are setting them through environment variables, please ensure that ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET are set correctly. See https://help.aliyun.com/zh/sdk/developer-reference/configure-the-alibaba-cloud-accesskey-environment-variable-on-linux-macos-and-windows-systems for more details.'
|
||
)
|
||
credential_model = self._credential.get_credential()
|
||
if not DaraCore.is_null(credential_model.provider_name):
|
||
_request.headers["x-acs-credentials-provider"] = credential_model.provider_name
|
||
auth_type = credential_model.type
|
||
if auth_type == 'bearer':
|
||
bearer_token = credential_model.bearer_token
|
||
_request.headers["x-acs-bearer-token"] = bearer_token
|
||
if params.style == 'RPC':
|
||
_request.query["SignatureType"] = 'BEARERTOKEN'
|
||
else:
|
||
_request.headers["x-acs-signature-type"] = 'BEARERTOKEN'
|
||
|
||
elif auth_type == 'id_token':
|
||
id_token = credential_model.security_token
|
||
_request.headers["x-acs-zero-trust-idtoken"] = id_token
|
||
else:
|
||
access_key_id = credential_model.access_key_id
|
||
access_key_secret = credential_model.access_key_secret
|
||
security_token = credential_model.security_token
|
||
if not DaraCore.is_null(security_token) and security_token != '':
|
||
_request.headers["x-acs-accesskey-id"] = access_key_id
|
||
_request.headers["x-acs-security-token"] = security_token
|
||
_request.headers["Authorization"] = Utils.get_authorization(_request, signature_algorithm, hashed_request_payload.hex(), access_key_id, access_key_secret)
|
||
|
||
_last_request = _request
|
||
_response = DaraCore.do_action(_request, _runtime)
|
||
_last_response = _response
|
||
if (_response.status_code >= 400) and (_response.status_code < 600):
|
||
err = {}
|
||
if not DaraCore.is_null(_response.headers.get("content-type")) and _response.headers.get("content-type") == 'text/xml;charset=utf-8':
|
||
_str = DaraStream.read_as_string(_response.body)
|
||
resp_map = DaraXML.parse_xml(_str, None)
|
||
err = resp_map.get("Error")
|
||
else:
|
||
_res = DaraStream.read_as_json(_response.body)
|
||
err = _res
|
||
|
||
request_id = err.get("RequestId") or err.get("requestId")
|
||
code = err.get("Code") or err.get("code")
|
||
if (f'{code}' == 'Throttling') or (f'{code}' == 'Throttling.User') or (f'{code}' == 'Throttling.Api'):
|
||
raise main_exceptions.ThrottlingException(
|
||
status_code = _response.status_code,
|
||
code = f'{code}',
|
||
message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
|
||
description = f'{err.get("Description") or err.get("description")}',
|
||
retry_after = Utils.get_throttling_time_left(_response.headers),
|
||
data = err,
|
||
request_id = f'{request_id}'
|
||
)
|
||
elif (_response.status_code >= 400) and (_response.status_code < 500):
|
||
raise main_exceptions.ClientException(
|
||
status_code = _response.status_code,
|
||
code = f'{code}',
|
||
message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
|
||
description = f'{err.get("Description") or err.get("description")}',
|
||
data = err,
|
||
access_denied_detail = self.get_access_denied_detail(err),
|
||
request_id = f'{request_id}'
|
||
)
|
||
else:
|
||
raise main_exceptions.ServerException(
|
||
status_code = _response.status_code,
|
||
code = f'{code}',
|
||
message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
|
||
description = f'{err.get("Description") or err.get("description")}',
|
||
data = err,
|
||
request_id = f'{request_id}'
|
||
)
|
||
|
||
if params.body_type == 'binary':
|
||
resp = {
|
||
'body': _response.body,
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
return resp
|
||
elif params.body_type == 'byte':
|
||
byt = DaraStream.read_as_bytes(_response.body)
|
||
return {
|
||
'body': byt,
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
elif params.body_type == 'string':
|
||
resp_str = DaraStream.read_as_string(_response.body)
|
||
return {
|
||
'body': resp_str,
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
elif params.body_type == 'json':
|
||
obj = DaraStream.read_as_json(_response.body)
|
||
res = obj
|
||
return {
|
||
'body': res,
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
elif params.body_type == 'array':
|
||
arr = DaraStream.read_as_json(_response.body)
|
||
return {
|
||
'body': arr,
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
else:
|
||
anything = DaraStream.read_as_string(_response.body)
|
||
return {
|
||
'body': anything,
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
|
||
except Exception as e:
|
||
_context = RetryPolicyContext(
|
||
retries_attempted= _retries_attempted,
|
||
http_request = _last_request,
|
||
http_response = _last_response,
|
||
exception = e
|
||
)
|
||
continue
|
||
raise UnretryableException(_context)
|
||
|
||
async def do_request_async(
|
||
self,
|
||
params: open_api_util_models.Params,
|
||
request: open_api_util_models.OpenApiRequest,
|
||
runtime: RuntimeOptions,
|
||
) -> dict:
|
||
_runtime = {
|
||
'key': runtime.key or self._key,
|
||
'cert': runtime.cert or self._cert,
|
||
'ca': runtime.ca or self._ca,
|
||
'readTimeout': DaraCore.to_number(runtime.read_timeout or self._read_timeout),
|
||
'connectTimeout': DaraCore.to_number(runtime.connect_timeout or self._connect_timeout),
|
||
'httpProxy': runtime.http_proxy or self._http_proxy,
|
||
'httpsProxy': runtime.https_proxy or self._https_proxy,
|
||
'noProxy': runtime.no_proxy or self._no_proxy,
|
||
'socks5Proxy': runtime.socks_5proxy or self._socks_5proxy,
|
||
'socks5NetWork': runtime.socks_5net_work or self._socks_5net_work,
|
||
'maxIdleConns': DaraCore.to_number(runtime.max_idle_conns or self._max_idle_conns),
|
||
'retryOptions': self._retry_options,
|
||
'ignoreSSL': runtime.ignore_ssl,
|
||
'tlsMinVersion': self._tls_min_version,
|
||
}
|
||
_last_request = None
|
||
_last_response = None
|
||
_retries_attempted = 0
|
||
_context = RetryPolicyContext(
|
||
retries_attempted= _retries_attempted
|
||
)
|
||
while DaraCore.should_retry(_runtime.get('retryOptions'), _context):
|
||
if _retries_attempted > 0:
|
||
_backoff_time = DaraCore.get_backoff_time(_runtime.get('retryOptions'), _context)
|
||
if _backoff_time > 0:
|
||
DaraCore.sleep(_backoff_time)
|
||
_retries_attempted = _retries_attempted + 1
|
||
try:
|
||
_request = DaraRequest()
|
||
_request.protocol = self._protocol or params.protocol
|
||
_request.method = params.method
|
||
_request.pathname = params.pathname
|
||
global_queries = {}
|
||
global_headers = {}
|
||
if not DaraCore.is_null(self._global_parameters):
|
||
global_params = self._global_parameters
|
||
if not DaraCore.is_null(global_params.queries):
|
||
global_queries = global_params.queries
|
||
if not DaraCore.is_null(global_params.headers):
|
||
global_headers = global_params.headers
|
||
extends_headers = {}
|
||
extends_queries = {}
|
||
if not DaraCore.is_null(runtime.extends_parameters):
|
||
extends_parameters = runtime.extends_parameters
|
||
if not DaraCore.is_null(extends_parameters.headers):
|
||
extends_headers = extends_parameters.headers
|
||
if not DaraCore.is_null(extends_parameters.queries):
|
||
extends_queries = extends_parameters.queries
|
||
_request.query = DaraCore.merge({}, global_queries, extends_queries, request.query)
|
||
# endpoint is setted in product client
|
||
_request.headers = DaraCore.merge({
|
||
'host': self._endpoint,
|
||
'x-acs-version': params.version,
|
||
'x-acs-action': params.action,
|
||
'user-agent': Utils.get_user_agent(self._user_agent),
|
||
'x-acs-date': Utils.get_timestamp(),
|
||
'x-acs-signature-nonce': Utils.get_nonce(),
|
||
'accept': 'application/json',
|
||
}, global_headers, extends_headers, request.headers)
|
||
if params.style == 'RPC':
|
||
headers = self.get_rpc_headers()
|
||
if not DaraCore.is_null(headers):
|
||
_request.headers = DaraCore.merge({}, _request.headers, headers)
|
||
signature_algorithm = self._signature_algorithm or 'ACS3-HMAC-SHA256'
|
||
hashed_request_payload = Utils.hash(DaraBytes.from_('', 'utf-8'), signature_algorithm)
|
||
if not DaraCore.is_null(request.stream):
|
||
tmp = await DaraStream.read_as_bytes_async(request.stream)
|
||
hashed_request_payload = Utils.hash(tmp, signature_algorithm)
|
||
_request.body = tmp
|
||
_request.headers["content-type"] = 'application/octet-stream'
|
||
else:
|
||
if not DaraCore.is_null(request.body):
|
||
if params.req_body_type == 'byte':
|
||
byte_obj = bytes(request.body)
|
||
hashed_request_payload = Utils.hash(byte_obj, signature_algorithm)
|
||
_request.body = byte_obj
|
||
elif params.req_body_type == 'json':
|
||
json_obj = DaraCore.to_json_string(request.body)
|
||
hashed_request_payload = Utils.hash(json_obj.encode('utf-8'), signature_algorithm)
|
||
_request.body = json_obj
|
||
_request.headers["content-type"] = 'application/json; charset=utf-8'
|
||
else:
|
||
m = request.body
|
||
form_obj = Utils.to_form(m)
|
||
hashed_request_payload = Utils.hash(form_obj.encode('utf-8'), signature_algorithm)
|
||
_request.body = form_obj
|
||
_request.headers["content-type"] = 'application/x-www-form-urlencoded'
|
||
|
||
|
||
_request.headers["x-acs-content-sha256"] = hashed_request_payload.hex()
|
||
if params.auth_type != 'Anonymous':
|
||
if DaraCore.is_null(self._credential):
|
||
raise main_exceptions.ClientException(
|
||
code = f'InvalidCredentials',
|
||
message = f'Please set up the credentials correctly. If you are setting them through environment variables, please ensure that ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET are set correctly. See https://help.aliyun.com/zh/sdk/developer-reference/configure-the-alibaba-cloud-accesskey-environment-variable-on-linux-macos-and-windows-systems for more details.'
|
||
)
|
||
credential_model = await self._credential.get_credential_async()
|
||
if not DaraCore.is_null(credential_model.provider_name):
|
||
_request.headers["x-acs-credentials-provider"] = credential_model.provider_name
|
||
auth_type = credential_model.type
|
||
if auth_type == 'bearer':
|
||
bearer_token = credential_model.bearer_token
|
||
_request.headers["x-acs-bearer-token"] = bearer_token
|
||
if params.style == 'RPC':
|
||
_request.query["SignatureType"] = 'BEARERTOKEN'
|
||
else:
|
||
_request.headers["x-acs-signature-type"] = 'BEARERTOKEN'
|
||
|
||
elif auth_type == 'id_token':
|
||
id_token = credential_model.security_token
|
||
_request.headers["x-acs-zero-trust-idtoken"] = id_token
|
||
else:
|
||
access_key_id = credential_model.access_key_id
|
||
access_key_secret = credential_model.access_key_secret
|
||
security_token = credential_model.security_token
|
||
if not DaraCore.is_null(security_token) and security_token != '':
|
||
_request.headers["x-acs-accesskey-id"] = access_key_id
|
||
_request.headers["x-acs-security-token"] = security_token
|
||
_request.headers["Authorization"] = Utils.get_authorization(_request, signature_algorithm, hashed_request_payload.hex(), access_key_id, access_key_secret)
|
||
|
||
_last_request = _request
|
||
_response = await DaraCore.async_do_action(_request, _runtime)
|
||
_last_response = _response
|
||
if (_response.status_code >= 400) and (_response.status_code < 600):
|
||
err = {}
|
||
if not DaraCore.is_null(_response.headers.get("content-type")) and _response.headers.get("content-type") == 'text/xml;charset=utf-8':
|
||
_str = await DaraStream.read_as_string_async(_response.body)
|
||
resp_map = DaraXML.parse_xml(_str, None)
|
||
err = resp_map.get("Error")
|
||
else:
|
||
_res = await DaraStream.read_as_json_async(_response.body)
|
||
err = _res
|
||
|
||
request_id = err.get("RequestId") or err.get("requestId")
|
||
code = err.get("Code") or err.get("code")
|
||
if (f'{code}' == 'Throttling') or (f'{code}' == 'Throttling.User') or (f'{code}' == 'Throttling.Api'):
|
||
raise main_exceptions.ThrottlingException(
|
||
status_code = _response.status_code,
|
||
code = f'{code}',
|
||
message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
|
||
description = f'{err.get("Description") or err.get("description")}',
|
||
retry_after = Utils.get_throttling_time_left(_response.headers),
|
||
data = err,
|
||
request_id = f'{request_id}'
|
||
)
|
||
elif (_response.status_code >= 400) and (_response.status_code < 500):
|
||
raise main_exceptions.ClientException(
|
||
status_code = _response.status_code,
|
||
code = f'{code}',
|
||
message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
|
||
description = f'{err.get("Description") or err.get("description")}',
|
||
data = err,
|
||
access_denied_detail = self.get_access_denied_detail(err),
|
||
request_id = f'{request_id}'
|
||
)
|
||
else:
|
||
raise main_exceptions.ServerException(
|
||
status_code = _response.status_code,
|
||
code = f'{code}',
|
||
message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
|
||
description = f'{err.get("Description") or err.get("description")}',
|
||
data = err,
|
||
request_id = f'{request_id}'
|
||
)
|
||
|
||
if params.body_type == 'binary':
|
||
resp = {
|
||
'body': _response.body,
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
return resp
|
||
elif params.body_type == 'byte':
|
||
byt = await DaraStream.read_as_bytes_async(_response.body)
|
||
return {
|
||
'body': byt,
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
elif params.body_type == 'string':
|
||
resp_str = await DaraStream.read_as_string_async(_response.body)
|
||
return {
|
||
'body': resp_str,
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
elif params.body_type == 'json':
|
||
obj = await DaraStream.read_as_json_async(_response.body)
|
||
res = obj
|
||
return {
|
||
'body': res,
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
elif params.body_type == 'array':
|
||
arr = await DaraStream.read_as_json_async(_response.body)
|
||
return {
|
||
'body': arr,
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
else:
|
||
anything = await DaraStream.read_as_string_async(_response.body)
|
||
return {
|
||
'body': anything,
|
||
'headers': _response.headers,
|
||
'statusCode': _response.status_code
|
||
}
|
||
|
||
except Exception as e:
|
||
_context = RetryPolicyContext(
|
||
retries_attempted= _retries_attempted,
|
||
http_request = _last_request,
|
||
http_response = _last_response,
|
||
exception = e
|
||
)
|
||
continue
|
||
raise UnretryableException(_context)
|
||
|
||
"""
|
||
* @remarks
|
||
* Encapsulate the request and invoke the network
|
||
*
|
||
* @param action - api name
|
||
* @param version - product version
|
||
* @param protocol - http or https
|
||
* @param method - e.g. GET
|
||
* @param authType - authorization type e.g. AK
|
||
* @param bodyType - response body type e.g. String
|
||
* @param request - object of OpenApiRequest
|
||
* @param runtime - which controls some details of call api, such as retry times
|
||
* @returns the response
|
||
"""
|
||
def execute(
|
||
self,
|
||
params: open_api_util_models.Params,
|
||
request: open_api_util_models.OpenApiRequest,
|
||
runtime: RuntimeOptions,
|
||
) -> dict:
|
||
_runtime = {
|
||
'key': runtime.key or self._key,
|
||
'cert': runtime.cert or self._cert,
|
||
'ca': runtime.ca or self._ca,
|
||
'readTimeout': DaraCore.to_number(runtime.read_timeout or self._read_timeout),
|
||
'connectTimeout': DaraCore.to_number(runtime.connect_timeout or self._connect_timeout),
|
||
'httpProxy': runtime.http_proxy or self._http_proxy,
|
||
'httpsProxy': runtime.https_proxy or self._https_proxy,
|
||
'noProxy': runtime.no_proxy or self._no_proxy,
|
||
'socks5Proxy': runtime.socks_5proxy or self._socks_5proxy,
|
||
'socks5NetWork': runtime.socks_5net_work or self._socks_5net_work,
|
||
'maxIdleConns': DaraCore.to_number(runtime.max_idle_conns or self._max_idle_conns),
|
||
'retryOptions': self._retry_options,
|
||
'ignoreSSL': runtime.ignore_ssl,
|
||
'tlsMinVersion': self._tls_min_version,
|
||
'disableHttp2': bool(self._disable_http_2 or False),
|
||
}
|
||
_last_request = None
|
||
_last_response = None
|
||
_retries_attempted = 0
|
||
_context = RetryPolicyContext(
|
||
retries_attempted= _retries_attempted
|
||
)
|
||
while DaraCore.should_retry(_runtime.get('retryOptions'), _context):
|
||
if _retries_attempted > 0:
|
||
_backoff_time = DaraCore.get_backoff_time(_runtime.get('retryOptions'), _context)
|
||
if _backoff_time > 0:
|
||
DaraCore.sleep(_backoff_time)
|
||
_retries_attempted = _retries_attempted + 1
|
||
try:
|
||
_request = DaraRequest()
|
||
# spi = new Gateway();//Gateway implements SPI,这一步在产品 SDK 中实例化
|
||
headers = self.get_rpc_headers()
|
||
global_queries = {}
|
||
global_headers = {}
|
||
if not DaraCore.is_null(self._global_parameters):
|
||
global_params = self._global_parameters
|
||
if not DaraCore.is_null(global_params.queries):
|
||
global_queries = global_params.queries
|
||
if not DaraCore.is_null(global_params.headers):
|
||
global_headers = global_params.headers
|
||
extends_headers = {}
|
||
extends_queries = {}
|
||
if not DaraCore.is_null(runtime.extends_parameters):
|
||
extends_parameters = runtime.extends_parameters
|
||
if not DaraCore.is_null(extends_parameters.headers):
|
||
extends_headers = extends_parameters.headers
|
||
if not DaraCore.is_null(extends_parameters.queries):
|
||
extends_queries = extends_parameters.queries
|
||
request_context = spi_models.InterceptorContextRequest(
|
||
headers = DaraCore.merge({}, global_headers, extends_headers, request.headers, headers),
|
||
query = DaraCore.merge({}, global_queries, extends_queries, request.query),
|
||
body = request.body,
|
||
stream = request.stream,
|
||
host_map = request.host_map,
|
||
pathname = params.pathname,
|
||
product_id = self._product_id,
|
||
action = params.action,
|
||
version = params.version,
|
||
protocol = self._protocol or params.protocol,
|
||
method = self._method or params.method,
|
||
auth_type = params.auth_type,
|
||
body_type = params.body_type,
|
||
req_body_type = params.req_body_type,
|
||
style = params.style,
|
||
credential = self._credential,
|
||
signature_version = self._signature_version,
|
||
signature_algorithm = self._signature_algorithm,
|
||
user_agent = Utils.get_user_agent(self._user_agent)
|
||
)
|
||
configuration_context = spi_models.InterceptorContextConfiguration(
|
||
region_id = self._region_id,
|
||
endpoint = request.endpoint_override or self._endpoint,
|
||
endpoint_rule = self._endpoint_rule,
|
||
endpoint_map = self._endpoint_map,
|
||
endpoint_type = self._endpoint_type,
|
||
network = self._network,
|
||
suffix = self._suffix
|
||
)
|
||
interceptor_context = spi_models.InterceptorContext(
|
||
request = request_context,
|
||
configuration = configuration_context
|
||
)
|
||
attribute_map = spi_models.AttributeMap()
|
||
if not DaraCore.is_null(self._attribute_map):
|
||
attribute_map = self._attribute_map
|
||
# 1. spi.modifyConfiguration(context: SPI.InterceptorContext, attributeMap: SPI.AttributeMap);
|
||
self._spi.modify_configuration(interceptor_context, attribute_map)
|
||
# 2. spi.modifyRequest(context: SPI.InterceptorContext, attributeMap: SPI.AttributeMap);
|
||
self._spi.modify_request(interceptor_context, attribute_map)
|
||
_request.protocol = interceptor_context.request.protocol
|
||
_request.method = interceptor_context.request.method
|
||
_request.pathname = interceptor_context.request.pathname
|
||
_request.query = interceptor_context.request.query
|
||
_request.body = interceptor_context.request.stream
|
||
_request.headers = interceptor_context.request.headers
|
||
_last_request = _request
|
||
_response = DaraCore.do_action(_request, _runtime)
|
||
_last_response = _response
|
||
response_context = spi_models.InterceptorContextResponse(
|
||
status_code = _response.status_code,
|
||
headers = _response.headers,
|
||
body = _response.body
|
||
)
|
||
interceptor_context.response = response_context
|
||
# 3. spi.modifyResponse(context: SPI.InterceptorContext, attributeMap: SPI.AttributeMap);
|
||
self._spi.modify_response(interceptor_context, attribute_map)
|
||
return {
|
||
'headers': interceptor_context.response.headers,
|
||
'statusCode': interceptor_context.response.status_code,
|
||
'body': interceptor_context.response.deserialized_body
|
||
}
|
||
except Exception as e:
|
||
_context = RetryPolicyContext(
|
||
retries_attempted= _retries_attempted,
|
||
http_request = _last_request,
|
||
http_response = _last_response,
|
||
exception = e
|
||
)
|
||
continue
|
||
raise UnretryableException(_context)
|
||
|
||
async def execute_async(
|
||
self,
|
||
params: open_api_util_models.Params,
|
||
request: open_api_util_models.OpenApiRequest,
|
||
runtime: RuntimeOptions,
|
||
) -> dict:
|
||
_runtime = {
|
||
'key': runtime.key or self._key,
|
||
'cert': runtime.cert or self._cert,
|
||
'ca': runtime.ca or self._ca,
|
||
'readTimeout': DaraCore.to_number(runtime.read_timeout or self._read_timeout),
|
||
'connectTimeout': DaraCore.to_number(runtime.connect_timeout or self._connect_timeout),
|
||
'httpProxy': runtime.http_proxy or self._http_proxy,
|
||
'httpsProxy': runtime.https_proxy or self._https_proxy,
|
||
'noProxy': runtime.no_proxy or self._no_proxy,
|
||
'socks5Proxy': runtime.socks_5proxy or self._socks_5proxy,
|
||
'socks5NetWork': runtime.socks_5net_work or self._socks_5net_work,
|
||
'maxIdleConns': DaraCore.to_number(runtime.max_idle_conns or self._max_idle_conns),
|
||
'retryOptions': self._retry_options,
|
||
'ignoreSSL': runtime.ignore_ssl,
|
||
'tlsMinVersion': self._tls_min_version,
|
||
'disableHttp2': bool(self._disable_http_2 or False),
|
||
}
|
||
_last_request = None
|
||
_last_response = None
|
||
_retries_attempted = 0
|
||
_context = RetryPolicyContext(
|
||
retries_attempted= _retries_attempted
|
||
)
|
||
while DaraCore.should_retry(_runtime.get('retryOptions'), _context):
|
||
if _retries_attempted > 0:
|
||
_backoff_time = DaraCore.get_backoff_time(_runtime.get('retryOptions'), _context)
|
||
if _backoff_time > 0:
|
||
DaraCore.sleep(_backoff_time)
|
||
_retries_attempted = _retries_attempted + 1
|
||
try:
|
||
_request = DaraRequest()
|
||
# spi = new Gateway();//Gateway implements SPI,这一步在产品 SDK 中实例化
|
||
headers = self.get_rpc_headers()
|
||
global_queries = {}
|
||
global_headers = {}
|
||
if not DaraCore.is_null(self._global_parameters):
|
||
global_params = self._global_parameters
|
||
if not DaraCore.is_null(global_params.queries):
|
||
global_queries = global_params.queries
|
||
if not DaraCore.is_null(global_params.headers):
|
||
global_headers = global_params.headers
|
||
extends_headers = {}
|
||
extends_queries = {}
|
||
if not DaraCore.is_null(runtime.extends_parameters):
|
||
extends_parameters = runtime.extends_parameters
|
||
if not DaraCore.is_null(extends_parameters.headers):
|
||
extends_headers = extends_parameters.headers
|
||
if not DaraCore.is_null(extends_parameters.queries):
|
||
extends_queries = extends_parameters.queries
|
||
request_context = spi_models.InterceptorContextRequest(
|
||
headers = DaraCore.merge({}, global_headers, extends_headers, request.headers, headers),
|
||
query = DaraCore.merge({}, global_queries, extends_queries, request.query),
|
||
body = request.body,
|
||
stream = request.stream,
|
||
host_map = request.host_map,
|
||
pathname = params.pathname,
|
||
product_id = self._product_id,
|
||
action = params.action,
|
||
version = params.version,
|
||
protocol = self._protocol or params.protocol,
|
||
method = self._method or params.method,
|
||
auth_type = params.auth_type,
|
||
body_type = params.body_type,
|
||
req_body_type = params.req_body_type,
|
||
style = params.style,
|
||
credential = self._credential,
|
||
signature_version = self._signature_version,
|
||
signature_algorithm = self._signature_algorithm,
|
||
user_agent = Utils.get_user_agent(self._user_agent)
|
||
)
|
||
configuration_context = spi_models.InterceptorContextConfiguration(
|
||
region_id = self._region_id,
|
||
endpoint = request.endpoint_override or self._endpoint,
|
||
endpoint_rule = self._endpoint_rule,
|
||
endpoint_map = self._endpoint_map,
|
||
endpoint_type = self._endpoint_type,
|
||
network = self._network,
|
||
suffix = self._suffix
|
||
)
|
||
interceptor_context = spi_models.InterceptorContext(
|
||
request = request_context,
|
||
configuration = configuration_context
|
||
)
|
||
attribute_map = spi_models.AttributeMap()
|
||
if not DaraCore.is_null(self._attribute_map):
|
||
attribute_map = self._attribute_map
|
||
# 1. spi.modifyConfiguration(context: SPI.InterceptorContext, attributeMap: SPI.AttributeMap);
|
||
await self._spi.modify_configuration_async(interceptor_context, attribute_map)
|
||
# 2. spi.modifyRequest(context: SPI.InterceptorContext, attributeMap: SPI.AttributeMap);
|
||
await self._spi.modify_request_async(interceptor_context, attribute_map)
|
||
_request.protocol = interceptor_context.request.protocol
|
||
_request.method = interceptor_context.request.method
|
||
_request.pathname = interceptor_context.request.pathname
|
||
_request.query = interceptor_context.request.query
|
||
_request.body = interceptor_context.request.stream
|
||
_request.headers = interceptor_context.request.headers
|
||
_last_request = _request
|
||
_response = await DaraCore.async_do_action(_request, _runtime)
|
||
_last_response = _response
|
||
response_context = spi_models.InterceptorContextResponse(
|
||
status_code = _response.status_code,
|
||
headers = _response.headers,
|
||
body = _response.body
|
||
)
|
||
interceptor_context.response = response_context
|
||
# 3. spi.modifyResponse(context: SPI.InterceptorContext, attributeMap: SPI.AttributeMap);
|
||
await self._spi.modify_response_async(interceptor_context, attribute_map)
|
||
return {
|
||
'headers': interceptor_context.response.headers,
|
||
'statusCode': interceptor_context.response.status_code,
|
||
'body': interceptor_context.response.deserialized_body
|
||
}
|
||
except Exception as e:
|
||
_context = RetryPolicyContext(
|
||
retries_attempted= _retries_attempted,
|
||
http_request = _last_request,
|
||
http_response = _last_response,
|
||
exception = e
|
||
)
|
||
continue
|
||
raise UnretryableException(_context)
|
||
|
||
def call_sseapi(
|
||
self,
|
||
params: open_api_util_models.Params,
|
||
request: open_api_util_models.OpenApiRequest,
|
||
runtime: RuntimeOptions,
|
||
) -> Generator[main_models.SSEResponse, None, None]:
|
||
_runtime = {
|
||
'key': runtime.key or self._key,
|
||
'cert': runtime.cert or self._cert,
|
||
'ca': runtime.ca or self._ca,
|
||
'readTimeout': DaraCore.to_number(runtime.read_timeout or self._read_timeout),
|
||
'connectTimeout': DaraCore.to_number(runtime.connect_timeout or self._connect_timeout),
|
||
'httpProxy': runtime.http_proxy or self._http_proxy,
|
||
'httpsProxy': runtime.https_proxy or self._https_proxy,
|
||
'noProxy': runtime.no_proxy or self._no_proxy,
|
||
'socks5Proxy': runtime.socks_5proxy or self._socks_5proxy,
|
||
'socks5NetWork': runtime.socks_5net_work or self._socks_5net_work,
|
||
'maxIdleConns': DaraCore.to_number(runtime.max_idle_conns or self._max_idle_conns),
|
||
'retryOptions': self._retry_options,
|
||
'ignoreSSL': runtime.ignore_ssl,
|
||
'tlsMinVersion': self._tls_min_version,
|
||
}
|
||
_last_request = None
|
||
_last_response = None
|
||
_retries_attempted = 0
|
||
_context = RetryPolicyContext(
|
||
retries_attempted= _retries_attempted
|
||
)
|
||
while DaraCore.should_retry(_runtime.get('retryOptions'), _context):
|
||
if _retries_attempted > 0:
|
||
_backoff_time = DaraCore.get_backoff_time(_runtime.get('retryOptions'), _context)
|
||
if _backoff_time > 0:
|
||
DaraCore.sleep(_backoff_time)
|
||
_retries_attempted = _retries_attempted + 1
|
||
try:
|
||
_request = DaraRequest()
|
||
_request.protocol = self._protocol or params.protocol
|
||
_request.method = params.method
|
||
_request.pathname = params.pathname
|
||
global_queries = {}
|
||
global_headers = {}
|
||
if not DaraCore.is_null(self._global_parameters):
|
||
global_params = self._global_parameters
|
||
if not DaraCore.is_null(global_params.queries):
|
||
global_queries = global_params.queries
|
||
if not DaraCore.is_null(global_params.headers):
|
||
global_headers = global_params.headers
|
||
extends_headers = {}
|
||
extends_queries = {}
|
||
if not DaraCore.is_null(runtime.extends_parameters):
|
||
extends_parameters = runtime.extends_parameters
|
||
if not DaraCore.is_null(extends_parameters.headers):
|
||
extends_headers = extends_parameters.headers
|
||
if not DaraCore.is_null(extends_parameters.queries):
|
||
extends_queries = extends_parameters.queries
|
||
_request.query = DaraCore.merge({}, global_queries, extends_queries, request.query)
|
||
# endpoint is setted in product client
|
||
_request.headers = DaraCore.merge({
|
||
'host': self._endpoint,
|
||
'x-acs-version': params.version,
|
||
'x-acs-action': params.action,
|
||
'user-agent': Utils.get_user_agent(self._user_agent),
|
||
'x-acs-date': Utils.get_timestamp(),
|
||
'x-acs-signature-nonce': Utils.get_nonce(),
|
||
'accept': 'application/json',
|
||
}, extends_headers, global_headers, request.headers)
|
||
if params.style == 'RPC':
|
||
headers = self.get_rpc_headers()
|
||
if not DaraCore.is_null(headers):
|
||
_request.headers = DaraCore.merge({}, _request.headers, headers)
|
||
signature_algorithm = self._signature_algorithm or 'ACS3-HMAC-SHA256'
|
||
hashed_request_payload = Utils.hash(DaraBytes.from_('', 'utf-8'), signature_algorithm)
|
||
if not DaraCore.is_null(request.stream):
|
||
tmp = DaraStream.read_as_bytes(request.stream)
|
||
hashed_request_payload = Utils.hash(tmp, signature_algorithm)
|
||
_request.body = tmp
|
||
_request.headers["content-type"] = 'application/octet-stream'
|
||
else:
|
||
if not DaraCore.is_null(request.body):
|
||
if params.req_body_type == 'byte':
|
||
byte_obj = bytes(request.body)
|
||
hashed_request_payload = Utils.hash(byte_obj, signature_algorithm)
|
||
_request.body = byte_obj
|
||
elif params.req_body_type == 'json':
|
||
json_obj = DaraCore.to_json_string(request.body)
|
||
hashed_request_payload = Utils.hash(json_obj.encode('utf-8'), signature_algorithm)
|
||
_request.body = json_obj
|
||
_request.headers["content-type"] = 'application/json; charset=utf-8'
|
||
else:
|
||
m = request.body
|
||
form_obj = Utils.to_form(m)
|
||
hashed_request_payload = Utils.hash(form_obj.encode('utf-8'), signature_algorithm)
|
||
_request.body = form_obj
|
||
_request.headers["content-type"] = 'application/x-www-form-urlencoded'
|
||
|
||
|
||
_request.headers["x-acs-content-sha256"] = hashed_request_payload.hex()
|
||
if params.auth_type != 'Anonymous':
|
||
credential_model = self._credential.get_credential()
|
||
if not DaraCore.is_null(credential_model.provider_name):
|
||
_request.headers["x-acs-credentials-provider"] = credential_model.provider_name
|
||
auth_type = credential_model.type
|
||
if auth_type == 'bearer':
|
||
bearer_token = credential_model.bearer_token
|
||
_request.headers["x-acs-bearer-token"] = bearer_token
|
||
elif auth_type == 'id_token':
|
||
id_token = credential_model.security_token
|
||
_request.headers["x-acs-zero-trust-idtoken"] = id_token
|
||
else:
|
||
access_key_id = credential_model.access_key_id
|
||
access_key_secret = credential_model.access_key_secret
|
||
security_token = credential_model.security_token
|
||
if not DaraCore.is_null(security_token) and security_token != '':
|
||
_request.headers["x-acs-accesskey-id"] = access_key_id
|
||
_request.headers["x-acs-security-token"] = security_token
|
||
_request.headers["Authorization"] = Utils.get_authorization(_request, signature_algorithm, hashed_request_payload.hex(), access_key_id, access_key_secret)
|
||
|
||
_last_request = _request
|
||
_response = DaraCore.do_sse_action(_request, _runtime)
|
||
_last_response = _response
|
||
if (_response.status_code >= 400) and (_response.status_code < 600):
|
||
err = {}
|
||
if not DaraCore.is_null(_response.headers.get("content-type")) and _response.headers.get("content-type") == 'text/xml;charset=utf-8':
|
||
_str = DaraStream.read_as_string(_response.body)
|
||
resp_map = DaraXML.parse_xml(_str, None)
|
||
err = resp_map.get("Error")
|
||
else:
|
||
_res = DaraStream.read_as_json(_response.body)
|
||
err = _res
|
||
|
||
err["statusCode"] = _response.status_code
|
||
raise DaraException({
|
||
'code': f'{err.get("Code") or err.get("code")}',
|
||
'message': f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {err.get("RequestId") or err.get("requestId")}',
|
||
'data': err,
|
||
'description': f'{err.get("Description") or err.get("description")}',
|
||
'accessDeniedDetail': err.get("AccessDeniedDetail") or err.get("accessDeniedDetail")
|
||
})
|
||
events = DaraStream.read_as_sse(_response.body)
|
||
for event in events:
|
||
yield main_models.SSEResponse(
|
||
status_code = _response.status_code,
|
||
headers = _response.headers,
|
||
event = event
|
||
)
|
||
return
|
||
except Exception as e:
|
||
_context = RetryPolicyContext(
|
||
retries_attempted= _retries_attempted,
|
||
http_request = _last_request,
|
||
http_response = _last_response,
|
||
exception = e
|
||
)
|
||
continue
|
||
raise UnretryableException(_context)
|
||
|
||
async def call_sseapi_async(
|
||
self,
|
||
params: open_api_util_models.Params,
|
||
request: open_api_util_models.OpenApiRequest,
|
||
runtime: RuntimeOptions,
|
||
) -> AsyncGenerator[main_models.SSEResponse, None, None]:
|
||
_runtime = {
|
||
'key': runtime.key or self._key,
|
||
'cert': runtime.cert or self._cert,
|
||
'ca': runtime.ca or self._ca,
|
||
'readTimeout': DaraCore.to_number(runtime.read_timeout or self._read_timeout),
|
||
'connectTimeout': DaraCore.to_number(runtime.connect_timeout or self._connect_timeout),
|
||
'httpProxy': runtime.http_proxy or self._http_proxy,
|
||
'httpsProxy': runtime.https_proxy or self._https_proxy,
|
||
'noProxy': runtime.no_proxy or self._no_proxy,
|
||
'socks5Proxy': runtime.socks_5proxy or self._socks_5proxy,
|
||
'socks5NetWork': runtime.socks_5net_work or self._socks_5net_work,
|
||
'maxIdleConns': DaraCore.to_number(runtime.max_idle_conns or self._max_idle_conns),
|
||
'retryOptions': self._retry_options,
|
||
'ignoreSSL': runtime.ignore_ssl,
|
||
'tlsMinVersion': self._tls_min_version,
|
||
}
|
||
_last_request = None
|
||
_last_response = None
|
||
_retries_attempted = 0
|
||
_context = RetryPolicyContext(
|
||
retries_attempted= _retries_attempted
|
||
)
|
||
while DaraCore.should_retry(_runtime.get('retryOptions'), _context):
|
||
if _retries_attempted > 0:
|
||
_backoff_time = DaraCore.get_backoff_time(_runtime.get('retryOptions'), _context)
|
||
if _backoff_time > 0:
|
||
DaraCore.sleep(_backoff_time)
|
||
_retries_attempted = _retries_attempted + 1
|
||
try:
|
||
_request = DaraRequest()
|
||
_request.protocol = self._protocol or params.protocol
|
||
_request.method = params.method
|
||
_request.pathname = params.pathname
|
||
global_queries = {}
|
||
global_headers = {}
|
||
if not DaraCore.is_null(self._global_parameters):
|
||
global_params = self._global_parameters
|
||
if not DaraCore.is_null(global_params.queries):
|
||
global_queries = global_params.queries
|
||
if not DaraCore.is_null(global_params.headers):
|
||
global_headers = global_params.headers
|
||
extends_headers = {}
|
||
extends_queries = {}
|
||
if not DaraCore.is_null(runtime.extends_parameters):
|
||
extends_parameters = runtime.extends_parameters
|
||
if not DaraCore.is_null(extends_parameters.headers):
|
||
extends_headers = extends_parameters.headers
|
||
if not DaraCore.is_null(extends_parameters.queries):
|
||
extends_queries = extends_parameters.queries
|
||
_request.query = DaraCore.merge({}, global_queries, extends_queries, request.query)
|
||
# endpoint is setted in product client
|
||
_request.headers = DaraCore.merge({
|
||
'host': self._endpoint,
|
||
'x-acs-version': params.version,
|
||
'x-acs-action': params.action,
|
||
'user-agent': Utils.get_user_agent(self._user_agent),
|
||
'x-acs-date': Utils.get_timestamp(),
|
||
'x-acs-signature-nonce': Utils.get_nonce(),
|
||
'accept': 'application/json',
|
||
}, extends_headers, global_headers, request.headers)
|
||
if params.style == 'RPC':
|
||
headers = self.get_rpc_headers()
|
||
if not DaraCore.is_null(headers):
|
||
_request.headers = DaraCore.merge({}, _request.headers, headers)
|
||
signature_algorithm = self._signature_algorithm or 'ACS3-HMAC-SHA256'
|
||
hashed_request_payload = Utils.hash(DaraBytes.from_('', 'utf-8'), signature_algorithm)
|
||
if not DaraCore.is_null(request.stream):
|
||
tmp = await DaraStream.read_as_bytes_async(request.stream)
|
||
hashed_request_payload = Utils.hash(tmp, signature_algorithm)
|
||
_request.body = tmp
|
||
_request.headers["content-type"] = 'application/octet-stream'
|
||
else:
|
||
if not DaraCore.is_null(request.body):
|
||
if params.req_body_type == 'byte':
|
||
byte_obj = bytes(request.body)
|
||
hashed_request_payload = Utils.hash(byte_obj, signature_algorithm)
|
||
_request.body = byte_obj
|
||
elif params.req_body_type == 'json':
|
||
json_obj = DaraCore.to_json_string(request.body)
|
||
hashed_request_payload = Utils.hash(json_obj.encode('utf-8'), signature_algorithm)
|
||
_request.body = json_obj
|
||
_request.headers["content-type"] = 'application/json; charset=utf-8'
|
||
else:
|
||
m = request.body
|
||
form_obj = Utils.to_form(m)
|
||
hashed_request_payload = Utils.hash(form_obj.encode('utf-8'), signature_algorithm)
|
||
_request.body = form_obj
|
||
_request.headers["content-type"] = 'application/x-www-form-urlencoded'
|
||
|
||
|
||
_request.headers["x-acs-content-sha256"] = hashed_request_payload.hex()
|
||
if params.auth_type != 'Anonymous':
|
||
credential_model = await self._credential.get_credential_async()
|
||
if not DaraCore.is_null(credential_model.provider_name):
|
||
_request.headers["x-acs-credentials-provider"] = credential_model.provider_name
|
||
auth_type = credential_model.type
|
||
if auth_type == 'bearer':
|
||
bearer_token = credential_model.bearer_token
|
||
_request.headers["x-acs-bearer-token"] = bearer_token
|
||
elif auth_type == 'id_token':
|
||
id_token = credential_model.security_token
|
||
_request.headers["x-acs-zero-trust-idtoken"] = id_token
|
||
else:
|
||
access_key_id = credential_model.access_key_id
|
||
access_key_secret = credential_model.access_key_secret
|
||
security_token = credential_model.security_token
|
||
if not DaraCore.is_null(security_token) and security_token != '':
|
||
_request.headers["x-acs-accesskey-id"] = access_key_id
|
||
_request.headers["x-acs-security-token"] = security_token
|
||
_request.headers["Authorization"] = Utils.get_authorization(_request, signature_algorithm, hashed_request_payload.hex(), access_key_id, access_key_secret)
|
||
|
||
_last_request = _request
|
||
_response = await DaraCore.async_do_sse_action(_request, _runtime)
|
||
_last_response = _response
|
||
if (_response.status_code >= 400) and (_response.status_code < 600):
|
||
err = {}
|
||
if not DaraCore.is_null(_response.headers.get("content-type")) and _response.headers.get("content-type") == 'text/xml;charset=utf-8':
|
||
_str = await DaraStream.read_as_string_async(_response.body)
|
||
resp_map = DaraXML.parse_xml(_str, None)
|
||
err = resp_map.get("Error")
|
||
else:
|
||
_res = await DaraStream.read_as_json_async(_response.body)
|
||
err = _res
|
||
|
||
err["statusCode"] = _response.status_code
|
||
raise DaraException({
|
||
'code': f'{err.get("Code") or err.get("code")}',
|
||
'message': f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {err.get("RequestId") or err.get("requestId")}',
|
||
'data': err,
|
||
'description': f'{err.get("Description") or err.get("description")}',
|
||
'accessDeniedDetail': err.get("AccessDeniedDetail") or err.get("accessDeniedDetail")
|
||
})
|
||
events = DaraStream.read_as_sse_async(_response.body)
|
||
async for event in events:
|
||
yield main_models.SSEResponse(
|
||
status_code = _response.status_code,
|
||
headers = _response.headers,
|
||
event = event
|
||
)
|
||
return
|
||
except Exception as e:
|
||
_context = RetryPolicyContext(
|
||
retries_attempted= _retries_attempted,
|
||
http_request = _last_request,
|
||
http_response = _last_response,
|
||
exception = e
|
||
)
|
||
continue
|
||
raise UnretryableException(_context)
|
||
|
||
def call_api(
|
||
self,
|
||
params: open_api_util_models.Params,
|
||
request: open_api_util_models.OpenApiRequest,
|
||
runtime: RuntimeOptions,
|
||
) -> dict:
|
||
if DaraCore.is_null(params):
|
||
raise main_exceptions.ClientException(
|
||
code = 'ParameterMissing',
|
||
message = '\'params\' can not be unset'
|
||
)
|
||
if DaraCore.is_null(self._signature_version) or self._signature_version != 'v4':
|
||
if DaraCore.is_null(self._signature_algorithm) or self._signature_algorithm != 'v2':
|
||
return self.do_request(params, request, runtime)
|
||
elif (params.style == 'ROA') and (params.req_body_type == 'json'):
|
||
return self.do_roarequest(params.action, params.version, params.protocol, params.method, params.auth_type, params.pathname, params.body_type, request, runtime)
|
||
elif params.style == 'ROA':
|
||
return self.do_roarequest_with_form(params.action, params.version, params.protocol, params.method, params.auth_type, params.pathname, params.body_type, request, runtime)
|
||
else:
|
||
return self.do_rpcrequest(params.action, params.version, params.protocol, params.method, params.auth_type, params.body_type, request, runtime)
|
||
|
||
else:
|
||
return self.execute(params, request, runtime)
|
||
|
||
|
||
async def call_api_async(
|
||
self,
|
||
params: open_api_util_models.Params,
|
||
request: open_api_util_models.OpenApiRequest,
|
||
runtime: RuntimeOptions,
|
||
) -> dict:
|
||
if DaraCore.is_null(params):
|
||
raise main_exceptions.ClientException(
|
||
code = 'ParameterMissing',
|
||
message = '\'params\' can not be unset'
|
||
)
|
||
if DaraCore.is_null(self._signature_version) or self._signature_version != 'v4':
|
||
if DaraCore.is_null(self._signature_algorithm) or self._signature_algorithm != 'v2':
|
||
return await self.do_request_async(params, request, runtime)
|
||
elif (params.style == 'ROA') and (params.req_body_type == 'json'):
|
||
return await self.do_roarequest_async(params.action, params.version, params.protocol, params.method, params.auth_type, params.pathname, params.body_type, request, runtime)
|
||
elif params.style == 'ROA':
|
||
return await self.do_roarequest_with_form_async(params.action, params.version, params.protocol, params.method, params.auth_type, params.pathname, params.body_type, request, runtime)
|
||
else:
|
||
return await self.do_rpcrequest_async(params.action, params.version, params.protocol, params.method, params.auth_type, params.body_type, request, runtime)
|
||
|
||
else:
|
||
return await self.execute_async(params, request, runtime)
|
||
|
||
|
||
def get_access_key_id(self) -> str:
|
||
if DaraCore.is_null(self._credential):
|
||
return ''
|
||
access_key_id = self._credential.get_access_key_id()
|
||
return access_key_id
|
||
|
||
async def get_access_key_id_async(self) -> str:
|
||
if DaraCore.is_null(self._credential):
|
||
return ''
|
||
access_key_id = await self._credential.get_access_key_id_async()
|
||
return access_key_id
|
||
|
||
def get_access_key_secret(self) -> str:
|
||
if DaraCore.is_null(self._credential):
|
||
return ''
|
||
secret = self._credential.get_access_key_secret()
|
||
return secret
|
||
|
||
async def get_access_key_secret_async(self) -> str:
|
||
if DaraCore.is_null(self._credential):
|
||
return ''
|
||
secret = await self._credential.get_access_key_secret_async()
|
||
return secret
|
||
|
||
def get_security_token(self) -> str:
|
||
if DaraCore.is_null(self._credential):
|
||
return ''
|
||
token = self._credential.get_security_token()
|
||
return token
|
||
|
||
async def get_security_token_async(self) -> str:
|
||
if DaraCore.is_null(self._credential):
|
||
return ''
|
||
token = await self._credential.get_security_token_async()
|
||
return token
|
||
|
||
def get_bearer_token(self) -> str:
|
||
if DaraCore.is_null(self._credential):
|
||
return ''
|
||
token = self._credential.get_bearer_token()
|
||
return token
|
||
|
||
async def get_bearer_token_async(self) -> str:
|
||
if DaraCore.is_null(self._credential):
|
||
return ''
|
||
token = self._credential.get_bearer_token()
|
||
return token
|
||
|
||
def get_type(self) -> str:
|
||
if DaraCore.is_null(self._credential):
|
||
return ''
|
||
auth_type = self._credential.get_type()
|
||
return auth_type
|
||
|
||
async def get_type_async(self) -> str:
|
||
if DaraCore.is_null(self._credential):
|
||
return ''
|
||
auth_type = self._credential.get_type()
|
||
return auth_type
|
||
|
||
def check_config(
|
||
self,
|
||
config: open_api_util_models.Config,
|
||
) -> None:
|
||
if DaraCore.is_null(self._endpoint_rule) and DaraCore.is_null(config.endpoint):
|
||
raise main_exceptions.ClientException(
|
||
code = 'ParameterMissing',
|
||
message = '\'config.endpoint\' can not be empty'
|
||
)
|
||
|
||
def set_gateway_client(
|
||
self,
|
||
spi: SPIClient,
|
||
) -> None:
|
||
self._spi = spi
|
||
|
||
def set_rpc_headers(
|
||
self,
|
||
headers: Dict[str, str],
|
||
) -> None:
|
||
self._headers = headers
|
||
|
||
def get_rpc_headers(self) -> Dict[str, str]:
|
||
headers = self._headers
|
||
self._headers = None
|
||
return headers
|
||
|
||
def default_any(
|
||
input_value: Any,
|
||
default_value: Any,
|
||
) -> Any:
|
||
if DaraCore.is_null(input_value):
|
||
return default_value
|
||
return input_value
|
||
|
||
def get_access_denied_detail(
|
||
self,
|
||
err: Dict[str, Any],
|
||
) -> Dict[str, Any]:
|
||
access_denied_detail = None
|
||
if not DaraCore.is_null(err.get("AccessDeniedDetail")):
|
||
detail_1 = err.get("AccessDeniedDetail")
|
||
access_denied_detail = detail_1
|
||
elif not DaraCore.is_null(err.get("accessDeniedDetail")):
|
||
detail_2 = err.get("accessDeniedDetail")
|
||
access_denied_detail = detail_2
|
||
return access_denied_detail
|