client.py 143 KB

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