client.py 143 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743
  1. # -*- coding: utf-8 -*-
  2. # This file is auto-generated, don't edit it. Thanks.
  3. from __future__ import annotations
  4. import os
  5. from typing import Dict, Generator, AsyncGenerator, Any
  6. from alibabacloud_credentials import models as credential_models
  7. from alibabacloud_credentials.client import Client as CredentialClient
  8. from alibabacloud_gateway_spi import models as spi_models
  9. from alibabacloud_gateway_spi.client import Client as SPIClient
  10. from alibabacloud_tea_openapi import exceptions as main_exceptions
  11. from alibabacloud_tea_openapi import models as main_models
  12. from alibabacloud_tea_openapi import utils_models as open_api_util_models
  13. from alibabacloud_tea_openapi.utils import Utils
  14. from darabonba.core import DaraCore as DaraCore
  15. from darabonba.core import DaraCore
  16. from darabonba.exceptions import DaraException, UnretryableException
  17. from darabonba.policy.retry import RetryOptions, RetryPolicyContext
  18. from darabonba.request import DaraRequest
  19. from darabonba.runtime import RuntimeOptions
  20. from darabonba.utils.bytes import Bytes as DaraBytes
  21. from darabonba.utils.form import Form as DaraForm
  22. from darabonba.utils.stream import Stream as DaraStream
  23. from darabonba.utils.xml import XML as DaraXML
  24. from darabonba.websocket import (
  25. get_web_socket_enable_reconnect,
  26. get_web_socket_handshake_timeout,
  27. get_web_socket_max_reconnect_times,
  28. get_web_socket_ping_interval,
  29. get_web_socket_pong_timeout,
  30. get_web_socket_reconnect_interval,
  31. get_web_socket_write_timeout,
  32. new_websocket_client_and_connect,
  33. )
  34. from alibabacloud_tea_openapi import websocket_utils
  35. """
  36. * @remarks
  37. * This is for OpenApi SDK
  38. """
  39. class Client:
  40. _endpoint: str = None
  41. _region_id: str = None
  42. _protocol: str = None
  43. _method: str = None
  44. _user_agent: str = None
  45. _endpoint_rule: str = None
  46. _endpoint_map: Dict[str, str] = None
  47. _suffix: str = None
  48. _read_timeout: int = None
  49. _connect_timeout: int = None
  50. _http_proxy: str = None
  51. _https_proxy: str = None
  52. _socks_5proxy: str = None
  53. _socks_5net_work: str = None
  54. _no_proxy: str = None
  55. _network: str = None
  56. _product_id: str = None
  57. _max_idle_conns: int = None
  58. _endpoint_type: str = None
  59. _open_platform_endpoint: str = None
  60. _credential: CredentialClient = None
  61. _signature_version: str = None
  62. _signature_algorithm: str = None
  63. _headers: Dict[str, str] = None
  64. _spi: SPIClient = None
  65. _global_parameters: open_api_util_models.GlobalParameters = None
  66. _key: str = None
  67. _cert: str = None
  68. _ca: str = None
  69. _disable_http_2: bool = None
  70. _retry_options: RetryOptions = None
  71. _tls_min_version: str = None
  72. _attribute_map: spi_models.AttributeMap = None
  73. def __init__(
  74. self,
  75. config: open_api_util_models.Config,
  76. ):
  77. if DaraCore.is_null(config):
  78. raise main_exceptions.ClientException(
  79. code = 'ParameterMissing',
  80. message = '\'config\' can not be unset'
  81. )
  82. 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 != ''):
  83. if not DaraCore.is_null(config.security_token) and config.security_token != '':
  84. config.type = 'sts'
  85. else:
  86. config.type = 'access_key'
  87. credential_config = credential_models.Config(
  88. access_key_id = config.access_key_id,
  89. type = config.type,
  90. access_key_secret = config.access_key_secret
  91. )
  92. credential_config.security_token = config.security_token
  93. self._credential = CredentialClient(credential_config)
  94. elif not DaraCore.is_null(config.bearer_token) and config.bearer_token != '':
  95. cc = credential_models.Config(
  96. type = 'bearer',
  97. bearer_token = config.bearer_token
  98. )
  99. self._credential = CredentialClient(cc)
  100. elif not DaraCore.is_null(config.credential):
  101. self._credential = config.credential
  102. if DaraCore.is_null(config.user_agent):
  103. self._user_agent = os.environ.get('ALIBABA_CLOUD_USER_AGENT')
  104. else:
  105. self._user_agent = config.user_agent
  106. self._endpoint = config.endpoint
  107. self._endpoint_type = config.endpoint_type
  108. self._network = config.network
  109. self._suffix = config.suffix
  110. self._protocol = config.protocol
  111. self._method = config.method
  112. self._region_id = config.region_id
  113. self._read_timeout = config.read_timeout
  114. self._connect_timeout = config.connect_timeout
  115. self._http_proxy = config.http_proxy
  116. self._https_proxy = config.https_proxy
  117. self._no_proxy = config.no_proxy
  118. self._socks_5proxy = config.socks_5proxy
  119. self._socks_5net_work = config.socks_5net_work
  120. self._max_idle_conns = config.max_idle_conns
  121. self._signature_version = config.signature_version
  122. self._signature_algorithm = config.signature_algorithm
  123. self._global_parameters = config.global_parameters
  124. self._key = config.key
  125. self._cert = config.cert
  126. self._ca = config.ca
  127. self._disable_http_2 = config.disable_http_2
  128. self._retry_options = config.retry_options
  129. self._tls_min_version = config.tls_min_version
  130. """
  131. * @remarks
  132. * Encapsulate the request and invoke the network
  133. *
  134. * @param action - api name
  135. * @param version - product version
  136. * @param protocol - http or https
  137. * @param method - e.g. GET
  138. * @param authType - authorization type e.g. AK
  139. * @param bodyType - response body type e.g. String
  140. * @param request - object of OpenApiRequest
  141. * @param runtime - which controls some details of call api, such as retry times
  142. * @returns the response
  143. """
  144. def do_rpcrequest(
  145. self,
  146. action: str,
  147. version: str,
  148. protocol: str,
  149. method: str,
  150. auth_type: str,
  151. body_type: str,
  152. request: open_api_util_models.OpenApiRequest,
  153. runtime: RuntimeOptions,
  154. ) -> dict:
  155. _runtime = {
  156. 'key': runtime.key or self._key,
  157. 'cert': runtime.cert or self._cert,
  158. 'ca': runtime.ca or self._ca,
  159. 'readTimeout': DaraCore.to_number(runtime.read_timeout or self._read_timeout),
  160. 'connectTimeout': DaraCore.to_number(runtime.connect_timeout or self._connect_timeout),
  161. 'httpProxy': runtime.http_proxy or self._http_proxy,
  162. 'httpsProxy': runtime.https_proxy or self._https_proxy,
  163. 'noProxy': runtime.no_proxy or self._no_proxy,
  164. 'socks5Proxy': runtime.socks_5proxy or self._socks_5proxy,
  165. 'socks5NetWork': runtime.socks_5net_work or self._socks_5net_work,
  166. 'maxIdleConns': DaraCore.to_number(runtime.max_idle_conns or self._max_idle_conns),
  167. 'retryOptions': self._retry_options,
  168. 'ignoreSSL': runtime.ignore_ssl,
  169. 'tlsMinVersion': self._tls_min_version,
  170. }
  171. _last_request = None
  172. _last_response = None
  173. _retries_attempted = 0
  174. _context = RetryPolicyContext(
  175. retries_attempted= _retries_attempted
  176. )
  177. while DaraCore.should_retry(_runtime.get('retryOptions'), _context):
  178. _backoff_time = 0
  179. if _retries_attempted > 0:
  180. _backoff_time = DaraCore.get_backoff_time(_runtime.get('retryOptions'), _context)
  181. if _backoff_time > 0:
  182. DaraCore.sleep(_backoff_time)
  183. _retry_attempts = _retries_attempted
  184. _retries_attempted = _retries_attempted + 1
  185. try:
  186. _request = DaraRequest()
  187. _request.protocol = self._protocol or protocol
  188. _request.method = method
  189. _request.pathname = '/'
  190. global_queries = {}
  191. global_headers = {}
  192. if not DaraCore.is_null(self._global_parameters):
  193. global_params = self._global_parameters
  194. if not DaraCore.is_null(global_params.queries):
  195. global_queries = global_params.queries
  196. if not DaraCore.is_null(global_params.headers):
  197. global_headers = global_params.headers
  198. extends_headers = {}
  199. extends_queries = {}
  200. if not DaraCore.is_null(runtime.extends_parameters):
  201. extends_parameters = runtime.extends_parameters
  202. if not DaraCore.is_null(extends_parameters.headers):
  203. extends_headers = extends_parameters.headers
  204. if not DaraCore.is_null(extends_parameters.queries):
  205. extends_queries = extends_parameters.queries
  206. _request.query = DaraCore.merge({
  207. 'Action': action,
  208. 'Format': 'json',
  209. 'Version': version,
  210. 'Timestamp': Utils.get_timestamp(),
  211. 'SignatureNonce': Utils.get_nonce(),
  212. }, global_queries, extends_queries, request.query)
  213. headers = self.get_rpc_headers()
  214. if DaraCore.is_null(headers):
  215. # endpoint is setted in product client
  216. _request.headers = DaraCore.merge({
  217. 'host': self._endpoint,
  218. 'x-acs-version': version,
  219. 'x-acs-action': action,
  220. 'user-agent': Utils.get_user_agent(self._user_agent),
  221. }, global_headers, extends_headers, request.headers)
  222. else:
  223. _request.headers = DaraCore.merge({
  224. 'host': self._endpoint,
  225. 'x-acs-version': version,
  226. 'x-acs-action': action,
  227. 'user-agent': Utils.get_user_agent(self._user_agent),
  228. }, global_headers, extends_headers, request.headers, headers)
  229. Utils.apply_retry_headers(_request.headers, _retry_attempts, _backoff_time)
  230. if not DaraCore.is_null(request.body):
  231. m = request.body
  232. tmp = Utils.query(m)
  233. _request.body = DaraForm.to_form_string(tmp)
  234. _request.headers["content-type"] = 'application/x-www-form-urlencoded'
  235. if auth_type != 'Anonymous':
  236. if DaraCore.is_null(self._credential):
  237. raise main_exceptions.ClientException(
  238. code = f'InvalidCredentials',
  239. 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.'
  240. )
  241. credential_model = self._credential.get_credential()
  242. if not DaraCore.is_null(credential_model.provider_name):
  243. _request.headers["x-acs-credentials-provider"] = credential_model.provider_name
  244. credential_type = credential_model.type
  245. if credential_type == 'bearer':
  246. bearer_token = credential_model.bearer_token
  247. _request.query["BearerToken"] = bearer_token
  248. _request.query["SignatureType"] = 'BEARERTOKEN'
  249. elif credential_type == 'id_token':
  250. id_token = credential_model.security_token
  251. _request.headers["x-acs-zero-trust-idtoken"] = id_token
  252. else:
  253. access_key_id = credential_model.access_key_id
  254. access_key_secret = credential_model.access_key_secret
  255. security_token = credential_model.security_token
  256. if not DaraCore.is_null(security_token) and security_token != '':
  257. _request.query["SecurityToken"] = security_token
  258. _request.query["SignatureMethod"] = 'HMAC-SHA1'
  259. _request.query["SignatureVersion"] = '1.0'
  260. _request.query["AccessKeyId"] = access_key_id
  261. t = None
  262. if not DaraCore.is_null(request.body):
  263. t = request.body
  264. signed_param = DaraCore.merge({}, _request.query, Utils.query(t))
  265. _request.query["Signature"] = Utils.get_rpcsignature(signed_param, _request.method, access_key_secret)
  266. _last_request = _request
  267. _response = DaraCore.do_action(_request, _runtime)
  268. _last_response = _response
  269. if (_response.status_code >= 400) and (_response.status_code < 600):
  270. _res = DaraStream.read_as_json(_response.body)
  271. err = _res
  272. request_id = err.get("RequestId") or err.get("requestId")
  273. code = err.get("Code") or err.get("code")
  274. retry_after = Utils.get_throttling_time_left(_response.headers)
  275. if not DaraCore.is_null(retry_after):
  276. raise main_exceptions.ThrottlingException(
  277. status_code = _response.status_code,
  278. code = f'{code}',
  279. message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
  280. detail = f'{err.get("Detail") or err.get("detail")}',
  281. description = f'{err.get("Description") or err.get("description")}',
  282. retry_after = retry_after,
  283. data = err,
  284. request_id = f'{request_id}'
  285. )
  286. elif (_response.status_code >= 400) and (_response.status_code < 500):
  287. raise main_exceptions.ClientException(
  288. status_code = _response.status_code,
  289. code = f'{code}',
  290. message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
  291. detail = f'{err.get("Detail") or err.get("detail")}',
  292. description = f'{err.get("Description") or err.get("description")}',
  293. data = err,
  294. access_denied_detail = self.get_access_denied_detail(err),
  295. request_id = f'{request_id}'
  296. )
  297. else:
  298. raise main_exceptions.ServerException(
  299. status_code = _response.status_code,
  300. code = f'{code}',
  301. message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
  302. detail = f'{err.get("Detail") or err.get("detail")}',
  303. description = f'{err.get("Description") or err.get("description")}',
  304. data = err,
  305. request_id = f'{request_id}'
  306. )
  307. if body_type == 'binary':
  308. resp = {
  309. 'body': _response.body,
  310. 'headers': _response.headers,
  311. 'statusCode': _response.status_code
  312. }
  313. return resp
  314. elif body_type == 'byte':
  315. byt = DaraStream.read_as_bytes(_response.body)
  316. return {
  317. 'body': byt,
  318. 'headers': _response.headers,
  319. 'statusCode': _response.status_code
  320. }
  321. elif body_type == 'string':
  322. _str = DaraStream.read_as_string(_response.body)
  323. return {
  324. 'body': _str,
  325. 'headers': _response.headers,
  326. 'statusCode': _response.status_code
  327. }
  328. elif body_type == 'json':
  329. obj = DaraStream.read_as_json(_response.body)
  330. res = obj
  331. return {
  332. 'body': res,
  333. 'headers': _response.headers,
  334. 'statusCode': _response.status_code
  335. }
  336. elif body_type == 'array':
  337. arr = DaraStream.read_as_json(_response.body)
  338. return {
  339. 'body': arr,
  340. 'headers': _response.headers,
  341. 'statusCode': _response.status_code
  342. }
  343. else:
  344. return {
  345. 'headers': _response.headers,
  346. 'statusCode': _response.status_code
  347. }
  348. except Exception as e:
  349. _context = RetryPolicyContext(
  350. retries_attempted= _retries_attempted,
  351. http_request = _last_request,
  352. http_response = _last_response,
  353. exception = e
  354. )
  355. continue
  356. raise UnretryableException(_context)
  357. async def do_rpcrequest_async(
  358. self,
  359. action: str,
  360. version: str,
  361. protocol: str,
  362. method: str,
  363. auth_type: str,
  364. body_type: str,
  365. request: open_api_util_models.OpenApiRequest,
  366. runtime: RuntimeOptions,
  367. ) -> dict:
  368. _runtime = {
  369. 'key': runtime.key or self._key,
  370. 'cert': runtime.cert or self._cert,
  371. 'ca': runtime.ca or self._ca,
  372. 'readTimeout': DaraCore.to_number(runtime.read_timeout or self._read_timeout),
  373. 'connectTimeout': DaraCore.to_number(runtime.connect_timeout or self._connect_timeout),
  374. 'httpProxy': runtime.http_proxy or self._http_proxy,
  375. 'httpsProxy': runtime.https_proxy or self._https_proxy,
  376. 'noProxy': runtime.no_proxy or self._no_proxy,
  377. 'socks5Proxy': runtime.socks_5proxy or self._socks_5proxy,
  378. 'socks5NetWork': runtime.socks_5net_work or self._socks_5net_work,
  379. 'maxIdleConns': DaraCore.to_number(runtime.max_idle_conns or self._max_idle_conns),
  380. 'retryOptions': self._retry_options,
  381. 'ignoreSSL': runtime.ignore_ssl,
  382. 'tlsMinVersion': self._tls_min_version,
  383. }
  384. _last_request = None
  385. _last_response = None
  386. _retries_attempted = 0
  387. _context = RetryPolicyContext(
  388. retries_attempted= _retries_attempted
  389. )
  390. while DaraCore.should_retry(_runtime.get('retryOptions'), _context):
  391. _backoff_time = 0
  392. if _retries_attempted > 0:
  393. _backoff_time = DaraCore.get_backoff_time(_runtime.get('retryOptions'), _context)
  394. if _backoff_time > 0:
  395. DaraCore.sleep(_backoff_time)
  396. _retry_attempts = _retries_attempted
  397. _retries_attempted = _retries_attempted + 1
  398. try:
  399. _request = DaraRequest()
  400. _request.protocol = self._protocol or protocol
  401. _request.method = method
  402. _request.pathname = '/'
  403. global_queries = {}
  404. global_headers = {}
  405. if not DaraCore.is_null(self._global_parameters):
  406. global_params = self._global_parameters
  407. if not DaraCore.is_null(global_params.queries):
  408. global_queries = global_params.queries
  409. if not DaraCore.is_null(global_params.headers):
  410. global_headers = global_params.headers
  411. extends_headers = {}
  412. extends_queries = {}
  413. if not DaraCore.is_null(runtime.extends_parameters):
  414. extends_parameters = runtime.extends_parameters
  415. if not DaraCore.is_null(extends_parameters.headers):
  416. extends_headers = extends_parameters.headers
  417. if not DaraCore.is_null(extends_parameters.queries):
  418. extends_queries = extends_parameters.queries
  419. _request.query = DaraCore.merge({
  420. 'Action': action,
  421. 'Format': 'json',
  422. 'Version': version,
  423. 'Timestamp': Utils.get_timestamp(),
  424. 'SignatureNonce': Utils.get_nonce(),
  425. }, global_queries, extends_queries, request.query)
  426. headers = self.get_rpc_headers()
  427. if DaraCore.is_null(headers):
  428. # endpoint is setted in product client
  429. _request.headers = DaraCore.merge({
  430. 'host': self._endpoint,
  431. 'x-acs-version': version,
  432. 'x-acs-action': action,
  433. 'user-agent': Utils.get_user_agent(self._user_agent),
  434. }, global_headers, extends_headers, request.headers)
  435. else:
  436. _request.headers = DaraCore.merge({
  437. 'host': self._endpoint,
  438. 'x-acs-version': version,
  439. 'x-acs-action': action,
  440. 'user-agent': Utils.get_user_agent(self._user_agent),
  441. }, global_headers, extends_headers, request.headers, headers)
  442. Utils.apply_retry_headers(_request.headers, _retry_attempts, _backoff_time)
  443. if not DaraCore.is_null(request.body):
  444. m = request.body
  445. tmp = Utils.query(m)
  446. _request.body = DaraForm.to_form_string(tmp)
  447. _request.headers["content-type"] = 'application/x-www-form-urlencoded'
  448. if auth_type != 'Anonymous':
  449. if DaraCore.is_null(self._credential):
  450. raise main_exceptions.ClientException(
  451. code = f'InvalidCredentials',
  452. 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.'
  453. )
  454. credential_model = await self._credential.get_credential_async()
  455. if not DaraCore.is_null(credential_model.provider_name):
  456. _request.headers["x-acs-credentials-provider"] = credential_model.provider_name
  457. credential_type = credential_model.type
  458. if credential_type == 'bearer':
  459. bearer_token = credential_model.bearer_token
  460. _request.query["BearerToken"] = bearer_token
  461. _request.query["SignatureType"] = 'BEARERTOKEN'
  462. elif credential_type == 'id_token':
  463. id_token = credential_model.security_token
  464. _request.headers["x-acs-zero-trust-idtoken"] = id_token
  465. else:
  466. access_key_id = credential_model.access_key_id
  467. access_key_secret = credential_model.access_key_secret
  468. security_token = credential_model.security_token
  469. if not DaraCore.is_null(security_token) and security_token != '':
  470. _request.query["SecurityToken"] = security_token
  471. _request.query["SignatureMethod"] = 'HMAC-SHA1'
  472. _request.query["SignatureVersion"] = '1.0'
  473. _request.query["AccessKeyId"] = access_key_id
  474. t = None
  475. if not DaraCore.is_null(request.body):
  476. t = request.body
  477. signed_param = DaraCore.merge({}, _request.query, Utils.query(t))
  478. _request.query["Signature"] = Utils.get_rpcsignature(signed_param, _request.method, access_key_secret)
  479. _last_request = _request
  480. _response = await DaraCore.async_do_action(_request, _runtime)
  481. _last_response = _response
  482. if (_response.status_code >= 400) and (_response.status_code < 600):
  483. _res = await DaraStream.read_as_json_async(_response.body)
  484. err = _res
  485. request_id = err.get("RequestId") or err.get("requestId")
  486. code = err.get("Code") or err.get("code")
  487. retry_after = Utils.get_throttling_time_left(_response.headers)
  488. if not DaraCore.is_null(retry_after):
  489. raise main_exceptions.ThrottlingException(
  490. status_code = _response.status_code,
  491. code = f'{code}',
  492. message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
  493. detail = f'{err.get("Detail") or err.get("detail")}',
  494. description = f'{err.get("Description") or err.get("description")}',
  495. retry_after = retry_after,
  496. data = err,
  497. request_id = f'{request_id}'
  498. )
  499. elif (_response.status_code >= 400) and (_response.status_code < 500):
  500. raise main_exceptions.ClientException(
  501. status_code = _response.status_code,
  502. code = f'{code}',
  503. message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
  504. detail = f'{err.get("Detail") or err.get("detail")}',
  505. description = f'{err.get("Description") or err.get("description")}',
  506. data = err,
  507. access_denied_detail = self.get_access_denied_detail(err),
  508. request_id = f'{request_id}'
  509. )
  510. else:
  511. raise main_exceptions.ServerException(
  512. status_code = _response.status_code,
  513. code = f'{code}',
  514. message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
  515. detail = f'{err.get("Detail") or err.get("detail")}',
  516. description = f'{err.get("Description") or err.get("description")}',
  517. data = err,
  518. request_id = f'{request_id}'
  519. )
  520. if body_type == 'binary':
  521. resp = {
  522. 'body': _response.body,
  523. 'headers': _response.headers,
  524. 'statusCode': _response.status_code
  525. }
  526. return resp
  527. elif body_type == 'byte':
  528. byt = await DaraStream.read_as_bytes_async(_response.body)
  529. return {
  530. 'body': byt,
  531. 'headers': _response.headers,
  532. 'statusCode': _response.status_code
  533. }
  534. elif body_type == 'string':
  535. _str = await DaraStream.read_as_string_async(_response.body)
  536. return {
  537. 'body': _str,
  538. 'headers': _response.headers,
  539. 'statusCode': _response.status_code
  540. }
  541. elif body_type == 'json':
  542. obj = await DaraStream.read_as_json_async(_response.body)
  543. res = obj
  544. return {
  545. 'body': res,
  546. 'headers': _response.headers,
  547. 'statusCode': _response.status_code
  548. }
  549. elif body_type == 'array':
  550. arr = await DaraStream.read_as_json_async(_response.body)
  551. return {
  552. 'body': arr,
  553. 'headers': _response.headers,
  554. 'statusCode': _response.status_code
  555. }
  556. else:
  557. return {
  558. 'headers': _response.headers,
  559. 'statusCode': _response.status_code
  560. }
  561. except Exception as e:
  562. _context = RetryPolicyContext(
  563. retries_attempted= _retries_attempted,
  564. http_request = _last_request,
  565. http_response = _last_response,
  566. exception = e
  567. )
  568. continue
  569. raise UnretryableException(_context)
  570. """
  571. * @remarks
  572. * Encapsulate the request and invoke the network
  573. *
  574. * @param action - api name
  575. * @param version - product version
  576. * @param protocol - http or https
  577. * @param method - e.g. GET
  578. * @param authType - authorization type e.g. AK
  579. * @param pathname - pathname of every api
  580. * @param bodyType - response body type e.g. String
  581. * @param request - object of OpenApiRequest
  582. * @param runtime - which controls some details of call api, such as retry times
  583. * @returns the response
  584. """
  585. def do_roarequest(
  586. self,
  587. action: str,
  588. version: str,
  589. protocol: str,
  590. method: str,
  591. auth_type: str,
  592. pathname: str,
  593. body_type: str,
  594. request: open_api_util_models.OpenApiRequest,
  595. runtime: RuntimeOptions,
  596. ) -> dict:
  597. _runtime = {
  598. 'key': runtime.key or self._key,
  599. 'cert': runtime.cert or self._cert,
  600. 'ca': runtime.ca or self._ca,
  601. 'readTimeout': DaraCore.to_number(runtime.read_timeout or self._read_timeout),
  602. 'connectTimeout': DaraCore.to_number(runtime.connect_timeout or self._connect_timeout),
  603. 'httpProxy': runtime.http_proxy or self._http_proxy,
  604. 'httpsProxy': runtime.https_proxy or self._https_proxy,
  605. 'noProxy': runtime.no_proxy or self._no_proxy,
  606. 'socks5Proxy': runtime.socks_5proxy or self._socks_5proxy,
  607. 'socks5NetWork': runtime.socks_5net_work or self._socks_5net_work,
  608. 'maxIdleConns': DaraCore.to_number(runtime.max_idle_conns or self._max_idle_conns),
  609. 'retryOptions': self._retry_options,
  610. 'ignoreSSL': runtime.ignore_ssl,
  611. 'tlsMinVersion': self._tls_min_version,
  612. }
  613. _last_request = None
  614. _last_response = None
  615. _retries_attempted = 0
  616. _context = RetryPolicyContext(
  617. retries_attempted= _retries_attempted
  618. )
  619. while DaraCore.should_retry(_runtime.get('retryOptions'), _context):
  620. _backoff_time = 0
  621. if _retries_attempted > 0:
  622. _backoff_time = DaraCore.get_backoff_time(_runtime.get('retryOptions'), _context)
  623. if _backoff_time > 0:
  624. DaraCore.sleep(_backoff_time)
  625. _retry_attempts = _retries_attempted
  626. _retries_attempted = _retries_attempted + 1
  627. try:
  628. _request = DaraRequest()
  629. _request.protocol = self._protocol or protocol
  630. _request.method = method
  631. _request.pathname = pathname
  632. global_queries = {}
  633. global_headers = {}
  634. if not DaraCore.is_null(self._global_parameters):
  635. global_params = self._global_parameters
  636. if not DaraCore.is_null(global_params.queries):
  637. global_queries = global_params.queries
  638. if not DaraCore.is_null(global_params.headers):
  639. global_headers = global_params.headers
  640. extends_headers = {}
  641. extends_queries = {}
  642. if not DaraCore.is_null(runtime.extends_parameters):
  643. extends_parameters = runtime.extends_parameters
  644. if not DaraCore.is_null(extends_parameters.headers):
  645. extends_headers = extends_parameters.headers
  646. if not DaraCore.is_null(extends_parameters.queries):
  647. extends_queries = extends_parameters.queries
  648. _request.headers = DaraCore.merge({
  649. 'date': Utils.get_date_utcstring(),
  650. 'host': self._endpoint,
  651. 'accept': 'application/json',
  652. 'x-acs-signature-nonce': Utils.get_nonce(),
  653. 'x-acs-signature-method': 'HMAC-SHA1',
  654. 'x-acs-signature-version': '1.0',
  655. 'x-acs-version': version,
  656. 'x-acs-action': action,
  657. 'user-agent': Utils.get_user_agent(self._user_agent),
  658. }, global_headers, extends_headers, request.headers)
  659. Utils.apply_retry_headers(_request.headers, _retry_attempts, _backoff_time)
  660. if not DaraCore.is_null(request.body):
  661. _request.body = DaraCore.to_json_string(request.body)
  662. _request.headers["content-type"] = 'application/json; charset=utf-8'
  663. _request.query = DaraCore.merge({}, global_queries, extends_queries)
  664. if not DaraCore.is_null(request.query):
  665. _request.query = DaraCore.merge({}, _request.query, request.query)
  666. if auth_type != 'Anonymous':
  667. if DaraCore.is_null(self._credential):
  668. raise main_exceptions.ClientException(
  669. code = f'InvalidCredentials',
  670. 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.'
  671. )
  672. credential_model = self._credential.get_credential()
  673. if not DaraCore.is_null(credential_model.provider_name):
  674. _request.headers["x-acs-credentials-provider"] = credential_model.provider_name
  675. credential_type = credential_model.type
  676. if credential_type == 'bearer':
  677. bearer_token = credential_model.bearer_token
  678. _request.headers["x-acs-bearer-token"] = bearer_token
  679. _request.headers["x-acs-signature-type"] = 'BEARERTOKEN'
  680. elif credential_type == 'id_token':
  681. id_token = credential_model.security_token
  682. _request.headers["x-acs-zero-trust-idtoken"] = id_token
  683. else:
  684. access_key_id = credential_model.access_key_id
  685. access_key_secret = credential_model.access_key_secret
  686. security_token = credential_model.security_token
  687. if not DaraCore.is_null(security_token) and security_token != '':
  688. _request.headers["x-acs-accesskey-id"] = access_key_id
  689. _request.headers["x-acs-security-token"] = security_token
  690. string_to_sign = Utils.get_string_to_sign(_request)
  691. _request.headers["authorization"] = f'acs {access_key_id}:{Utils.get_roasignature(string_to_sign, access_key_secret)}'
  692. _last_request = _request
  693. _response = DaraCore.do_action(_request, _runtime)
  694. _last_response = _response
  695. if _response.status_code == 204:
  696. return {
  697. 'headers': _response.headers
  698. }
  699. if (_response.status_code >= 400) and (_response.status_code < 600):
  700. _res = DaraStream.read_as_json(_response.body)
  701. err = _res
  702. request_id = err.get("RequestId") or err.get("requestId")
  703. request_id = request_id or err.get("requestid")
  704. code = err.get("Code") or err.get("code")
  705. retry_after = Utils.get_throttling_time_left(_response.headers)
  706. if not DaraCore.is_null(retry_after):
  707. raise main_exceptions.ThrottlingException(
  708. status_code = _response.status_code,
  709. code = f'{code}',
  710. message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
  711. detail = f'{err.get("Detail") or err.get("detail")}',
  712. description = f'{err.get("Description") or err.get("description")}',
  713. retry_after = retry_after,
  714. data = err,
  715. request_id = f'{request_id}'
  716. )
  717. elif (_response.status_code >= 400) and (_response.status_code < 500):
  718. raise main_exceptions.ClientException(
  719. status_code = _response.status_code,
  720. code = f'{code}',
  721. message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
  722. detail = f'{err.get("Detail") or err.get("detail")}',
  723. description = f'{err.get("Description") or err.get("description")}',
  724. data = err,
  725. access_denied_detail = self.get_access_denied_detail(err),
  726. request_id = f'{request_id}'
  727. )
  728. else:
  729. raise main_exceptions.ServerException(
  730. status_code = _response.status_code,
  731. code = f'{code}',
  732. message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
  733. detail = f'{err.get("Detail") or err.get("detail")}',
  734. description = f'{err.get("Description") or err.get("description")}',
  735. data = err,
  736. request_id = f'{request_id}'
  737. )
  738. if body_type == 'binary':
  739. resp = {
  740. 'body': _response.body,
  741. 'headers': _response.headers,
  742. 'statusCode': _response.status_code
  743. }
  744. return resp
  745. elif body_type == 'byte':
  746. byt = DaraStream.read_as_bytes(_response.body)
  747. return {
  748. 'body': byt,
  749. 'headers': _response.headers,
  750. 'statusCode': _response.status_code
  751. }
  752. elif body_type == 'string':
  753. _str = DaraStream.read_as_string(_response.body)
  754. return {
  755. 'body': _str,
  756. 'headers': _response.headers,
  757. 'statusCode': _response.status_code
  758. }
  759. elif body_type == 'json':
  760. obj = DaraStream.read_as_json(_response.body)
  761. res = obj
  762. return {
  763. 'body': res,
  764. 'headers': _response.headers,
  765. 'statusCode': _response.status_code
  766. }
  767. elif body_type == 'array':
  768. arr = DaraStream.read_as_json(_response.body)
  769. return {
  770. 'body': arr,
  771. 'headers': _response.headers,
  772. 'statusCode': _response.status_code
  773. }
  774. else:
  775. return {
  776. 'headers': _response.headers,
  777. 'statusCode': _response.status_code
  778. }
  779. except Exception as e:
  780. _context = RetryPolicyContext(
  781. retries_attempted= _retries_attempted,
  782. http_request = _last_request,
  783. http_response = _last_response,
  784. exception = e
  785. )
  786. continue
  787. raise UnretryableException(_context)
  788. async def do_roarequest_async(
  789. self,
  790. action: str,
  791. version: str,
  792. protocol: str,
  793. method: str,
  794. auth_type: str,
  795. pathname: str,
  796. body_type: str,
  797. request: open_api_util_models.OpenApiRequest,
  798. runtime: RuntimeOptions,
  799. ) -> dict:
  800. _runtime = {
  801. 'key': runtime.key or self._key,
  802. 'cert': runtime.cert or self._cert,
  803. 'ca': runtime.ca or self._ca,
  804. 'readTimeout': DaraCore.to_number(runtime.read_timeout or self._read_timeout),
  805. 'connectTimeout': DaraCore.to_number(runtime.connect_timeout or self._connect_timeout),
  806. 'httpProxy': runtime.http_proxy or self._http_proxy,
  807. 'httpsProxy': runtime.https_proxy or self._https_proxy,
  808. 'noProxy': runtime.no_proxy or self._no_proxy,
  809. 'socks5Proxy': runtime.socks_5proxy or self._socks_5proxy,
  810. 'socks5NetWork': runtime.socks_5net_work or self._socks_5net_work,
  811. 'maxIdleConns': DaraCore.to_number(runtime.max_idle_conns or self._max_idle_conns),
  812. 'retryOptions': self._retry_options,
  813. 'ignoreSSL': runtime.ignore_ssl,
  814. 'tlsMinVersion': self._tls_min_version,
  815. }
  816. _last_request = None
  817. _last_response = None
  818. _retries_attempted = 0
  819. _context = RetryPolicyContext(
  820. retries_attempted= _retries_attempted
  821. )
  822. while DaraCore.should_retry(_runtime.get('retryOptions'), _context):
  823. _backoff_time = 0
  824. if _retries_attempted > 0:
  825. _backoff_time = DaraCore.get_backoff_time(_runtime.get('retryOptions'), _context)
  826. if _backoff_time > 0:
  827. DaraCore.sleep(_backoff_time)
  828. _retry_attempts = _retries_attempted
  829. _retries_attempted = _retries_attempted + 1
  830. try:
  831. _request = DaraRequest()
  832. _request.protocol = self._protocol or protocol
  833. _request.method = method
  834. _request.pathname = pathname
  835. global_queries = {}
  836. global_headers = {}
  837. if not DaraCore.is_null(self._global_parameters):
  838. global_params = self._global_parameters
  839. if not DaraCore.is_null(global_params.queries):
  840. global_queries = global_params.queries
  841. if not DaraCore.is_null(global_params.headers):
  842. global_headers = global_params.headers
  843. extends_headers = {}
  844. extends_queries = {}
  845. if not DaraCore.is_null(runtime.extends_parameters):
  846. extends_parameters = runtime.extends_parameters
  847. if not DaraCore.is_null(extends_parameters.headers):
  848. extends_headers = extends_parameters.headers
  849. if not DaraCore.is_null(extends_parameters.queries):
  850. extends_queries = extends_parameters.queries
  851. _request.headers = DaraCore.merge({
  852. 'date': Utils.get_date_utcstring(),
  853. 'host': self._endpoint,
  854. 'accept': 'application/json',
  855. 'x-acs-signature-nonce': Utils.get_nonce(),
  856. 'x-acs-signature-method': 'HMAC-SHA1',
  857. 'x-acs-signature-version': '1.0',
  858. 'x-acs-version': version,
  859. 'x-acs-action': action,
  860. 'user-agent': Utils.get_user_agent(self._user_agent),
  861. }, global_headers, extends_headers, request.headers)
  862. Utils.apply_retry_headers(_request.headers, _retry_attempts, _backoff_time)
  863. if not DaraCore.is_null(request.body):
  864. _request.body = DaraCore.to_json_string(request.body)
  865. _request.headers["content-type"] = 'application/json; charset=utf-8'
  866. _request.query = DaraCore.merge({}, global_queries, extends_queries)
  867. if not DaraCore.is_null(request.query):
  868. _request.query = DaraCore.merge({}, _request.query, request.query)
  869. if auth_type != 'Anonymous':
  870. if DaraCore.is_null(self._credential):
  871. raise main_exceptions.ClientException(
  872. code = f'InvalidCredentials',
  873. 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.'
  874. )
  875. credential_model = await self._credential.get_credential_async()
  876. if not DaraCore.is_null(credential_model.provider_name):
  877. _request.headers["x-acs-credentials-provider"] = credential_model.provider_name
  878. credential_type = credential_model.type
  879. if credential_type == 'bearer':
  880. bearer_token = credential_model.bearer_token
  881. _request.headers["x-acs-bearer-token"] = bearer_token
  882. _request.headers["x-acs-signature-type"] = 'BEARERTOKEN'
  883. elif credential_type == 'id_token':
  884. id_token = credential_model.security_token
  885. _request.headers["x-acs-zero-trust-idtoken"] = id_token
  886. else:
  887. access_key_id = credential_model.access_key_id
  888. access_key_secret = credential_model.access_key_secret
  889. security_token = credential_model.security_token
  890. if not DaraCore.is_null(security_token) and security_token != '':
  891. _request.headers["x-acs-accesskey-id"] = access_key_id
  892. _request.headers["x-acs-security-token"] = security_token
  893. string_to_sign = Utils.get_string_to_sign(_request)
  894. _request.headers["authorization"] = f'acs {access_key_id}:{Utils.get_roasignature(string_to_sign, access_key_secret)}'
  895. _last_request = _request
  896. _response = await DaraCore.async_do_action(_request, _runtime)
  897. _last_response = _response
  898. if _response.status_code == 204:
  899. return {
  900. 'headers': _response.headers
  901. }
  902. if (_response.status_code >= 400) and (_response.status_code < 600):
  903. _res = await DaraStream.read_as_json_async(_response.body)
  904. err = _res
  905. request_id = err.get("RequestId") or err.get("requestId")
  906. request_id = request_id or err.get("requestid")
  907. code = err.get("Code") or err.get("code")
  908. retry_after = Utils.get_throttling_time_left(_response.headers)
  909. if not DaraCore.is_null(retry_after):
  910. raise main_exceptions.ThrottlingException(
  911. status_code = _response.status_code,
  912. code = f'{code}',
  913. message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
  914. detail = f'{err.get("Detail") or err.get("detail")}',
  915. description = f'{err.get("Description") or err.get("description")}',
  916. retry_after = retry_after,
  917. data = err,
  918. request_id = f'{request_id}'
  919. )
  920. elif (_response.status_code >= 400) and (_response.status_code < 500):
  921. raise main_exceptions.ClientException(
  922. status_code = _response.status_code,
  923. code = f'{code}',
  924. message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
  925. detail = f'{err.get("Detail") or err.get("detail")}',
  926. description = f'{err.get("Description") or err.get("description")}',
  927. data = err,
  928. access_denied_detail = self.get_access_denied_detail(err),
  929. request_id = f'{request_id}'
  930. )
  931. else:
  932. raise main_exceptions.ServerException(
  933. status_code = _response.status_code,
  934. code = f'{code}',
  935. message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
  936. detail = f'{err.get("Detail") or err.get("detail")}',
  937. description = f'{err.get("Description") or err.get("description")}',
  938. data = err,
  939. request_id = f'{request_id}'
  940. )
  941. if body_type == 'binary':
  942. resp = {
  943. 'body': _response.body,
  944. 'headers': _response.headers,
  945. 'statusCode': _response.status_code
  946. }
  947. return resp
  948. elif body_type == 'byte':
  949. byt = await DaraStream.read_as_bytes_async(_response.body)
  950. return {
  951. 'body': byt,
  952. 'headers': _response.headers,
  953. 'statusCode': _response.status_code
  954. }
  955. elif body_type == 'string':
  956. _str = await DaraStream.read_as_string_async(_response.body)
  957. return {
  958. 'body': _str,
  959. 'headers': _response.headers,
  960. 'statusCode': _response.status_code
  961. }
  962. elif body_type == 'json':
  963. obj = await DaraStream.read_as_json_async(_response.body)
  964. res = obj
  965. return {
  966. 'body': res,
  967. 'headers': _response.headers,
  968. 'statusCode': _response.status_code
  969. }
  970. elif body_type == 'array':
  971. arr = await DaraStream.read_as_json_async(_response.body)
  972. return {
  973. 'body': arr,
  974. 'headers': _response.headers,
  975. 'statusCode': _response.status_code
  976. }
  977. else:
  978. return {
  979. 'headers': _response.headers,
  980. 'statusCode': _response.status_code
  981. }
  982. except Exception as e:
  983. _context = RetryPolicyContext(
  984. retries_attempted= _retries_attempted,
  985. http_request = _last_request,
  986. http_response = _last_response,
  987. exception = e
  988. )
  989. continue
  990. raise UnretryableException(_context)
  991. """
  992. * @remarks
  993. * Encapsulate the request and invoke the network with form body
  994. *
  995. * @param action - api name
  996. * @param version - product version
  997. * @param protocol - http or https
  998. * @param method - e.g. GET
  999. * @param authType - authorization type e.g. AK
  1000. * @param pathname - pathname of every api
  1001. * @param bodyType - response body type e.g. String
  1002. * @param request - object of OpenApiRequest
  1003. * @param runtime - which controls some details of call api, such as retry times
  1004. * @returns the response
  1005. """
  1006. def do_roarequest_with_form(
  1007. self,
  1008. action: str,
  1009. version: str,
  1010. protocol: str,
  1011. method: str,
  1012. auth_type: str,
  1013. pathname: str,
  1014. body_type: str,
  1015. request: open_api_util_models.OpenApiRequest,
  1016. runtime: RuntimeOptions,
  1017. ) -> dict:
  1018. _runtime = {
  1019. 'key': runtime.key or self._key,
  1020. 'cert': runtime.cert or self._cert,
  1021. 'ca': runtime.ca or self._ca,
  1022. 'readTimeout': DaraCore.to_number(runtime.read_timeout or self._read_timeout),
  1023. 'connectTimeout': DaraCore.to_number(runtime.connect_timeout or self._connect_timeout),
  1024. 'httpProxy': runtime.http_proxy or self._http_proxy,
  1025. 'httpsProxy': runtime.https_proxy or self._https_proxy,
  1026. 'noProxy': runtime.no_proxy or self._no_proxy,
  1027. 'socks5Proxy': runtime.socks_5proxy or self._socks_5proxy,
  1028. 'socks5NetWork': runtime.socks_5net_work or self._socks_5net_work,
  1029. 'maxIdleConns': DaraCore.to_number(runtime.max_idle_conns or self._max_idle_conns),
  1030. 'retryOptions': self._retry_options,
  1031. 'ignoreSSL': runtime.ignore_ssl,
  1032. 'tlsMinVersion': self._tls_min_version,
  1033. }
  1034. _last_request = None
  1035. _last_response = None
  1036. _retries_attempted = 0
  1037. _context = RetryPolicyContext(
  1038. retries_attempted= _retries_attempted
  1039. )
  1040. while DaraCore.should_retry(_runtime.get('retryOptions'), _context):
  1041. _backoff_time = 0
  1042. if _retries_attempted > 0:
  1043. _backoff_time = DaraCore.get_backoff_time(_runtime.get('retryOptions'), _context)
  1044. if _backoff_time > 0:
  1045. DaraCore.sleep(_backoff_time)
  1046. _retry_attempts = _retries_attempted
  1047. _retries_attempted = _retries_attempted + 1
  1048. try:
  1049. _request = DaraRequest()
  1050. _request.protocol = self._protocol or protocol
  1051. _request.method = method
  1052. _request.pathname = pathname
  1053. global_queries = {}
  1054. global_headers = {}
  1055. if not DaraCore.is_null(self._global_parameters):
  1056. global_params = self._global_parameters
  1057. if not DaraCore.is_null(global_params.queries):
  1058. global_queries = global_params.queries
  1059. if not DaraCore.is_null(global_params.headers):
  1060. global_headers = global_params.headers
  1061. extends_headers = {}
  1062. extends_queries = {}
  1063. if not DaraCore.is_null(runtime.extends_parameters):
  1064. extends_parameters = runtime.extends_parameters
  1065. if not DaraCore.is_null(extends_parameters.headers):
  1066. extends_headers = extends_parameters.headers
  1067. if not DaraCore.is_null(extends_parameters.queries):
  1068. extends_queries = extends_parameters.queries
  1069. _request.headers = DaraCore.merge({
  1070. 'date': Utils.get_date_utcstring(),
  1071. 'host': self._endpoint,
  1072. 'accept': 'application/json',
  1073. 'x-acs-signature-nonce': Utils.get_nonce(),
  1074. 'x-acs-signature-method': 'HMAC-SHA1',
  1075. 'x-acs-signature-version': '1.0',
  1076. 'x-acs-version': version,
  1077. 'x-acs-action': action,
  1078. 'user-agent': Utils.get_user_agent(self._user_agent),
  1079. }, global_headers, extends_headers, request.headers)
  1080. Utils.apply_retry_headers(_request.headers, _retry_attempts, _backoff_time)
  1081. if not DaraCore.is_null(request.body):
  1082. m = request.body
  1083. _request.body = Utils.to_form(m)
  1084. _request.headers["content-type"] = 'application/x-www-form-urlencoded'
  1085. _request.query = DaraCore.merge({}, global_queries, extends_queries)
  1086. if not DaraCore.is_null(request.query):
  1087. _request.query = DaraCore.merge({}, _request.query, request.query)
  1088. if auth_type != 'Anonymous':
  1089. if DaraCore.is_null(self._credential):
  1090. raise main_exceptions.ClientException(
  1091. code = f'InvalidCredentials',
  1092. 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.'
  1093. )
  1094. credential_model = self._credential.get_credential()
  1095. if not DaraCore.is_null(credential_model.provider_name):
  1096. _request.headers["x-acs-credentials-provider"] = credential_model.provider_name
  1097. credential_type = credential_model.type
  1098. if credential_type == 'bearer':
  1099. bearer_token = credential_model.bearer_token
  1100. _request.headers["x-acs-bearer-token"] = bearer_token
  1101. _request.headers["x-acs-signature-type"] = 'BEARERTOKEN'
  1102. elif credential_type == 'id_token':
  1103. id_token = credential_model.security_token
  1104. _request.headers["x-acs-zero-trust-idtoken"] = id_token
  1105. else:
  1106. access_key_id = credential_model.access_key_id
  1107. access_key_secret = credential_model.access_key_secret
  1108. security_token = credential_model.security_token
  1109. if not DaraCore.is_null(security_token) and security_token != '':
  1110. _request.headers["x-acs-accesskey-id"] = access_key_id
  1111. _request.headers["x-acs-security-token"] = security_token
  1112. string_to_sign = Utils.get_string_to_sign(_request)
  1113. _request.headers["authorization"] = f'acs {access_key_id}:{Utils.get_roasignature(string_to_sign, access_key_secret)}'
  1114. _last_request = _request
  1115. _response = DaraCore.do_action(_request, _runtime)
  1116. _last_response = _response
  1117. if _response.status_code == 204:
  1118. return {
  1119. 'headers': _response.headers
  1120. }
  1121. if (_response.status_code >= 400) and (_response.status_code < 600):
  1122. _res = DaraStream.read_as_json(_response.body)
  1123. err = _res
  1124. request_id = err.get("RequestId") or err.get("requestId")
  1125. code = err.get("Code") or err.get("code")
  1126. retry_after = Utils.get_throttling_time_left(_response.headers)
  1127. if not DaraCore.is_null(retry_after):
  1128. raise main_exceptions.ThrottlingException(
  1129. status_code = _response.status_code,
  1130. code = f'{code}',
  1131. message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
  1132. detail = f'{err.get("Detail") or err.get("detail")}',
  1133. description = f'{err.get("Description") or err.get("description")}',
  1134. retry_after = retry_after,
  1135. data = err,
  1136. request_id = f'{request_id}'
  1137. )
  1138. elif (_response.status_code >= 400) and (_response.status_code < 500):
  1139. raise main_exceptions.ClientException(
  1140. status_code = _response.status_code,
  1141. code = f'{code}',
  1142. message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
  1143. detail = f'{err.get("Detail") or err.get("detail")}',
  1144. description = f'{err.get("Description") or err.get("description")}',
  1145. data = err,
  1146. access_denied_detail = self.get_access_denied_detail(err),
  1147. request_id = f'{request_id}'
  1148. )
  1149. else:
  1150. raise main_exceptions.ServerException(
  1151. status_code = _response.status_code,
  1152. code = f'{code}',
  1153. message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
  1154. detail = f'{err.get("Detail") or err.get("detail")}',
  1155. description = f'{err.get("Description") or err.get("description")}',
  1156. data = err,
  1157. request_id = f'{request_id}'
  1158. )
  1159. if body_type == 'binary':
  1160. resp = {
  1161. 'body': _response.body,
  1162. 'headers': _response.headers,
  1163. 'statusCode': _response.status_code
  1164. }
  1165. return resp
  1166. elif body_type == 'byte':
  1167. byt = DaraStream.read_as_bytes(_response.body)
  1168. return {
  1169. 'body': byt,
  1170. 'headers': _response.headers,
  1171. 'statusCode': _response.status_code
  1172. }
  1173. elif body_type == 'string':
  1174. _str = DaraStream.read_as_string(_response.body)
  1175. return {
  1176. 'body': _str,
  1177. 'headers': _response.headers,
  1178. 'statusCode': _response.status_code
  1179. }
  1180. elif body_type == 'json':
  1181. obj = DaraStream.read_as_json(_response.body)
  1182. res = obj
  1183. return {
  1184. 'body': res,
  1185. 'headers': _response.headers,
  1186. 'statusCode': _response.status_code
  1187. }
  1188. elif body_type == 'array':
  1189. arr = DaraStream.read_as_json(_response.body)
  1190. return {
  1191. 'body': arr,
  1192. 'headers': _response.headers,
  1193. 'statusCode': _response.status_code
  1194. }
  1195. else:
  1196. return {
  1197. 'headers': _response.headers,
  1198. 'statusCode': _response.status_code
  1199. }
  1200. except Exception as e:
  1201. _context = RetryPolicyContext(
  1202. retries_attempted= _retries_attempted,
  1203. http_request = _last_request,
  1204. http_response = _last_response,
  1205. exception = e
  1206. )
  1207. continue
  1208. raise UnretryableException(_context)
  1209. async def do_roarequest_with_form_async(
  1210. self,
  1211. action: str,
  1212. version: str,
  1213. protocol: str,
  1214. method: str,
  1215. auth_type: str,
  1216. pathname: str,
  1217. body_type: str,
  1218. request: open_api_util_models.OpenApiRequest,
  1219. runtime: RuntimeOptions,
  1220. ) -> dict:
  1221. _runtime = {
  1222. 'key': runtime.key or self._key,
  1223. 'cert': runtime.cert or self._cert,
  1224. 'ca': runtime.ca or self._ca,
  1225. 'readTimeout': DaraCore.to_number(runtime.read_timeout or self._read_timeout),
  1226. 'connectTimeout': DaraCore.to_number(runtime.connect_timeout or self._connect_timeout),
  1227. 'httpProxy': runtime.http_proxy or self._http_proxy,
  1228. 'httpsProxy': runtime.https_proxy or self._https_proxy,
  1229. 'noProxy': runtime.no_proxy or self._no_proxy,
  1230. 'socks5Proxy': runtime.socks_5proxy or self._socks_5proxy,
  1231. 'socks5NetWork': runtime.socks_5net_work or self._socks_5net_work,
  1232. 'maxIdleConns': DaraCore.to_number(runtime.max_idle_conns or self._max_idle_conns),
  1233. 'retryOptions': self._retry_options,
  1234. 'ignoreSSL': runtime.ignore_ssl,
  1235. 'tlsMinVersion': self._tls_min_version,
  1236. }
  1237. _last_request = None
  1238. _last_response = None
  1239. _retries_attempted = 0
  1240. _context = RetryPolicyContext(
  1241. retries_attempted= _retries_attempted
  1242. )
  1243. while DaraCore.should_retry(_runtime.get('retryOptions'), _context):
  1244. _backoff_time = 0
  1245. if _retries_attempted > 0:
  1246. _backoff_time = DaraCore.get_backoff_time(_runtime.get('retryOptions'), _context)
  1247. if _backoff_time > 0:
  1248. DaraCore.sleep(_backoff_time)
  1249. _retry_attempts = _retries_attempted
  1250. _retries_attempted = _retries_attempted + 1
  1251. try:
  1252. _request = DaraRequest()
  1253. _request.protocol = self._protocol or protocol
  1254. _request.method = method
  1255. _request.pathname = pathname
  1256. global_queries = {}
  1257. global_headers = {}
  1258. if not DaraCore.is_null(self._global_parameters):
  1259. global_params = self._global_parameters
  1260. if not DaraCore.is_null(global_params.queries):
  1261. global_queries = global_params.queries
  1262. if not DaraCore.is_null(global_params.headers):
  1263. global_headers = global_params.headers
  1264. extends_headers = {}
  1265. extends_queries = {}
  1266. if not DaraCore.is_null(runtime.extends_parameters):
  1267. extends_parameters = runtime.extends_parameters
  1268. if not DaraCore.is_null(extends_parameters.headers):
  1269. extends_headers = extends_parameters.headers
  1270. if not DaraCore.is_null(extends_parameters.queries):
  1271. extends_queries = extends_parameters.queries
  1272. _request.headers = DaraCore.merge({
  1273. 'date': Utils.get_date_utcstring(),
  1274. 'host': self._endpoint,
  1275. 'accept': 'application/json',
  1276. 'x-acs-signature-nonce': Utils.get_nonce(),
  1277. 'x-acs-signature-method': 'HMAC-SHA1',
  1278. 'x-acs-signature-version': '1.0',
  1279. 'x-acs-version': version,
  1280. 'x-acs-action': action,
  1281. 'user-agent': Utils.get_user_agent(self._user_agent),
  1282. }, global_headers, extends_headers, request.headers)
  1283. Utils.apply_retry_headers(_request.headers, _retry_attempts, _backoff_time)
  1284. if not DaraCore.is_null(request.body):
  1285. m = request.body
  1286. _request.body = Utils.to_form(m)
  1287. _request.headers["content-type"] = 'application/x-www-form-urlencoded'
  1288. _request.query = DaraCore.merge({}, global_queries, extends_queries)
  1289. if not DaraCore.is_null(request.query):
  1290. _request.query = DaraCore.merge({}, _request.query, request.query)
  1291. if auth_type != 'Anonymous':
  1292. if DaraCore.is_null(self._credential):
  1293. raise main_exceptions.ClientException(
  1294. code = f'InvalidCredentials',
  1295. 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.'
  1296. )
  1297. credential_model = await self._credential.get_credential_async()
  1298. if not DaraCore.is_null(credential_model.provider_name):
  1299. _request.headers["x-acs-credentials-provider"] = credential_model.provider_name
  1300. credential_type = credential_model.type
  1301. if credential_type == 'bearer':
  1302. bearer_token = credential_model.bearer_token
  1303. _request.headers["x-acs-bearer-token"] = bearer_token
  1304. _request.headers["x-acs-signature-type"] = 'BEARERTOKEN'
  1305. elif credential_type == 'id_token':
  1306. id_token = credential_model.security_token
  1307. _request.headers["x-acs-zero-trust-idtoken"] = id_token
  1308. else:
  1309. access_key_id = credential_model.access_key_id
  1310. access_key_secret = credential_model.access_key_secret
  1311. security_token = credential_model.security_token
  1312. if not DaraCore.is_null(security_token) and security_token != '':
  1313. _request.headers["x-acs-accesskey-id"] = access_key_id
  1314. _request.headers["x-acs-security-token"] = security_token
  1315. string_to_sign = Utils.get_string_to_sign(_request)
  1316. _request.headers["authorization"] = f'acs {access_key_id}:{Utils.get_roasignature(string_to_sign, access_key_secret)}'
  1317. _last_request = _request
  1318. _response = await DaraCore.async_do_action(_request, _runtime)
  1319. _last_response = _response
  1320. if _response.status_code == 204:
  1321. return {
  1322. 'headers': _response.headers
  1323. }
  1324. if (_response.status_code >= 400) and (_response.status_code < 600):
  1325. _res = await DaraStream.read_as_json_async(_response.body)
  1326. err = _res
  1327. request_id = err.get("RequestId") or err.get("requestId")
  1328. code = err.get("Code") or err.get("code")
  1329. retry_after = Utils.get_throttling_time_left(_response.headers)
  1330. if not DaraCore.is_null(retry_after):
  1331. raise main_exceptions.ThrottlingException(
  1332. status_code = _response.status_code,
  1333. code = f'{code}',
  1334. message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
  1335. detail = f'{err.get("Detail") or err.get("detail")}',
  1336. description = f'{err.get("Description") or err.get("description")}',
  1337. retry_after = retry_after,
  1338. data = err,
  1339. request_id = f'{request_id}'
  1340. )
  1341. elif (_response.status_code >= 400) and (_response.status_code < 500):
  1342. raise main_exceptions.ClientException(
  1343. status_code = _response.status_code,
  1344. code = f'{code}',
  1345. message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
  1346. detail = f'{err.get("Detail") or err.get("detail")}',
  1347. description = f'{err.get("Description") or err.get("description")}',
  1348. data = err,
  1349. access_denied_detail = self.get_access_denied_detail(err),
  1350. request_id = f'{request_id}'
  1351. )
  1352. else:
  1353. raise main_exceptions.ServerException(
  1354. status_code = _response.status_code,
  1355. code = f'{code}',
  1356. message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
  1357. detail = f'{err.get("Detail") or err.get("detail")}',
  1358. description = f'{err.get("Description") or err.get("description")}',
  1359. data = err,
  1360. request_id = f'{request_id}'
  1361. )
  1362. if body_type == 'binary':
  1363. resp = {
  1364. 'body': _response.body,
  1365. 'headers': _response.headers,
  1366. 'statusCode': _response.status_code
  1367. }
  1368. return resp
  1369. elif body_type == 'byte':
  1370. byt = await DaraStream.read_as_bytes_async(_response.body)
  1371. return {
  1372. 'body': byt,
  1373. 'headers': _response.headers,
  1374. 'statusCode': _response.status_code
  1375. }
  1376. elif body_type == 'string':
  1377. _str = await DaraStream.read_as_string_async(_response.body)
  1378. return {
  1379. 'body': _str,
  1380. 'headers': _response.headers,
  1381. 'statusCode': _response.status_code
  1382. }
  1383. elif body_type == 'json':
  1384. obj = await DaraStream.read_as_json_async(_response.body)
  1385. res = obj
  1386. return {
  1387. 'body': res,
  1388. 'headers': _response.headers,
  1389. 'statusCode': _response.status_code
  1390. }
  1391. elif body_type == 'array':
  1392. arr = await DaraStream.read_as_json_async(_response.body)
  1393. return {
  1394. 'body': arr,
  1395. 'headers': _response.headers,
  1396. 'statusCode': _response.status_code
  1397. }
  1398. else:
  1399. return {
  1400. 'headers': _response.headers,
  1401. 'statusCode': _response.status_code
  1402. }
  1403. except Exception as e:
  1404. _context = RetryPolicyContext(
  1405. retries_attempted= _retries_attempted,
  1406. http_request = _last_request,
  1407. http_response = _last_response,
  1408. exception = e
  1409. )
  1410. continue
  1411. raise UnretryableException(_context)
  1412. """
  1413. * @remarks
  1414. * Encapsulate the request and invoke the network
  1415. *
  1416. * @param action - api name
  1417. * @param version - product version
  1418. * @param protocol - http or https
  1419. * @param method - e.g. GET
  1420. * @param authType - authorization type e.g. AK
  1421. * @param bodyType - response body type e.g. String
  1422. * @param request - object of OpenApiRequest
  1423. * @param runtime - which controls some details of call api, such as retry times
  1424. * @returns the response
  1425. """
  1426. def do_request(
  1427. self,
  1428. params: open_api_util_models.Params,
  1429. request: open_api_util_models.OpenApiRequest,
  1430. runtime: RuntimeOptions,
  1431. ) -> dict:
  1432. protocol = f'{self._protocol or params.protocol or ""}'.lower()
  1433. is_websocket = protocol in ('ws', 'wss')
  1434. ws_handler = None
  1435. if is_websocket:
  1436. websocket_sub_protocol = params.websocket_sub_protocol or ''
  1437. if not websocket_sub_protocol:
  1438. raise main_exceptions.ClientException(
  1439. code='MissingWebSocketSubProtocol',
  1440. message='websocketSubProtocol is required: please set it in params.websocketSubProtocol',
  1441. )
  1442. if websocket_sub_protocol not in (
  1443. websocket_utils.SubProtocolAWAP,
  1444. websocket_utils.SubProtocolGeneral,
  1445. ):
  1446. raise main_exceptions.ClientException(
  1447. code='InvalidWebSocketSubProtocol',
  1448. message=(
  1449. "websocketSubProtocol must be 'awap' or 'general', "
  1450. f'got: {websocket_sub_protocol}'
  1451. ),
  1452. )
  1453. if request.headers is None:
  1454. request.headers = {}
  1455. request.headers['sec-websocket-protocol'] = websocket_sub_protocol
  1456. ws_handler = runtime.web_socket_handler
  1457. if ws_handler is None:
  1458. raise main_exceptions.ClientException(
  1459. code='MissingWebSocketHandler',
  1460. message='WebSocketHandler is required: please set it in runtime.webSocketHandler',
  1461. )
  1462. _runtime = {
  1463. 'key': runtime.key or self._key,
  1464. 'cert': runtime.cert or self._cert,
  1465. 'ca': runtime.ca or self._ca,
  1466. 'readTimeout': DaraCore.to_number(runtime.read_timeout or self._read_timeout),
  1467. 'connectTimeout': DaraCore.to_number(runtime.connect_timeout or self._connect_timeout),
  1468. 'httpProxy': runtime.http_proxy or self._http_proxy,
  1469. 'httpsProxy': runtime.https_proxy or self._https_proxy,
  1470. 'noProxy': runtime.no_proxy or self._no_proxy,
  1471. 'socks5Proxy': runtime.socks_5proxy or self._socks_5proxy,
  1472. 'socks5NetWork': runtime.socks_5net_work or self._socks_5net_work,
  1473. 'maxIdleConns': DaraCore.to_number(runtime.max_idle_conns or self._max_idle_conns),
  1474. 'retryOptions': self._retry_options,
  1475. 'ignoreSSL': runtime.ignore_ssl,
  1476. 'tlsMinVersion': self._tls_min_version,
  1477. }
  1478. if is_websocket:
  1479. _runtime.update({
  1480. 'webSocketPingInterval': get_web_socket_ping_interval(runtime),
  1481. 'webSocketPongTimeout': get_web_socket_pong_timeout(runtime),
  1482. 'webSocketEnableReconnect': get_web_socket_enable_reconnect(runtime),
  1483. 'webSocketReconnectInterval': get_web_socket_reconnect_interval(runtime),
  1484. 'webSocketMaxReconnectTimes': get_web_socket_max_reconnect_times(runtime),
  1485. 'webSocketWriteTimeout': get_web_socket_write_timeout(runtime),
  1486. 'webSocketHandshakeTimeout': get_web_socket_handshake_timeout(runtime),
  1487. 'webSocketHandler': ws_handler,
  1488. })
  1489. _last_request = None
  1490. _last_response = None
  1491. _retries_attempted = 0
  1492. _context = RetryPolicyContext(
  1493. retries_attempted= _retries_attempted
  1494. )
  1495. while DaraCore.should_retry(_runtime.get('retryOptions'), _context):
  1496. _backoff_time = 0
  1497. if _retries_attempted > 0:
  1498. _backoff_time = DaraCore.get_backoff_time(_runtime.get('retryOptions'), _context)
  1499. if _backoff_time > 0:
  1500. DaraCore.sleep(_backoff_time)
  1501. _retry_attempts = _retries_attempted
  1502. _retries_attempted = _retries_attempted + 1
  1503. try:
  1504. _request = DaraRequest()
  1505. _request.protocol = self._protocol or params.protocol
  1506. _request.method = params.method
  1507. _request.pathname = params.pathname
  1508. global_queries = {}
  1509. global_headers = {}
  1510. if not DaraCore.is_null(self._global_parameters):
  1511. global_params = self._global_parameters
  1512. if not DaraCore.is_null(global_params.queries):
  1513. global_queries = global_params.queries
  1514. if not DaraCore.is_null(global_params.headers):
  1515. global_headers = global_params.headers
  1516. extends_headers = {}
  1517. extends_queries = {}
  1518. if not DaraCore.is_null(runtime.extends_parameters):
  1519. extends_parameters = runtime.extends_parameters
  1520. if not DaraCore.is_null(extends_parameters.headers):
  1521. extends_headers = extends_parameters.headers
  1522. if not DaraCore.is_null(extends_parameters.queries):
  1523. extends_queries = extends_parameters.queries
  1524. _request.query = DaraCore.merge({}, global_queries, extends_queries, request.query)
  1525. # endpoint is setted in product client
  1526. _request.headers = DaraCore.merge({
  1527. 'host': self._endpoint,
  1528. 'x-acs-version': params.version,
  1529. 'x-acs-action': params.action,
  1530. 'user-agent': Utils.get_user_agent(self._user_agent),
  1531. 'x-acs-date': Utils.get_timestamp(),
  1532. 'x-acs-signature-nonce': Utils.get_nonce(),
  1533. 'accept': 'application/json',
  1534. }, global_headers, extends_headers, request.headers)
  1535. if params.style == 'RPC':
  1536. headers = self.get_rpc_headers()
  1537. if not DaraCore.is_null(headers):
  1538. _request.headers = DaraCore.merge({}, _request.headers, headers)
  1539. Utils.apply_retry_headers(_request.headers, _retry_attempts, _backoff_time)
  1540. signature_algorithm = self._signature_algorithm or 'ACS3-HMAC-SHA256'
  1541. hashed_request_payload = Utils.hash(DaraBytes.from_('', 'utf-8'), signature_algorithm)
  1542. if not DaraCore.is_null(request.stream):
  1543. tmp = DaraStream.read_as_bytes(request.stream)
  1544. hashed_request_payload = Utils.hash(tmp, signature_algorithm)
  1545. _request.body = tmp
  1546. _request.headers["content-type"] = 'application/octet-stream'
  1547. else:
  1548. if not DaraCore.is_null(request.body):
  1549. if params.req_body_type == 'byte':
  1550. byte_obj = bytes(request.body)
  1551. hashed_request_payload = Utils.hash(byte_obj, signature_algorithm)
  1552. _request.body = byte_obj
  1553. elif params.req_body_type == 'json':
  1554. json_obj = DaraCore.to_json_string(request.body)
  1555. hashed_request_payload = Utils.hash(json_obj.encode('utf-8'), signature_algorithm)
  1556. _request.body = json_obj
  1557. _request.headers["content-type"] = 'application/json; charset=utf-8'
  1558. else:
  1559. m = request.body
  1560. form_obj = Utils.to_form(m)
  1561. hashed_request_payload = Utils.hash(form_obj.encode('utf-8'), signature_algorithm)
  1562. _request.body = form_obj
  1563. _request.headers["content-type"] = 'application/x-www-form-urlencoded'
  1564. _request.headers["x-acs-content-sha256"] = hashed_request_payload.hex()
  1565. if params.auth_type != 'Anonymous':
  1566. if DaraCore.is_null(self._credential):
  1567. raise main_exceptions.ClientException(
  1568. code = f'InvalidCredentials',
  1569. 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.'
  1570. )
  1571. credential_model = self._credential.get_credential()
  1572. if not DaraCore.is_null(credential_model.provider_name):
  1573. _request.headers["x-acs-credentials-provider"] = credential_model.provider_name
  1574. auth_type = credential_model.type
  1575. if auth_type == 'bearer':
  1576. bearer_token = credential_model.bearer_token
  1577. _request.headers["x-acs-bearer-token"] = bearer_token
  1578. if params.style == 'RPC':
  1579. _request.query["SignatureType"] = 'BEARERTOKEN'
  1580. else:
  1581. _request.headers["x-acs-signature-type"] = 'BEARERTOKEN'
  1582. elif auth_type == 'id_token':
  1583. id_token = credential_model.security_token
  1584. _request.headers["x-acs-zero-trust-idtoken"] = id_token
  1585. else:
  1586. access_key_id = credential_model.access_key_id
  1587. access_key_secret = credential_model.access_key_secret
  1588. security_token = credential_model.security_token
  1589. if not DaraCore.is_null(security_token) and security_token != '':
  1590. _request.headers["x-acs-accesskey-id"] = access_key_id
  1591. _request.headers["x-acs-security-token"] = security_token
  1592. _request.headers["Authorization"] = Utils.get_authorization(_request, signature_algorithm, hashed_request_payload.hex(), access_key_id, access_key_secret)
  1593. else:
  1594. if params.style == 'RPC':
  1595. _request.query["Format"] = 'json'
  1596. _last_request = _request
  1597. if is_websocket:
  1598. stream_handler = websocket_utils.StreamHandler(
  1599. ws_handler,
  1600. websocket_sub_protocol,
  1601. )
  1602. _runtime['webSocketHandler'] = stream_handler
  1603. ws_client, response_ = new_websocket_client_and_connect(_request, _runtime)
  1604. ws_client_obj = websocket_utils.new_websocket_client(ws_client, response_)
  1605. stream_handler.client = ws_client_obj
  1606. return {
  1607. 'webSocketClient': ws_client_obj,
  1608. }
  1609. _response = DaraCore.do_action(_request, _runtime)
  1610. _last_response = _response
  1611. if (_response.status_code >= 400) and (_response.status_code < 600):
  1612. err = {}
  1613. if not DaraCore.is_null(_response.headers.get("content-type")) and _response.headers.get("content-type") == 'text/xml;charset=utf-8':
  1614. _str = DaraStream.read_as_string(_response.body)
  1615. resp_map = DaraXML.parse_xml(_str, None)
  1616. err = resp_map.get("Error")
  1617. else:
  1618. _res = DaraStream.read_as_json(_response.body)
  1619. err = _res
  1620. request_id = err.get("RequestId") or err.get("requestId")
  1621. code = err.get("Code") or err.get("code")
  1622. retry_after = Utils.get_throttling_time_left(_response.headers)
  1623. if not DaraCore.is_null(retry_after):
  1624. raise main_exceptions.ThrottlingException(
  1625. status_code = _response.status_code,
  1626. code = f'{code}',
  1627. message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
  1628. detail = f'{err.get("Detail") or err.get("detail")}',
  1629. description = f'{err.get("Description") or err.get("description")}',
  1630. retry_after = retry_after,
  1631. data = err,
  1632. request_id = f'{request_id}'
  1633. )
  1634. elif (_response.status_code >= 400) and (_response.status_code < 500):
  1635. raise main_exceptions.ClientException(
  1636. status_code = _response.status_code,
  1637. code = f'{code}',
  1638. message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
  1639. detail = f'{err.get("Detail") or err.get("detail")}',
  1640. description = f'{err.get("Description") or err.get("description")}',
  1641. data = err,
  1642. access_denied_detail = self.get_access_denied_detail(err),
  1643. request_id = f'{request_id}'
  1644. )
  1645. else:
  1646. raise main_exceptions.ServerException(
  1647. status_code = _response.status_code,
  1648. code = f'{code}',
  1649. message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
  1650. detail = f'{err.get("Detail") or err.get("detail")}',
  1651. description = f'{err.get("Description") or err.get("description")}',
  1652. data = err,
  1653. request_id = f'{request_id}'
  1654. )
  1655. if params.body_type == 'binary':
  1656. resp = {
  1657. 'body': _response.body,
  1658. 'headers': _response.headers,
  1659. 'statusCode': _response.status_code
  1660. }
  1661. return resp
  1662. elif params.body_type == 'byte':
  1663. byt = DaraStream.read_as_bytes(_response.body)
  1664. return {
  1665. 'body': byt,
  1666. 'headers': _response.headers,
  1667. 'statusCode': _response.status_code
  1668. }
  1669. elif params.body_type == 'string':
  1670. resp_str = DaraStream.read_as_string(_response.body)
  1671. return {
  1672. 'body': resp_str,
  1673. 'headers': _response.headers,
  1674. 'statusCode': _response.status_code
  1675. }
  1676. elif params.body_type == 'json':
  1677. obj = DaraStream.read_as_json(_response.body)
  1678. res = obj
  1679. return {
  1680. 'body': res,
  1681. 'headers': _response.headers,
  1682. 'statusCode': _response.status_code
  1683. }
  1684. elif params.body_type == 'array':
  1685. arr = DaraStream.read_as_json(_response.body)
  1686. return {
  1687. 'body': arr,
  1688. 'headers': _response.headers,
  1689. 'statusCode': _response.status_code
  1690. }
  1691. else:
  1692. anything = DaraStream.read_as_string(_response.body)
  1693. return {
  1694. 'body': anything,
  1695. 'headers': _response.headers,
  1696. 'statusCode': _response.status_code
  1697. }
  1698. except Exception as e:
  1699. _context = RetryPolicyContext(
  1700. retries_attempted= _retries_attempted,
  1701. http_request = _last_request,
  1702. http_response = _last_response,
  1703. exception = e
  1704. )
  1705. continue
  1706. raise UnretryableException(_context)
  1707. async def do_request_async(
  1708. self,
  1709. params: open_api_util_models.Params,
  1710. request: open_api_util_models.OpenApiRequest,
  1711. runtime: RuntimeOptions,
  1712. ) -> dict:
  1713. _runtime = {
  1714. 'key': runtime.key or self._key,
  1715. 'cert': runtime.cert or self._cert,
  1716. 'ca': runtime.ca or self._ca,
  1717. 'readTimeout': DaraCore.to_number(runtime.read_timeout or self._read_timeout),
  1718. 'connectTimeout': DaraCore.to_number(runtime.connect_timeout or self._connect_timeout),
  1719. 'httpProxy': runtime.http_proxy or self._http_proxy,
  1720. 'httpsProxy': runtime.https_proxy or self._https_proxy,
  1721. 'noProxy': runtime.no_proxy or self._no_proxy,
  1722. 'socks5Proxy': runtime.socks_5proxy or self._socks_5proxy,
  1723. 'socks5NetWork': runtime.socks_5net_work or self._socks_5net_work,
  1724. 'maxIdleConns': DaraCore.to_number(runtime.max_idle_conns or self._max_idle_conns),
  1725. 'retryOptions': self._retry_options,
  1726. 'ignoreSSL': runtime.ignore_ssl,
  1727. 'tlsMinVersion': self._tls_min_version,
  1728. }
  1729. _last_request = None
  1730. _last_response = None
  1731. _retries_attempted = 0
  1732. _context = RetryPolicyContext(
  1733. retries_attempted= _retries_attempted
  1734. )
  1735. while DaraCore.should_retry(_runtime.get('retryOptions'), _context):
  1736. _backoff_time = 0
  1737. if _retries_attempted > 0:
  1738. _backoff_time = DaraCore.get_backoff_time(_runtime.get('retryOptions'), _context)
  1739. if _backoff_time > 0:
  1740. DaraCore.sleep(_backoff_time)
  1741. _retry_attempts = _retries_attempted
  1742. _retries_attempted = _retries_attempted + 1
  1743. try:
  1744. _request = DaraRequest()
  1745. _request.protocol = self._protocol or params.protocol
  1746. _request.method = params.method
  1747. _request.pathname = params.pathname
  1748. global_queries = {}
  1749. global_headers = {}
  1750. if not DaraCore.is_null(self._global_parameters):
  1751. global_params = self._global_parameters
  1752. if not DaraCore.is_null(global_params.queries):
  1753. global_queries = global_params.queries
  1754. if not DaraCore.is_null(global_params.headers):
  1755. global_headers = global_params.headers
  1756. extends_headers = {}
  1757. extends_queries = {}
  1758. if not DaraCore.is_null(runtime.extends_parameters):
  1759. extends_parameters = runtime.extends_parameters
  1760. if not DaraCore.is_null(extends_parameters.headers):
  1761. extends_headers = extends_parameters.headers
  1762. if not DaraCore.is_null(extends_parameters.queries):
  1763. extends_queries = extends_parameters.queries
  1764. _request.query = DaraCore.merge({}, global_queries, extends_queries, request.query)
  1765. # endpoint is setted in product client
  1766. _request.headers = DaraCore.merge({
  1767. 'host': self._endpoint,
  1768. 'x-acs-version': params.version,
  1769. 'x-acs-action': params.action,
  1770. 'user-agent': Utils.get_user_agent(self._user_agent),
  1771. 'x-acs-date': Utils.get_timestamp(),
  1772. 'x-acs-signature-nonce': Utils.get_nonce(),
  1773. 'accept': 'application/json',
  1774. }, global_headers, extends_headers, request.headers)
  1775. if params.style == 'RPC':
  1776. headers = self.get_rpc_headers()
  1777. if not DaraCore.is_null(headers):
  1778. _request.headers = DaraCore.merge({}, _request.headers, headers)
  1779. Utils.apply_retry_headers(_request.headers, _retry_attempts, _backoff_time)
  1780. signature_algorithm = self._signature_algorithm or 'ACS3-HMAC-SHA256'
  1781. hashed_request_payload = Utils.hash(DaraBytes.from_('', 'utf-8'), signature_algorithm)
  1782. if not DaraCore.is_null(request.stream):
  1783. tmp = await DaraStream.read_as_bytes_async(request.stream)
  1784. hashed_request_payload = Utils.hash(tmp, signature_algorithm)
  1785. _request.body = tmp
  1786. _request.headers["content-type"] = 'application/octet-stream'
  1787. else:
  1788. if not DaraCore.is_null(request.body):
  1789. if params.req_body_type == 'byte':
  1790. byte_obj = bytes(request.body)
  1791. hashed_request_payload = Utils.hash(byte_obj, signature_algorithm)
  1792. _request.body = byte_obj
  1793. elif params.req_body_type == 'json':
  1794. json_obj = DaraCore.to_json_string(request.body)
  1795. hashed_request_payload = Utils.hash(json_obj.encode('utf-8'), signature_algorithm)
  1796. _request.body = json_obj
  1797. _request.headers["content-type"] = 'application/json; charset=utf-8'
  1798. else:
  1799. m = request.body
  1800. form_obj = Utils.to_form(m)
  1801. hashed_request_payload = Utils.hash(form_obj.encode('utf-8'), signature_algorithm)
  1802. _request.body = form_obj
  1803. _request.headers["content-type"] = 'application/x-www-form-urlencoded'
  1804. _request.headers["x-acs-content-sha256"] = hashed_request_payload.hex()
  1805. if params.auth_type != 'Anonymous':
  1806. if DaraCore.is_null(self._credential):
  1807. raise main_exceptions.ClientException(
  1808. code = f'InvalidCredentials',
  1809. 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.'
  1810. )
  1811. credential_model = await self._credential.get_credential_async()
  1812. if not DaraCore.is_null(credential_model.provider_name):
  1813. _request.headers["x-acs-credentials-provider"] = credential_model.provider_name
  1814. auth_type = credential_model.type
  1815. if auth_type == 'bearer':
  1816. bearer_token = credential_model.bearer_token
  1817. _request.headers["x-acs-bearer-token"] = bearer_token
  1818. if params.style == 'RPC':
  1819. _request.query["SignatureType"] = 'BEARERTOKEN'
  1820. else:
  1821. _request.headers["x-acs-signature-type"] = 'BEARERTOKEN'
  1822. elif auth_type == 'id_token':
  1823. id_token = credential_model.security_token
  1824. _request.headers["x-acs-zero-trust-idtoken"] = id_token
  1825. else:
  1826. access_key_id = credential_model.access_key_id
  1827. access_key_secret = credential_model.access_key_secret
  1828. security_token = credential_model.security_token
  1829. if not DaraCore.is_null(security_token) and security_token != '':
  1830. _request.headers["x-acs-accesskey-id"] = access_key_id
  1831. _request.headers["x-acs-security-token"] = security_token
  1832. _request.headers["Authorization"] = Utils.get_authorization(_request, signature_algorithm, hashed_request_payload.hex(), access_key_id, access_key_secret)
  1833. else:
  1834. if params.style == 'RPC':
  1835. _request.query["Format"] = 'json'
  1836. _last_request = _request
  1837. _response = await DaraCore.async_do_action(_request, _runtime)
  1838. _last_response = _response
  1839. if (_response.status_code >= 400) and (_response.status_code < 600):
  1840. err = {}
  1841. if not DaraCore.is_null(_response.headers.get("content-type")) and _response.headers.get("content-type") == 'text/xml;charset=utf-8':
  1842. _str = await DaraStream.read_as_string_async(_response.body)
  1843. resp_map = DaraXML.parse_xml(_str, None)
  1844. err = resp_map.get("Error")
  1845. else:
  1846. _res = await DaraStream.read_as_json_async(_response.body)
  1847. err = _res
  1848. request_id = err.get("RequestId") or err.get("requestId")
  1849. code = err.get("Code") or err.get("code")
  1850. retry_after = Utils.get_throttling_time_left(_response.headers)
  1851. if not DaraCore.is_null(retry_after):
  1852. raise main_exceptions.ThrottlingException(
  1853. status_code = _response.status_code,
  1854. code = f'{code}',
  1855. message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
  1856. detail = f'{err.get("Detail") or err.get("detail")}',
  1857. description = f'{err.get("Description") or err.get("description")}',
  1858. retry_after = retry_after,
  1859. data = err,
  1860. request_id = f'{request_id}'
  1861. )
  1862. elif (_response.status_code >= 400) and (_response.status_code < 500):
  1863. raise main_exceptions.ClientException(
  1864. status_code = _response.status_code,
  1865. code = f'{code}',
  1866. message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
  1867. detail = f'{err.get("Detail") or err.get("detail")}',
  1868. description = f'{err.get("Description") or err.get("description")}',
  1869. data = err,
  1870. access_denied_detail = self.get_access_denied_detail(err),
  1871. request_id = f'{request_id}'
  1872. )
  1873. else:
  1874. raise main_exceptions.ServerException(
  1875. status_code = _response.status_code,
  1876. code = f'{code}',
  1877. message = f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {request_id}',
  1878. detail = f'{err.get("Detail") or err.get("detail")}',
  1879. description = f'{err.get("Description") or err.get("description")}',
  1880. data = err,
  1881. request_id = f'{request_id}'
  1882. )
  1883. if params.body_type == 'binary':
  1884. resp = {
  1885. 'body': _response.body,
  1886. 'headers': _response.headers,
  1887. 'statusCode': _response.status_code
  1888. }
  1889. return resp
  1890. elif params.body_type == 'byte':
  1891. byt = await DaraStream.read_as_bytes_async(_response.body)
  1892. return {
  1893. 'body': byt,
  1894. 'headers': _response.headers,
  1895. 'statusCode': _response.status_code
  1896. }
  1897. elif params.body_type == 'string':
  1898. resp_str = await DaraStream.read_as_string_async(_response.body)
  1899. return {
  1900. 'body': resp_str,
  1901. 'headers': _response.headers,
  1902. 'statusCode': _response.status_code
  1903. }
  1904. elif params.body_type == 'json':
  1905. obj = await DaraStream.read_as_json_async(_response.body)
  1906. res = obj
  1907. return {
  1908. 'body': res,
  1909. 'headers': _response.headers,
  1910. 'statusCode': _response.status_code
  1911. }
  1912. elif params.body_type == 'array':
  1913. arr = await DaraStream.read_as_json_async(_response.body)
  1914. return {
  1915. 'body': arr,
  1916. 'headers': _response.headers,
  1917. 'statusCode': _response.status_code
  1918. }
  1919. else:
  1920. anything = await DaraStream.read_as_string_async(_response.body)
  1921. return {
  1922. 'body': anything,
  1923. 'headers': _response.headers,
  1924. 'statusCode': _response.status_code
  1925. }
  1926. except Exception as e:
  1927. _context = RetryPolicyContext(
  1928. retries_attempted= _retries_attempted,
  1929. http_request = _last_request,
  1930. http_response = _last_response,
  1931. exception = e
  1932. )
  1933. continue
  1934. raise UnretryableException(_context)
  1935. """
  1936. * @remarks
  1937. * Encapsulate the request and invoke the network
  1938. *
  1939. * @param action - api name
  1940. * @param version - product version
  1941. * @param protocol - http or https
  1942. * @param method - e.g. GET
  1943. * @param authType - authorization type e.g. AK
  1944. * @param bodyType - response body type e.g. String
  1945. * @param request - object of OpenApiRequest
  1946. * @param runtime - which controls some details of call api, such as retry times
  1947. * @returns the response
  1948. """
  1949. def execute(
  1950. self,
  1951. params: open_api_util_models.Params,
  1952. request: open_api_util_models.OpenApiRequest,
  1953. runtime: RuntimeOptions,
  1954. ) -> dict:
  1955. _runtime = {
  1956. 'key': runtime.key or self._key,
  1957. 'cert': runtime.cert or self._cert,
  1958. 'ca': runtime.ca or self._ca,
  1959. 'readTimeout': DaraCore.to_number(runtime.read_timeout or self._read_timeout),
  1960. 'connectTimeout': DaraCore.to_number(runtime.connect_timeout or self._connect_timeout),
  1961. 'httpProxy': runtime.http_proxy or self._http_proxy,
  1962. 'httpsProxy': runtime.https_proxy or self._https_proxy,
  1963. 'noProxy': runtime.no_proxy or self._no_proxy,
  1964. 'socks5Proxy': runtime.socks_5proxy or self._socks_5proxy,
  1965. 'socks5NetWork': runtime.socks_5net_work or self._socks_5net_work,
  1966. 'maxIdleConns': DaraCore.to_number(runtime.max_idle_conns or self._max_idle_conns),
  1967. 'retryOptions': self._retry_options,
  1968. 'ignoreSSL': runtime.ignore_ssl,
  1969. 'tlsMinVersion': self._tls_min_version,
  1970. 'disableHttp2': bool(self._disable_http_2 or False),
  1971. }
  1972. _last_request = None
  1973. _last_response = None
  1974. _retries_attempted = 0
  1975. _context = RetryPolicyContext(
  1976. retries_attempted= _retries_attempted
  1977. )
  1978. while DaraCore.should_retry(_runtime.get('retryOptions'), _context):
  1979. _backoff_time = 0
  1980. if _retries_attempted > 0:
  1981. _backoff_time = DaraCore.get_backoff_time(_runtime.get('retryOptions'), _context)
  1982. if _backoff_time > 0:
  1983. DaraCore.sleep(_backoff_time)
  1984. _retry_attempts = _retries_attempted
  1985. _retries_attempted = _retries_attempted + 1
  1986. try:
  1987. _request = DaraRequest()
  1988. # spi = new Gateway();//Gateway implements SPI,这一步在产品 SDK 中实例化
  1989. headers = self.get_rpc_headers()
  1990. global_queries = {}
  1991. global_headers = {}
  1992. if not DaraCore.is_null(self._global_parameters):
  1993. global_params = self._global_parameters
  1994. if not DaraCore.is_null(global_params.queries):
  1995. global_queries = global_params.queries
  1996. if not DaraCore.is_null(global_params.headers):
  1997. global_headers = global_params.headers
  1998. extends_headers = {}
  1999. extends_queries = {}
  2000. if not DaraCore.is_null(runtime.extends_parameters):
  2001. extends_parameters = runtime.extends_parameters
  2002. if not DaraCore.is_null(extends_parameters.headers):
  2003. extends_headers = extends_parameters.headers
  2004. if not DaraCore.is_null(extends_parameters.queries):
  2005. extends_queries = extends_parameters.queries
  2006. request_context = spi_models.InterceptorContextRequest(
  2007. headers = DaraCore.merge({}, global_headers, extends_headers, request.headers, headers),
  2008. query = DaraCore.merge({}, global_queries, extends_queries, request.query),
  2009. body = request.body,
  2010. stream = request.stream,
  2011. host_map = request.host_map,
  2012. pathname = params.pathname,
  2013. product_id = self._product_id,
  2014. action = params.action,
  2015. version = params.version,
  2016. protocol = self._protocol or params.protocol,
  2017. method = self._method or params.method,
  2018. auth_type = params.auth_type,
  2019. body_type = params.body_type,
  2020. req_body_type = params.req_body_type,
  2021. style = params.style,
  2022. credential = self._credential,
  2023. signature_version = self._signature_version,
  2024. signature_algorithm = self._signature_algorithm,
  2025. user_agent = Utils.get_user_agent(self._user_agent)
  2026. )
  2027. configuration_context = spi_models.InterceptorContextConfiguration(
  2028. region_id = self._region_id,
  2029. endpoint = request.endpoint_override or self._endpoint,
  2030. endpoint_rule = self._endpoint_rule,
  2031. endpoint_map = self._endpoint_map,
  2032. endpoint_type = self._endpoint_type,
  2033. network = self._network,
  2034. suffix = self._suffix
  2035. )
  2036. interceptor_context = spi_models.InterceptorContext(
  2037. request = request_context,
  2038. configuration = configuration_context
  2039. )
  2040. attribute_map = spi_models.AttributeMap()
  2041. if not DaraCore.is_null(self._attribute_map):
  2042. attribute_map = self._attribute_map
  2043. # 1. spi.modifyConfiguration(context: SPI.InterceptorContext, attributeMap: SPI.AttributeMap);
  2044. self._spi.modify_configuration(interceptor_context, attribute_map)
  2045. # 2. spi.modifyRequest(context: SPI.InterceptorContext, attributeMap: SPI.AttributeMap);
  2046. self._spi.modify_request(interceptor_context, attribute_map)
  2047. _request.protocol = interceptor_context.request.protocol
  2048. _request.method = interceptor_context.request.method
  2049. _request.pathname = interceptor_context.request.pathname
  2050. _request.query = interceptor_context.request.query
  2051. _request.body = interceptor_context.request.stream
  2052. _request.headers = interceptor_context.request.headers
  2053. _last_request = _request
  2054. _response = DaraCore.do_action(_request, _runtime)
  2055. _last_response = _response
  2056. response_context = spi_models.InterceptorContextResponse(
  2057. status_code = _response.status_code,
  2058. headers = _response.headers,
  2059. body = _response.body
  2060. )
  2061. interceptor_context.response = response_context
  2062. # 3. spi.modifyResponse(context: SPI.InterceptorContext, attributeMap: SPI.AttributeMap);
  2063. self._spi.modify_response(interceptor_context, attribute_map)
  2064. resp = {
  2065. 'headers': interceptor_context.response.headers,
  2066. 'statusCode': interceptor_context.response.status_code,
  2067. 'body': interceptor_context.response.deserialized_body
  2068. }
  2069. return resp
  2070. except Exception as e:
  2071. _context = RetryPolicyContext(
  2072. retries_attempted= _retries_attempted,
  2073. http_request = _last_request,
  2074. http_response = _last_response,
  2075. exception = e
  2076. )
  2077. continue
  2078. raise UnretryableException(_context)
  2079. async def execute_async(
  2080. self,
  2081. params: open_api_util_models.Params,
  2082. request: open_api_util_models.OpenApiRequest,
  2083. runtime: RuntimeOptions,
  2084. ) -> dict:
  2085. _runtime = {
  2086. 'key': runtime.key or self._key,
  2087. 'cert': runtime.cert or self._cert,
  2088. 'ca': runtime.ca or self._ca,
  2089. 'readTimeout': DaraCore.to_number(runtime.read_timeout or self._read_timeout),
  2090. 'connectTimeout': DaraCore.to_number(runtime.connect_timeout or self._connect_timeout),
  2091. 'httpProxy': runtime.http_proxy or self._http_proxy,
  2092. 'httpsProxy': runtime.https_proxy or self._https_proxy,
  2093. 'noProxy': runtime.no_proxy or self._no_proxy,
  2094. 'socks5Proxy': runtime.socks_5proxy or self._socks_5proxy,
  2095. 'socks5NetWork': runtime.socks_5net_work or self._socks_5net_work,
  2096. 'maxIdleConns': DaraCore.to_number(runtime.max_idle_conns or self._max_idle_conns),
  2097. 'retryOptions': self._retry_options,
  2098. 'ignoreSSL': runtime.ignore_ssl,
  2099. 'tlsMinVersion': self._tls_min_version,
  2100. 'disableHttp2': bool(self._disable_http_2 or False),
  2101. }
  2102. _last_request = None
  2103. _last_response = None
  2104. _retries_attempted = 0
  2105. _context = RetryPolicyContext(
  2106. retries_attempted= _retries_attempted
  2107. )
  2108. while DaraCore.should_retry(_runtime.get('retryOptions'), _context):
  2109. _backoff_time = 0
  2110. if _retries_attempted > 0:
  2111. _backoff_time = DaraCore.get_backoff_time(_runtime.get('retryOptions'), _context)
  2112. if _backoff_time > 0:
  2113. DaraCore.sleep(_backoff_time)
  2114. _retry_attempts = _retries_attempted
  2115. _retries_attempted = _retries_attempted + 1
  2116. try:
  2117. _request = DaraRequest()
  2118. # spi = new Gateway();//Gateway implements SPI,这一步在产品 SDK 中实例化
  2119. headers = self.get_rpc_headers()
  2120. global_queries = {}
  2121. global_headers = {}
  2122. if not DaraCore.is_null(self._global_parameters):
  2123. global_params = self._global_parameters
  2124. if not DaraCore.is_null(global_params.queries):
  2125. global_queries = global_params.queries
  2126. if not DaraCore.is_null(global_params.headers):
  2127. global_headers = global_params.headers
  2128. extends_headers = {}
  2129. extends_queries = {}
  2130. if not DaraCore.is_null(runtime.extends_parameters):
  2131. extends_parameters = runtime.extends_parameters
  2132. if not DaraCore.is_null(extends_parameters.headers):
  2133. extends_headers = extends_parameters.headers
  2134. if not DaraCore.is_null(extends_parameters.queries):
  2135. extends_queries = extends_parameters.queries
  2136. request_context = spi_models.InterceptorContextRequest(
  2137. headers = DaraCore.merge({}, global_headers, extends_headers, request.headers, headers),
  2138. query = DaraCore.merge({}, global_queries, extends_queries, request.query),
  2139. body = request.body,
  2140. stream = request.stream,
  2141. host_map = request.host_map,
  2142. pathname = params.pathname,
  2143. product_id = self._product_id,
  2144. action = params.action,
  2145. version = params.version,
  2146. protocol = self._protocol or params.protocol,
  2147. method = self._method or params.method,
  2148. auth_type = params.auth_type,
  2149. body_type = params.body_type,
  2150. req_body_type = params.req_body_type,
  2151. style = params.style,
  2152. credential = self._credential,
  2153. signature_version = self._signature_version,
  2154. signature_algorithm = self._signature_algorithm,
  2155. user_agent = Utils.get_user_agent(self._user_agent)
  2156. )
  2157. configuration_context = spi_models.InterceptorContextConfiguration(
  2158. region_id = self._region_id,
  2159. endpoint = request.endpoint_override or self._endpoint,
  2160. endpoint_rule = self._endpoint_rule,
  2161. endpoint_map = self._endpoint_map,
  2162. endpoint_type = self._endpoint_type,
  2163. network = self._network,
  2164. suffix = self._suffix
  2165. )
  2166. interceptor_context = spi_models.InterceptorContext(
  2167. request = request_context,
  2168. configuration = configuration_context
  2169. )
  2170. attribute_map = spi_models.AttributeMap()
  2171. if not DaraCore.is_null(self._attribute_map):
  2172. attribute_map = self._attribute_map
  2173. # 1. spi.modifyConfiguration(context: SPI.InterceptorContext, attributeMap: SPI.AttributeMap);
  2174. await self._spi.modify_configuration_async(interceptor_context, attribute_map)
  2175. # 2. spi.modifyRequest(context: SPI.InterceptorContext, attributeMap: SPI.AttributeMap);
  2176. await self._spi.modify_request_async(interceptor_context, attribute_map)
  2177. _request.protocol = interceptor_context.request.protocol
  2178. _request.method = interceptor_context.request.method
  2179. _request.pathname = interceptor_context.request.pathname
  2180. _request.query = interceptor_context.request.query
  2181. _request.body = interceptor_context.request.stream
  2182. _request.headers = interceptor_context.request.headers
  2183. _last_request = _request
  2184. _response = await DaraCore.async_do_action(_request, _runtime)
  2185. _last_response = _response
  2186. response_context = spi_models.InterceptorContextResponse(
  2187. status_code = _response.status_code,
  2188. headers = _response.headers,
  2189. body = _response.body
  2190. )
  2191. interceptor_context.response = response_context
  2192. # 3. spi.modifyResponse(context: SPI.InterceptorContext, attributeMap: SPI.AttributeMap);
  2193. await self._spi.modify_response_async(interceptor_context, attribute_map)
  2194. resp = {
  2195. 'headers': interceptor_context.response.headers,
  2196. 'statusCode': interceptor_context.response.status_code,
  2197. 'body': interceptor_context.response.deserialized_body
  2198. }
  2199. return resp
  2200. except Exception as e:
  2201. _context = RetryPolicyContext(
  2202. retries_attempted= _retries_attempted,
  2203. http_request = _last_request,
  2204. http_response = _last_response,
  2205. exception = e
  2206. )
  2207. continue
  2208. raise UnretryableException(_context)
  2209. def call_sseapi(
  2210. self,
  2211. params: open_api_util_models.Params,
  2212. request: open_api_util_models.OpenApiRequest,
  2213. runtime: RuntimeOptions,
  2214. ) -> Generator[main_models.SSEResponse, None, None]:
  2215. _runtime = {
  2216. 'key': runtime.key or self._key,
  2217. 'cert': runtime.cert or self._cert,
  2218. 'ca': runtime.ca or self._ca,
  2219. 'readTimeout': DaraCore.to_number(runtime.read_timeout or self._read_timeout),
  2220. 'connectTimeout': DaraCore.to_number(runtime.connect_timeout or self._connect_timeout),
  2221. 'httpProxy': runtime.http_proxy or self._http_proxy,
  2222. 'httpsProxy': runtime.https_proxy or self._https_proxy,
  2223. 'noProxy': runtime.no_proxy or self._no_proxy,
  2224. 'socks5Proxy': runtime.socks_5proxy or self._socks_5proxy,
  2225. 'socks5NetWork': runtime.socks_5net_work or self._socks_5net_work,
  2226. 'maxIdleConns': DaraCore.to_number(runtime.max_idle_conns or self._max_idle_conns),
  2227. 'retryOptions': self._retry_options,
  2228. 'ignoreSSL': runtime.ignore_ssl,
  2229. 'tlsMinVersion': self._tls_min_version,
  2230. }
  2231. _last_request = None
  2232. _last_response = None
  2233. _retries_attempted = 0
  2234. _context = RetryPolicyContext(
  2235. retries_attempted= _retries_attempted
  2236. )
  2237. while DaraCore.should_retry(_runtime.get('retryOptions'), _context):
  2238. _backoff_time = 0
  2239. if _retries_attempted > 0:
  2240. _backoff_time = DaraCore.get_backoff_time(_runtime.get('retryOptions'), _context)
  2241. if _backoff_time > 0:
  2242. DaraCore.sleep(_backoff_time)
  2243. _retry_attempts = _retries_attempted
  2244. _retries_attempted = _retries_attempted + 1
  2245. try:
  2246. _request = DaraRequest()
  2247. _request.protocol = self._protocol or params.protocol
  2248. _request.method = params.method
  2249. _request.pathname = params.pathname
  2250. global_queries = {}
  2251. global_headers = {}
  2252. if not DaraCore.is_null(self._global_parameters):
  2253. global_params = self._global_parameters
  2254. if not DaraCore.is_null(global_params.queries):
  2255. global_queries = global_params.queries
  2256. if not DaraCore.is_null(global_params.headers):
  2257. global_headers = global_params.headers
  2258. extends_headers = {}
  2259. extends_queries = {}
  2260. if not DaraCore.is_null(runtime.extends_parameters):
  2261. extends_parameters = runtime.extends_parameters
  2262. if not DaraCore.is_null(extends_parameters.headers):
  2263. extends_headers = extends_parameters.headers
  2264. if not DaraCore.is_null(extends_parameters.queries):
  2265. extends_queries = extends_parameters.queries
  2266. _request.query = DaraCore.merge({}, global_queries, extends_queries, request.query)
  2267. # endpoint is setted in product client
  2268. _request.headers = DaraCore.merge({
  2269. 'host': self._endpoint,
  2270. 'x-acs-version': params.version,
  2271. 'x-acs-action': params.action,
  2272. 'user-agent': Utils.get_user_agent(self._user_agent),
  2273. 'x-acs-date': Utils.get_timestamp(),
  2274. 'x-acs-signature-nonce': Utils.get_nonce(),
  2275. 'accept': 'application/json',
  2276. }, extends_headers, global_headers, request.headers)
  2277. if params.style == 'RPC':
  2278. headers = self.get_rpc_headers()
  2279. if not DaraCore.is_null(headers):
  2280. _request.headers = DaraCore.merge({}, _request.headers, headers)
  2281. Utils.apply_retry_headers(_request.headers, _retry_attempts, _backoff_time)
  2282. signature_algorithm = self._signature_algorithm or 'ACS3-HMAC-SHA256'
  2283. hashed_request_payload = Utils.hash(DaraBytes.from_('', 'utf-8'), signature_algorithm)
  2284. if not DaraCore.is_null(request.stream):
  2285. tmp = DaraStream.read_as_bytes(request.stream)
  2286. hashed_request_payload = Utils.hash(tmp, signature_algorithm)
  2287. _request.body = tmp
  2288. _request.headers["content-type"] = 'application/octet-stream'
  2289. else:
  2290. if not DaraCore.is_null(request.body):
  2291. if params.req_body_type == 'byte':
  2292. byte_obj = bytes(request.body)
  2293. hashed_request_payload = Utils.hash(byte_obj, signature_algorithm)
  2294. _request.body = byte_obj
  2295. elif params.req_body_type == 'json':
  2296. json_obj = DaraCore.to_json_string(request.body)
  2297. hashed_request_payload = Utils.hash(json_obj.encode('utf-8'), signature_algorithm)
  2298. _request.body = json_obj
  2299. _request.headers["content-type"] = 'application/json; charset=utf-8'
  2300. else:
  2301. m = request.body
  2302. form_obj = Utils.to_form(m)
  2303. hashed_request_payload = Utils.hash(form_obj.encode('utf-8'), signature_algorithm)
  2304. _request.body = form_obj
  2305. _request.headers["content-type"] = 'application/x-www-form-urlencoded'
  2306. _request.headers["x-acs-content-sha256"] = hashed_request_payload.hex()
  2307. if params.auth_type != 'Anonymous':
  2308. credential_model = self._credential.get_credential()
  2309. if not DaraCore.is_null(credential_model.provider_name):
  2310. _request.headers["x-acs-credentials-provider"] = credential_model.provider_name
  2311. auth_type = credential_model.type
  2312. if auth_type == 'bearer':
  2313. bearer_token = credential_model.bearer_token
  2314. _request.headers["x-acs-bearer-token"] = bearer_token
  2315. elif auth_type == 'id_token':
  2316. id_token = credential_model.security_token
  2317. _request.headers["x-acs-zero-trust-idtoken"] = id_token
  2318. else:
  2319. access_key_id = credential_model.access_key_id
  2320. access_key_secret = credential_model.access_key_secret
  2321. security_token = credential_model.security_token
  2322. if not DaraCore.is_null(security_token) and security_token != '':
  2323. _request.headers["x-acs-accesskey-id"] = access_key_id
  2324. _request.headers["x-acs-security-token"] = security_token
  2325. _request.headers["Authorization"] = Utils.get_authorization(_request, signature_algorithm, hashed_request_payload.hex(), access_key_id, access_key_secret)
  2326. _last_request = _request
  2327. _response = DaraCore.do_sse_action(_request, _runtime)
  2328. _last_response = _response
  2329. if (_response.status_code >= 400) and (_response.status_code < 600):
  2330. err = {}
  2331. if not DaraCore.is_null(_response.headers.get("content-type")) and _response.headers.get("content-type") == 'text/xml;charset=utf-8':
  2332. _str = DaraStream.read_as_string(_response.body)
  2333. resp_map = DaraXML.parse_xml(_str, None)
  2334. err = resp_map.get("Error")
  2335. else:
  2336. _res = DaraStream.read_as_json(_response.body)
  2337. err = _res
  2338. err["statusCode"] = _response.status_code
  2339. raise DaraException({
  2340. 'code': f'{err.get("Code") or err.get("code")}',
  2341. 'message': f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {err.get("RequestId") or err.get("requestId")}',
  2342. 'data': err,
  2343. 'detail': f'{err.get("Detail") or err.get("detail")}',
  2344. 'description': f'{err.get("Description") or err.get("description")}',
  2345. 'accessDeniedDetail': err.get("AccessDeniedDetail") or err.get("accessDeniedDetail")
  2346. })
  2347. events = DaraStream.read_as_sse(_response.body)
  2348. for event in events:
  2349. yield main_models.SSEResponse(
  2350. status_code = _response.status_code,
  2351. headers = _response.headers,
  2352. event = event
  2353. )
  2354. return
  2355. except Exception as e:
  2356. _context = RetryPolicyContext(
  2357. retries_attempted= _retries_attempted,
  2358. http_request = _last_request,
  2359. http_response = _last_response,
  2360. exception = e
  2361. )
  2362. continue
  2363. raise UnretryableException(_context)
  2364. async def call_sseapi_async(
  2365. self,
  2366. params: open_api_util_models.Params,
  2367. request: open_api_util_models.OpenApiRequest,
  2368. runtime: RuntimeOptions,
  2369. ) -> AsyncGenerator[main_models.SSEResponse, None, None]:
  2370. _runtime = {
  2371. 'key': runtime.key or self._key,
  2372. 'cert': runtime.cert or self._cert,
  2373. 'ca': runtime.ca or self._ca,
  2374. 'readTimeout': DaraCore.to_number(runtime.read_timeout or self._read_timeout),
  2375. 'connectTimeout': DaraCore.to_number(runtime.connect_timeout or self._connect_timeout),
  2376. 'httpProxy': runtime.http_proxy or self._http_proxy,
  2377. 'httpsProxy': runtime.https_proxy or self._https_proxy,
  2378. 'noProxy': runtime.no_proxy or self._no_proxy,
  2379. 'socks5Proxy': runtime.socks_5proxy or self._socks_5proxy,
  2380. 'socks5NetWork': runtime.socks_5net_work or self._socks_5net_work,
  2381. 'maxIdleConns': DaraCore.to_number(runtime.max_idle_conns or self._max_idle_conns),
  2382. 'retryOptions': self._retry_options,
  2383. 'ignoreSSL': runtime.ignore_ssl,
  2384. 'tlsMinVersion': self._tls_min_version,
  2385. }
  2386. _last_request = None
  2387. _last_response = None
  2388. _retries_attempted = 0
  2389. _context = RetryPolicyContext(
  2390. retries_attempted= _retries_attempted
  2391. )
  2392. while DaraCore.should_retry(_runtime.get('retryOptions'), _context):
  2393. _backoff_time = 0
  2394. if _retries_attempted > 0:
  2395. _backoff_time = DaraCore.get_backoff_time(_runtime.get('retryOptions'), _context)
  2396. if _backoff_time > 0:
  2397. DaraCore.sleep(_backoff_time)
  2398. _retry_attempts = _retries_attempted
  2399. _retries_attempted = _retries_attempted + 1
  2400. try:
  2401. _request = DaraRequest()
  2402. _request.protocol = self._protocol or params.protocol
  2403. _request.method = params.method
  2404. _request.pathname = params.pathname
  2405. global_queries = {}
  2406. global_headers = {}
  2407. if not DaraCore.is_null(self._global_parameters):
  2408. global_params = self._global_parameters
  2409. if not DaraCore.is_null(global_params.queries):
  2410. global_queries = global_params.queries
  2411. if not DaraCore.is_null(global_params.headers):
  2412. global_headers = global_params.headers
  2413. extends_headers = {}
  2414. extends_queries = {}
  2415. if not DaraCore.is_null(runtime.extends_parameters):
  2416. extends_parameters = runtime.extends_parameters
  2417. if not DaraCore.is_null(extends_parameters.headers):
  2418. extends_headers = extends_parameters.headers
  2419. if not DaraCore.is_null(extends_parameters.queries):
  2420. extends_queries = extends_parameters.queries
  2421. _request.query = DaraCore.merge({}, global_queries, extends_queries, request.query)
  2422. # endpoint is setted in product client
  2423. _request.headers = DaraCore.merge({
  2424. 'host': self._endpoint,
  2425. 'x-acs-version': params.version,
  2426. 'x-acs-action': params.action,
  2427. 'user-agent': Utils.get_user_agent(self._user_agent),
  2428. 'x-acs-date': Utils.get_timestamp(),
  2429. 'x-acs-signature-nonce': Utils.get_nonce(),
  2430. 'accept': 'application/json',
  2431. }, extends_headers, global_headers, request.headers)
  2432. if params.style == 'RPC':
  2433. headers = self.get_rpc_headers()
  2434. if not DaraCore.is_null(headers):
  2435. _request.headers = DaraCore.merge({}, _request.headers, headers)
  2436. Utils.apply_retry_headers(_request.headers, _retry_attempts, _backoff_time)
  2437. signature_algorithm = self._signature_algorithm or 'ACS3-HMAC-SHA256'
  2438. hashed_request_payload = Utils.hash(DaraBytes.from_('', 'utf-8'), signature_algorithm)
  2439. if not DaraCore.is_null(request.stream):
  2440. tmp = await DaraStream.read_as_bytes_async(request.stream)
  2441. hashed_request_payload = Utils.hash(tmp, signature_algorithm)
  2442. _request.body = tmp
  2443. _request.headers["content-type"] = 'application/octet-stream'
  2444. else:
  2445. if not DaraCore.is_null(request.body):
  2446. if params.req_body_type == 'byte':
  2447. byte_obj = bytes(request.body)
  2448. hashed_request_payload = Utils.hash(byte_obj, signature_algorithm)
  2449. _request.body = byte_obj
  2450. elif params.req_body_type == 'json':
  2451. json_obj = DaraCore.to_json_string(request.body)
  2452. hashed_request_payload = Utils.hash(json_obj.encode('utf-8'), signature_algorithm)
  2453. _request.body = json_obj
  2454. _request.headers["content-type"] = 'application/json; charset=utf-8'
  2455. else:
  2456. m = request.body
  2457. form_obj = Utils.to_form(m)
  2458. hashed_request_payload = Utils.hash(form_obj.encode('utf-8'), signature_algorithm)
  2459. _request.body = form_obj
  2460. _request.headers["content-type"] = 'application/x-www-form-urlencoded'
  2461. _request.headers["x-acs-content-sha256"] = hashed_request_payload.hex()
  2462. if params.auth_type != 'Anonymous':
  2463. credential_model = await self._credential.get_credential_async()
  2464. if not DaraCore.is_null(credential_model.provider_name):
  2465. _request.headers["x-acs-credentials-provider"] = credential_model.provider_name
  2466. auth_type = credential_model.type
  2467. if auth_type == 'bearer':
  2468. bearer_token = credential_model.bearer_token
  2469. _request.headers["x-acs-bearer-token"] = bearer_token
  2470. elif auth_type == 'id_token':
  2471. id_token = credential_model.security_token
  2472. _request.headers["x-acs-zero-trust-idtoken"] = id_token
  2473. else:
  2474. access_key_id = credential_model.access_key_id
  2475. access_key_secret = credential_model.access_key_secret
  2476. security_token = credential_model.security_token
  2477. if not DaraCore.is_null(security_token) and security_token != '':
  2478. _request.headers["x-acs-accesskey-id"] = access_key_id
  2479. _request.headers["x-acs-security-token"] = security_token
  2480. _request.headers["Authorization"] = Utils.get_authorization(_request, signature_algorithm, hashed_request_payload.hex(), access_key_id, access_key_secret)
  2481. _last_request = _request
  2482. _response = await DaraCore.async_do_sse_action(_request, _runtime)
  2483. _last_response = _response
  2484. if (_response.status_code >= 400) and (_response.status_code < 600):
  2485. err = {}
  2486. if not DaraCore.is_null(_response.headers.get("content-type")) and _response.headers.get("content-type") == 'text/xml;charset=utf-8':
  2487. _str = await DaraStream.read_as_string_async(_response.body)
  2488. resp_map = DaraXML.parse_xml(_str, None)
  2489. err = resp_map.get("Error")
  2490. else:
  2491. _res = await DaraStream.read_as_json_async(_response.body)
  2492. err = _res
  2493. err["statusCode"] = _response.status_code
  2494. raise DaraException({
  2495. 'code': f'{err.get("Code") or err.get("code")}',
  2496. 'message': f'code: {_response.status_code}, {err.get("Message") or err.get("message")} request id: {err.get("RequestId") or err.get("requestId")}',
  2497. 'data': err,
  2498. 'detail': f'{err.get("Detail") or err.get("detail")}',
  2499. 'description': f'{err.get("Description") or err.get("description")}',
  2500. 'accessDeniedDetail': err.get("AccessDeniedDetail") or err.get("accessDeniedDetail")
  2501. })
  2502. events = DaraStream.read_as_sse_async(_response.body)
  2503. async for event in events:
  2504. yield main_models.SSEResponse(
  2505. status_code = _response.status_code,
  2506. headers = _response.headers,
  2507. event = event
  2508. )
  2509. return
  2510. except Exception as e:
  2511. _context = RetryPolicyContext(
  2512. retries_attempted= _retries_attempted,
  2513. http_request = _last_request,
  2514. http_response = _last_response,
  2515. exception = e
  2516. )
  2517. continue
  2518. raise UnretryableException(_context)
  2519. def call_api(
  2520. self,
  2521. params: open_api_util_models.Params,
  2522. request: open_api_util_models.OpenApiRequest,
  2523. runtime: RuntimeOptions,
  2524. ) -> dict:
  2525. if DaraCore.is_null(params):
  2526. raise main_exceptions.ClientException(
  2527. code = 'ParameterMissing',
  2528. message = '\'params\' can not be unset'
  2529. )
  2530. if DaraCore.is_null(self._signature_version) or self._signature_version != 'v4':
  2531. if DaraCore.is_null(self._signature_algorithm) or self._signature_algorithm != 'v2':
  2532. return self.do_request(params, request, runtime)
  2533. elif (params.style == 'ROA') and (params.req_body_type == 'json'):
  2534. return self.do_roarequest(params.action, params.version, params.protocol, params.method, params.auth_type, params.pathname, params.body_type, request, runtime)
  2535. elif params.style == 'ROA':
  2536. return self.do_roarequest_with_form(params.action, params.version, params.protocol, params.method, params.auth_type, params.pathname, params.body_type, request, runtime)
  2537. else:
  2538. return self.do_rpcrequest(params.action, params.version, params.protocol, params.method, params.auth_type, params.body_type, request, runtime)
  2539. else:
  2540. return self.execute(params, request, runtime)
  2541. async def call_api_async(
  2542. self,
  2543. params: open_api_util_models.Params,
  2544. request: open_api_util_models.OpenApiRequest,
  2545. runtime: RuntimeOptions,
  2546. ) -> dict:
  2547. if DaraCore.is_null(params):
  2548. raise main_exceptions.ClientException(
  2549. code = 'ParameterMissing',
  2550. message = '\'params\' can not be unset'
  2551. )
  2552. if DaraCore.is_null(self._signature_version) or self._signature_version != 'v4':
  2553. if DaraCore.is_null(self._signature_algorithm) or self._signature_algorithm != 'v2':
  2554. return await self.do_request_async(params, request, runtime)
  2555. elif (params.style == 'ROA') and (params.req_body_type == 'json'):
  2556. return await self.do_roarequest_async(params.action, params.version, params.protocol, params.method, params.auth_type, params.pathname, params.body_type, request, runtime)
  2557. elif params.style == 'ROA':
  2558. 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)
  2559. else:
  2560. return await self.do_rpcrequest_async(params.action, params.version, params.protocol, params.method, params.auth_type, params.body_type, request, runtime)
  2561. else:
  2562. return await self.execute_async(params, request, runtime)
  2563. def get_access_key_id(self) -> str:
  2564. if DaraCore.is_null(self._credential):
  2565. return ''
  2566. access_key_id = self._credential.get_access_key_id()
  2567. return access_key_id
  2568. async def get_access_key_id_async(self) -> str:
  2569. if DaraCore.is_null(self._credential):
  2570. return ''
  2571. access_key_id = await self._credential.get_access_key_id_async()
  2572. return access_key_id
  2573. def get_access_key_secret(self) -> str:
  2574. if DaraCore.is_null(self._credential):
  2575. return ''
  2576. secret = self._credential.get_access_key_secret()
  2577. return secret
  2578. async def get_access_key_secret_async(self) -> str:
  2579. if DaraCore.is_null(self._credential):
  2580. return ''
  2581. secret = await self._credential.get_access_key_secret_async()
  2582. return secret
  2583. def get_security_token(self) -> str:
  2584. if DaraCore.is_null(self._credential):
  2585. return ''
  2586. token = self._credential.get_security_token()
  2587. return token
  2588. async def get_security_token_async(self) -> str:
  2589. if DaraCore.is_null(self._credential):
  2590. return ''
  2591. token = await self._credential.get_security_token_async()
  2592. return token
  2593. def get_bearer_token(self) -> str:
  2594. if DaraCore.is_null(self._credential):
  2595. return ''
  2596. token = self._credential.get_bearer_token()
  2597. return token
  2598. async def get_bearer_token_async(self) -> str:
  2599. if DaraCore.is_null(self._credential):
  2600. return ''
  2601. token = self._credential.get_bearer_token()
  2602. return token
  2603. def get_type(self) -> str:
  2604. if DaraCore.is_null(self._credential):
  2605. return ''
  2606. auth_type = self._credential.get_type()
  2607. return auth_type
  2608. async def get_type_async(self) -> str:
  2609. if DaraCore.is_null(self._credential):
  2610. return ''
  2611. auth_type = self._credential.get_type()
  2612. return auth_type
  2613. def check_config(
  2614. self,
  2615. config: open_api_util_models.Config,
  2616. ) -> None:
  2617. if DaraCore.is_null(self._endpoint_rule) and DaraCore.is_null(config.endpoint):
  2618. raise main_exceptions.ClientException(
  2619. code = 'ParameterMissing',
  2620. message = '\'config.endpoint\' can not be empty'
  2621. )
  2622. def set_gateway_client(
  2623. self,
  2624. spi: SPIClient,
  2625. ) -> None:
  2626. self._spi = spi
  2627. def set_rpc_headers(
  2628. self,
  2629. headers: Dict[str, str],
  2630. ) -> None:
  2631. self._headers = headers
  2632. def get_rpc_headers(self) -> Dict[str, str]:
  2633. headers = self._headers
  2634. self._headers = None
  2635. return headers
  2636. def default_any(
  2637. input_value: Any,
  2638. default_value: Any,
  2639. ) -> Any:
  2640. if DaraCore.is_null(input_value):
  2641. return default_value
  2642. return input_value
  2643. def get_access_denied_detail(
  2644. self,
  2645. err: Dict[str, Any],
  2646. ) -> Dict[str, Any]:
  2647. access_denied_detail = None
  2648. if not DaraCore.is_null(err.get("AccessDeniedDetail")):
  2649. detail_1 = err.get("AccessDeniedDetail")
  2650. access_denied_detail = detail_1
  2651. elif not DaraCore.is_null(err.get("accessDeniedDetail")):
  2652. detail_2 = err.get("accessDeniedDetail")
  2653. access_denied_detail = detail_2
  2654. return access_denied_detail