client.py 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984
  1. # -*- coding: utf-8 -*-
  2. # This file is auto-generated, don't edit it. Thanks.
  3. from __future__ import unicode_literals
  4. import time
  5. from Tea.exceptions import TeaException, UnretryableException
  6. from Tea.request import TeaRequest
  7. from Tea.core import TeaCore
  8. from Tea.converter import TeaConverter
  9. from alibabacloud_credentials.client import Client as CredentialClient
  10. from alibabacloud_gateway_spi.client import Client as SPIClient
  11. from alibabacloud_tea_util.client import Client as UtilClient
  12. from alibabacloud_credentials import models as credential_models
  13. from alibabacloud_openapi_util.client import Client as OpenApiUtilClient
  14. from alibabacloud_tea_xml.client import Client as XMLClient
  15. from alibabacloud_gateway_spi import models as spi_models
  16. class Client(object):
  17. """
  18. This is for OpenApi SDK
  19. """
  20. _endpoint = None # type: str
  21. _region_id = None # type: str
  22. _protocol = None # type: str
  23. _method = None # type: str
  24. _user_agent = None # type: str
  25. _endpoint_rule = None # type: str
  26. _endpoint_map = None # type: dict[str, str]
  27. _suffix = None # type: str
  28. _read_timeout = None # type: int
  29. _connect_timeout = None # type: int
  30. _http_proxy = None # type: str
  31. _https_proxy = None # type: str
  32. _socks_5proxy = None # type: str
  33. _socks_5net_work = None # type: str
  34. _no_proxy = None # type: str
  35. _network = None # type: str
  36. _product_id = None # type: str
  37. _max_idle_conns = None # type: int
  38. _endpoint_type = None # type: str
  39. _open_platform_endpoint = None # type: str
  40. _credential = None # type: CredentialClient
  41. _signature_version = None # type: str
  42. _signature_algorithm = None # type: str
  43. _headers = None # type: dict[str, str]
  44. _spi = None # type: SPIClient
  45. def __init__(self, config):
  46. """
  47. Init client with Config
  48. @param config: config contains the necessary information to create a client
  49. """
  50. if UtilClient.is_unset(config):
  51. raise TeaException({
  52. 'code': 'ParameterMissing',
  53. 'message': "'config' can not be unset"
  54. })
  55. if not UtilClient.empty(config.access_key_id) and not UtilClient.empty(config.access_key_secret):
  56. if not UtilClient.empty(config.security_token):
  57. config.type = 'sts'
  58. else:
  59. config.type = 'access_key'
  60. credential_config = credential_models.Config(
  61. access_key_id=config.access_key_id,
  62. type=config.type,
  63. access_key_secret=config.access_key_secret,
  64. security_token=config.security_token
  65. )
  66. self._credential = CredentialClient(credential_config)
  67. elif not UtilClient.is_unset(config.credential):
  68. self._credential = config.credential
  69. self._endpoint = config.endpoint
  70. self._endpoint_type = config.endpoint_type
  71. self._network = config.network
  72. self._suffix = config.suffix
  73. self._protocol = config.protocol
  74. self._method = config.method
  75. self._region_id = config.region_id
  76. self._user_agent = config.user_agent
  77. self._read_timeout = config.read_timeout
  78. self._connect_timeout = config.connect_timeout
  79. self._http_proxy = config.http_proxy
  80. self._https_proxy = config.https_proxy
  81. self._no_proxy = config.no_proxy
  82. self._socks_5proxy = config.socks_5proxy
  83. self._socks_5net_work = config.socks_5net_work
  84. self._max_idle_conns = config.max_idle_conns
  85. self._signature_version = config.signature_version
  86. self._signature_algorithm = config.signature_algorithm
  87. def do_rpcrequest(self, action, version, protocol, method, auth_type, body_type, request, runtime):
  88. """
  89. Encapsulate the request and invoke the network
  90. @type action: str
  91. @param action: api name
  92. @type version: str
  93. @param version: product version
  94. @type protocol: str
  95. @param protocol: http or https
  96. @type method: str
  97. @param method: e.g. GET
  98. @type auth_type: str
  99. @param auth_type: authorization type e.g. AK
  100. @type body_type: str
  101. @param body_type: response body type e.g. String
  102. @param request: object of OpenApiRequest
  103. @param runtime: which controls some details of call api, such as retry times
  104. @rtype: dict
  105. @return: the response
  106. """
  107. request.validate()
  108. runtime.validate()
  109. _runtime = {
  110. 'timeouted': 'retry',
  111. 'readTimeout': UtilClient.default_number(runtime.read_timeout, self._read_timeout),
  112. 'connectTimeout': UtilClient.default_number(runtime.connect_timeout, self._connect_timeout),
  113. 'httpProxy': UtilClient.default_string(runtime.http_proxy, self._http_proxy),
  114. 'httpsProxy': UtilClient.default_string(runtime.https_proxy, self._https_proxy),
  115. 'noProxy': UtilClient.default_string(runtime.no_proxy, self._no_proxy),
  116. 'socks5Proxy': UtilClient.default_string(runtime.socks_5proxy, self._socks_5proxy),
  117. 'socks5NetWork': UtilClient.default_string(runtime.socks_5net_work, self._socks_5net_work),
  118. 'maxIdleConns': UtilClient.default_number(runtime.max_idle_conns, self._max_idle_conns),
  119. 'retry': {
  120. 'retryable': runtime.autoretry,
  121. 'maxAttempts': UtilClient.default_number(runtime.max_attempts, 3)
  122. },
  123. 'backoff': {
  124. 'policy': UtilClient.default_string(runtime.backoff_policy, 'no'),
  125. 'period': UtilClient.default_number(runtime.backoff_period, 1)
  126. },
  127. 'ignoreSSL': runtime.ignore_ssl
  128. }
  129. _last_request = None
  130. _last_exception = None
  131. _now = time.time()
  132. _retry_times = 0
  133. while TeaCore.allow_retry(_runtime.get('retry'), _retry_times, _now):
  134. if _retry_times > 0:
  135. _backoff_time = TeaCore.get_backoff_time(_runtime.get('backoff'), _retry_times)
  136. if _backoff_time > 0:
  137. TeaCore.sleep(_backoff_time)
  138. _retry_times = _retry_times + 1
  139. try:
  140. _request = TeaRequest()
  141. _request.protocol = UtilClient.default_string(self._protocol, protocol)
  142. _request.method = method
  143. _request.pathname = '/'
  144. _request.query = TeaCore.merge({
  145. 'Action': action,
  146. 'Format': 'json',
  147. 'Version': version,
  148. 'Timestamp': OpenApiUtilClient.get_timestamp(),
  149. 'SignatureNonce': UtilClient.get_nonce()
  150. }, request.query)
  151. headers = self.get_rpc_headers()
  152. if UtilClient.is_unset(headers):
  153. # endpoint is setted in product client
  154. _request.headers = {
  155. 'host': self._endpoint,
  156. 'x-acs-version': version,
  157. 'x-acs-action': action,
  158. 'user-agent': self.get_user_agent()
  159. }
  160. else:
  161. _request.headers = TeaCore.merge({
  162. 'host': self._endpoint,
  163. 'x-acs-version': version,
  164. 'x-acs-action': action,
  165. 'user-agent': self.get_user_agent()
  166. }, headers)
  167. if not UtilClient.is_unset(request.body):
  168. m = UtilClient.assert_as_map(request.body)
  169. tmp = UtilClient.anyify_map_value(OpenApiUtilClient.query(m))
  170. _request.body = UtilClient.to_form_string(tmp)
  171. _request.headers['content-type'] = 'application/x-www-form-urlencoded'
  172. if not UtilClient.equal_string(auth_type, 'Anonymous'):
  173. access_key_id = self.get_access_key_id()
  174. access_key_secret = self.get_access_key_secret()
  175. security_token = self.get_security_token()
  176. if not UtilClient.empty(security_token):
  177. _request.query['SecurityToken'] = security_token
  178. _request.query['SignatureMethod'] = 'HMAC-SHA1'
  179. _request.query['SignatureVersion'] = '1.0'
  180. _request.query['AccessKeyId'] = access_key_id
  181. t = None
  182. if not UtilClient.is_unset(request.body):
  183. t = UtilClient.assert_as_map(request.body)
  184. signed_param = TeaCore.merge(_request.query,
  185. OpenApiUtilClient.query(t))
  186. _request.query['Signature'] = OpenApiUtilClient.get_rpcsignature(signed_param, _request.method, access_key_secret)
  187. _last_request = _request
  188. _response = TeaCore.do_action(_request, _runtime)
  189. if UtilClient.is_4xx(_response.status_code) or UtilClient.is_5xx(_response.status_code):
  190. _res = UtilClient.read_as_json(_response.body)
  191. err = UtilClient.assert_as_map(_res)
  192. request_id = self.default_any(err.get('RequestId'), err.get('requestId'))
  193. raise TeaException({
  194. 'code': '%s' % TeaConverter.to_unicode(self.default_any(err.get('Code'), err.get('code'))),
  195. 'message': 'code: %s, %s request id: %s' % (TeaConverter.to_unicode(_response.status_code), TeaConverter.to_unicode(self.default_any(err.get('Message'), err.get('message'))), TeaConverter.to_unicode(request_id)),
  196. 'data': err
  197. })
  198. if UtilClient.equal_string(body_type, 'binary'):
  199. resp = {
  200. 'body': _response.body,
  201. 'headers': _response.headers
  202. }
  203. return resp
  204. elif UtilClient.equal_string(body_type, 'byte'):
  205. byt = UtilClient.read_as_bytes(_response.body)
  206. return {
  207. 'body': byt,
  208. 'headers': _response.headers
  209. }
  210. elif UtilClient.equal_string(body_type, 'string'):
  211. str = UtilClient.read_as_string(_response.body)
  212. return {
  213. 'body': str,
  214. 'headers': _response.headers
  215. }
  216. elif UtilClient.equal_string(body_type, 'json'):
  217. obj = UtilClient.read_as_json(_response.body)
  218. res = UtilClient.assert_as_map(obj)
  219. return {
  220. 'body': res,
  221. 'headers': _response.headers
  222. }
  223. elif UtilClient.equal_string(body_type, 'array'):
  224. arr = UtilClient.read_as_json(_response.body)
  225. return {
  226. 'body': arr,
  227. 'headers': _response.headers
  228. }
  229. else:
  230. return {
  231. 'headers': _response.headers
  232. }
  233. except Exception as e:
  234. if TeaCore.is_retryable(e):
  235. _last_exception = e
  236. continue
  237. raise e
  238. raise UnretryableException(_last_request, _last_exception)
  239. def do_roarequest(self, action, version, protocol, method, auth_type, pathname, body_type, request, runtime):
  240. """
  241. Encapsulate the request and invoke the network
  242. @type action: str
  243. @param action: api name
  244. @type version: str
  245. @param version: product version
  246. @type protocol: str
  247. @param protocol: http or https
  248. @type method: str
  249. @param method: e.g. GET
  250. @type auth_type: str
  251. @param auth_type: authorization type e.g. AK
  252. @type pathname: str
  253. @param pathname: pathname of every api
  254. @type body_type: str
  255. @param body_type: response body type e.g. String
  256. @param request: object of OpenApiRequest
  257. @param runtime: which controls some details of call api, such as retry times
  258. @rtype: dict
  259. @return: the response
  260. """
  261. request.validate()
  262. runtime.validate()
  263. _runtime = {
  264. 'timeouted': 'retry',
  265. 'readTimeout': UtilClient.default_number(runtime.read_timeout, self._read_timeout),
  266. 'connectTimeout': UtilClient.default_number(runtime.connect_timeout, self._connect_timeout),
  267. 'httpProxy': UtilClient.default_string(runtime.http_proxy, self._http_proxy),
  268. 'httpsProxy': UtilClient.default_string(runtime.https_proxy, self._https_proxy),
  269. 'noProxy': UtilClient.default_string(runtime.no_proxy, self._no_proxy),
  270. 'socks5Proxy': UtilClient.default_string(runtime.socks_5proxy, self._socks_5proxy),
  271. 'socks5NetWork': UtilClient.default_string(runtime.socks_5net_work, self._socks_5net_work),
  272. 'maxIdleConns': UtilClient.default_number(runtime.max_idle_conns, self._max_idle_conns),
  273. 'retry': {
  274. 'retryable': runtime.autoretry,
  275. 'maxAttempts': UtilClient.default_number(runtime.max_attempts, 3)
  276. },
  277. 'backoff': {
  278. 'policy': UtilClient.default_string(runtime.backoff_policy, 'no'),
  279. 'period': UtilClient.default_number(runtime.backoff_period, 1)
  280. },
  281. 'ignoreSSL': runtime.ignore_ssl
  282. }
  283. _last_request = None
  284. _last_exception = None
  285. _now = time.time()
  286. _retry_times = 0
  287. while TeaCore.allow_retry(_runtime.get('retry'), _retry_times, _now):
  288. if _retry_times > 0:
  289. _backoff_time = TeaCore.get_backoff_time(_runtime.get('backoff'), _retry_times)
  290. if _backoff_time > 0:
  291. TeaCore.sleep(_backoff_time)
  292. _retry_times = _retry_times + 1
  293. try:
  294. _request = TeaRequest()
  295. _request.protocol = UtilClient.default_string(self._protocol, protocol)
  296. _request.method = method
  297. _request.pathname = pathname
  298. _request.headers = TeaCore.merge({
  299. 'date': UtilClient.get_date_utcstring(),
  300. 'host': self._endpoint,
  301. 'accept': 'application/json',
  302. 'x-acs-signature-nonce': UtilClient.get_nonce(),
  303. 'x-acs-signature-method': 'HMAC-SHA1',
  304. 'x-acs-signature-version': '1.0',
  305. 'x-acs-version': version,
  306. 'x-acs-action': action,
  307. 'user-agent': UtilClient.get_user_agent(self._user_agent)
  308. }, request.headers)
  309. if not UtilClient.is_unset(request.body):
  310. _request.body = UtilClient.to_jsonstring(request.body)
  311. _request.headers['content-type'] = 'application/json; charset=utf-8'
  312. if not UtilClient.is_unset(request.query):
  313. _request.query = request.query
  314. if not UtilClient.equal_string(auth_type, 'Anonymous'):
  315. access_key_id = self.get_access_key_id()
  316. access_key_secret = self.get_access_key_secret()
  317. security_token = self.get_security_token()
  318. if not UtilClient.empty(security_token):
  319. _request.headers['x-acs-accesskey-id'] = access_key_id
  320. _request.headers['x-acs-security-token'] = security_token
  321. string_to_sign = OpenApiUtilClient.get_string_to_sign(_request)
  322. _request.headers['authorization'] = 'acs %s:%s' % (TeaConverter.to_unicode(access_key_id), TeaConverter.to_unicode(OpenApiUtilClient.get_roasignature(string_to_sign, access_key_secret)))
  323. _last_request = _request
  324. _response = TeaCore.do_action(_request, _runtime)
  325. if UtilClient.equal_number(_response.status_code, 204):
  326. return {
  327. 'headers': _response.headers
  328. }
  329. if UtilClient.is_4xx(_response.status_code) or UtilClient.is_5xx(_response.status_code):
  330. _res = UtilClient.read_as_json(_response.body)
  331. err = UtilClient.assert_as_map(_res)
  332. request_id = self.default_any(err.get('RequestId'), err.get('requestId'))
  333. request_id = self.default_any(request_id, err.get('requestid'))
  334. raise TeaException({
  335. 'code': '%s' % TeaConverter.to_unicode(self.default_any(err.get('Code'), err.get('code'))),
  336. 'message': 'code: %s, %s request id: %s' % (TeaConverter.to_unicode(_response.status_code), TeaConverter.to_unicode(self.default_any(err.get('Message'), err.get('message'))), TeaConverter.to_unicode(request_id)),
  337. 'data': err
  338. })
  339. if UtilClient.equal_string(body_type, 'binary'):
  340. resp = {
  341. 'body': _response.body,
  342. 'headers': _response.headers
  343. }
  344. return resp
  345. elif UtilClient.equal_string(body_type, 'byte'):
  346. byt = UtilClient.read_as_bytes(_response.body)
  347. return {
  348. 'body': byt,
  349. 'headers': _response.headers
  350. }
  351. elif UtilClient.equal_string(body_type, 'string'):
  352. str = UtilClient.read_as_string(_response.body)
  353. return {
  354. 'body': str,
  355. 'headers': _response.headers
  356. }
  357. elif UtilClient.equal_string(body_type, 'json'):
  358. obj = UtilClient.read_as_json(_response.body)
  359. res = UtilClient.assert_as_map(obj)
  360. return {
  361. 'body': res,
  362. 'headers': _response.headers
  363. }
  364. elif UtilClient.equal_string(body_type, 'array'):
  365. arr = UtilClient.read_as_json(_response.body)
  366. return {
  367. 'body': arr,
  368. 'headers': _response.headers
  369. }
  370. else:
  371. return {
  372. 'headers': _response.headers
  373. }
  374. except Exception as e:
  375. if TeaCore.is_retryable(e):
  376. _last_exception = e
  377. continue
  378. raise e
  379. raise UnretryableException(_last_request, _last_exception)
  380. def do_roarequest_with_form(self, action, version, protocol, method, auth_type, pathname, body_type, request, runtime):
  381. """
  382. Encapsulate the request and invoke the network with form body
  383. @type action: str
  384. @param action: api name
  385. @type version: str
  386. @param version: product version
  387. @type protocol: str
  388. @param protocol: http or https
  389. @type method: str
  390. @param method: e.g. GET
  391. @type auth_type: str
  392. @param auth_type: authorization type e.g. AK
  393. @type pathname: str
  394. @param pathname: pathname of every api
  395. @type body_type: str
  396. @param body_type: response body type e.g. String
  397. @param request: object of OpenApiRequest
  398. @param runtime: which controls some details of call api, such as retry times
  399. @rtype: dict
  400. @return: the response
  401. """
  402. request.validate()
  403. runtime.validate()
  404. _runtime = {
  405. 'timeouted': 'retry',
  406. 'readTimeout': UtilClient.default_number(runtime.read_timeout, self._read_timeout),
  407. 'connectTimeout': UtilClient.default_number(runtime.connect_timeout, self._connect_timeout),
  408. 'httpProxy': UtilClient.default_string(runtime.http_proxy, self._http_proxy),
  409. 'httpsProxy': UtilClient.default_string(runtime.https_proxy, self._https_proxy),
  410. 'noProxy': UtilClient.default_string(runtime.no_proxy, self._no_proxy),
  411. 'socks5Proxy': UtilClient.default_string(runtime.socks_5proxy, self._socks_5proxy),
  412. 'socks5NetWork': UtilClient.default_string(runtime.socks_5net_work, self._socks_5net_work),
  413. 'maxIdleConns': UtilClient.default_number(runtime.max_idle_conns, self._max_idle_conns),
  414. 'retry': {
  415. 'retryable': runtime.autoretry,
  416. 'maxAttempts': UtilClient.default_number(runtime.max_attempts, 3)
  417. },
  418. 'backoff': {
  419. 'policy': UtilClient.default_string(runtime.backoff_policy, 'no'),
  420. 'period': UtilClient.default_number(runtime.backoff_period, 1)
  421. },
  422. 'ignoreSSL': runtime.ignore_ssl
  423. }
  424. _last_request = None
  425. _last_exception = None
  426. _now = time.time()
  427. _retry_times = 0
  428. while TeaCore.allow_retry(_runtime.get('retry'), _retry_times, _now):
  429. if _retry_times > 0:
  430. _backoff_time = TeaCore.get_backoff_time(_runtime.get('backoff'), _retry_times)
  431. if _backoff_time > 0:
  432. TeaCore.sleep(_backoff_time)
  433. _retry_times = _retry_times + 1
  434. try:
  435. _request = TeaRequest()
  436. _request.protocol = UtilClient.default_string(self._protocol, protocol)
  437. _request.method = method
  438. _request.pathname = pathname
  439. _request.headers = TeaCore.merge({
  440. 'date': UtilClient.get_date_utcstring(),
  441. 'host': self._endpoint,
  442. 'accept': 'application/json',
  443. 'x-acs-signature-nonce': UtilClient.get_nonce(),
  444. 'x-acs-signature-method': 'HMAC-SHA1',
  445. 'x-acs-signature-version': '1.0',
  446. 'x-acs-version': version,
  447. 'x-acs-action': action,
  448. 'user-agent': UtilClient.get_user_agent(self._user_agent)
  449. }, request.headers)
  450. if not UtilClient.is_unset(request.body):
  451. m = UtilClient.assert_as_map(request.body)
  452. _request.body = OpenApiUtilClient.to_form(m)
  453. _request.headers['content-type'] = 'application/x-www-form-urlencoded'
  454. if not UtilClient.is_unset(request.query):
  455. _request.query = request.query
  456. if not UtilClient.equal_string(auth_type, 'Anonymous'):
  457. access_key_id = self.get_access_key_id()
  458. access_key_secret = self.get_access_key_secret()
  459. security_token = self.get_security_token()
  460. if not UtilClient.empty(security_token):
  461. _request.headers['x-acs-accesskey-id'] = access_key_id
  462. _request.headers['x-acs-security-token'] = security_token
  463. string_to_sign = OpenApiUtilClient.get_string_to_sign(_request)
  464. _request.headers['authorization'] = 'acs %s:%s' % (TeaConverter.to_unicode(access_key_id), TeaConverter.to_unicode(OpenApiUtilClient.get_roasignature(string_to_sign, access_key_secret)))
  465. _last_request = _request
  466. _response = TeaCore.do_action(_request, _runtime)
  467. if UtilClient.equal_number(_response.status_code, 204):
  468. return {
  469. 'headers': _response.headers
  470. }
  471. if UtilClient.is_4xx(_response.status_code) or UtilClient.is_5xx(_response.status_code):
  472. _res = UtilClient.read_as_json(_response.body)
  473. err = UtilClient.assert_as_map(_res)
  474. raise TeaException({
  475. 'code': '%s' % TeaConverter.to_unicode(self.default_any(err.get('Code'), err.get('code'))),
  476. 'message': 'code: %s, %s request id: %s' % (TeaConverter.to_unicode(_response.status_code), TeaConverter.to_unicode(self.default_any(err.get('Message'), err.get('message'))), TeaConverter.to_unicode(self.default_any(err.get('RequestId'), err.get('requestId')))),
  477. 'data': err
  478. })
  479. if UtilClient.equal_string(body_type, 'binary'):
  480. resp = {
  481. 'body': _response.body,
  482. 'headers': _response.headers
  483. }
  484. return resp
  485. elif UtilClient.equal_string(body_type, 'byte'):
  486. byt = UtilClient.read_as_bytes(_response.body)
  487. return {
  488. 'body': byt,
  489. 'headers': _response.headers
  490. }
  491. elif UtilClient.equal_string(body_type, 'string'):
  492. str = UtilClient.read_as_string(_response.body)
  493. return {
  494. 'body': str,
  495. 'headers': _response.headers
  496. }
  497. elif UtilClient.equal_string(body_type, 'json'):
  498. obj = UtilClient.read_as_json(_response.body)
  499. res = UtilClient.assert_as_map(obj)
  500. return {
  501. 'body': res,
  502. 'headers': _response.headers
  503. }
  504. elif UtilClient.equal_string(body_type, 'array'):
  505. arr = UtilClient.read_as_json(_response.body)
  506. return {
  507. 'body': arr,
  508. 'headers': _response.headers
  509. }
  510. else:
  511. return {
  512. 'headers': _response.headers
  513. }
  514. except Exception as e:
  515. if TeaCore.is_retryable(e):
  516. _last_exception = e
  517. continue
  518. raise e
  519. raise UnretryableException(_last_request, _last_exception)
  520. def do_request(self, params, request, runtime):
  521. """
  522. Encapsulate the request and invoke the network
  523. @param action: api name
  524. @param version: product version
  525. @param protocol: http or https
  526. @param method: e.g. GET
  527. @param auth_type: authorization type e.g. AK
  528. @param body_type: response body type e.g. String
  529. @param request: object of OpenApiRequest
  530. @param runtime: which controls some details of call api, such as retry times
  531. @rtype: dict
  532. @return: the response
  533. """
  534. params.validate()
  535. request.validate()
  536. runtime.validate()
  537. _runtime = {
  538. 'timeouted': 'retry',
  539. 'readTimeout': UtilClient.default_number(runtime.read_timeout, self._read_timeout),
  540. 'connectTimeout': UtilClient.default_number(runtime.connect_timeout, self._connect_timeout),
  541. 'httpProxy': UtilClient.default_string(runtime.http_proxy, self._http_proxy),
  542. 'httpsProxy': UtilClient.default_string(runtime.https_proxy, self._https_proxy),
  543. 'noProxy': UtilClient.default_string(runtime.no_proxy, self._no_proxy),
  544. 'socks5Proxy': UtilClient.default_string(runtime.socks_5proxy, self._socks_5proxy),
  545. 'socks5NetWork': UtilClient.default_string(runtime.socks_5net_work, self._socks_5net_work),
  546. 'maxIdleConns': UtilClient.default_number(runtime.max_idle_conns, self._max_idle_conns),
  547. 'retry': {
  548. 'retryable': runtime.autoretry,
  549. 'maxAttempts': UtilClient.default_number(runtime.max_attempts, 3)
  550. },
  551. 'backoff': {
  552. 'policy': UtilClient.default_string(runtime.backoff_policy, 'no'),
  553. 'period': UtilClient.default_number(runtime.backoff_period, 1)
  554. },
  555. 'ignoreSSL': runtime.ignore_ssl
  556. }
  557. _last_request = None
  558. _last_exception = None
  559. _now = time.time()
  560. _retry_times = 0
  561. while TeaCore.allow_retry(_runtime.get('retry'), _retry_times, _now):
  562. if _retry_times > 0:
  563. _backoff_time = TeaCore.get_backoff_time(_runtime.get('backoff'), _retry_times)
  564. if _backoff_time > 0:
  565. TeaCore.sleep(_backoff_time)
  566. _retry_times = _retry_times + 1
  567. try:
  568. _request = TeaRequest()
  569. _request.protocol = UtilClient.default_string(self._protocol, params.protocol)
  570. _request.method = params.method
  571. _request.pathname = params.pathname
  572. _request.query = request.query
  573. # endpoint is setted in product client
  574. _request.headers = TeaCore.merge({
  575. 'host': self._endpoint,
  576. 'x-acs-version': params.version,
  577. 'x-acs-action': params.action,
  578. 'user-agent': self.get_user_agent(),
  579. 'x-acs-date': OpenApiUtilClient.get_timestamp(),
  580. 'x-acs-signature-nonce': UtilClient.get_nonce(),
  581. 'accept': 'application/json'
  582. }, request.headers)
  583. if UtilClient.equal_string(params.style, 'RPC'):
  584. headers = self.get_rpc_headers()
  585. if not UtilClient.is_unset(headers):
  586. _request.headers = TeaCore.merge(_request.headers,
  587. headers)
  588. signature_algorithm = UtilClient.default_string(self._signature_algorithm, 'ACS3-HMAC-SHA256')
  589. hashed_request_payload = OpenApiUtilClient.hex_encode(OpenApiUtilClient.hash(UtilClient.to_bytes(''), signature_algorithm))
  590. if not UtilClient.is_unset(request.stream):
  591. tmp = UtilClient.read_as_bytes(request.stream)
  592. hashed_request_payload = OpenApiUtilClient.hex_encode(OpenApiUtilClient.hash(tmp, signature_algorithm))
  593. _request.body = tmp
  594. _request.headers['content-type'] = 'application/octet-stream'
  595. else:
  596. if not UtilClient.is_unset(request.body):
  597. if UtilClient.equal_string(params.req_body_type, 'json'):
  598. json_obj = UtilClient.to_jsonstring(request.body)
  599. hashed_request_payload = OpenApiUtilClient.hex_encode(OpenApiUtilClient.hash(UtilClient.to_bytes(json_obj), signature_algorithm))
  600. _request.body = json_obj
  601. _request.headers['content-type'] = 'application/json; charset=utf-8'
  602. else:
  603. m = UtilClient.assert_as_map(request.body)
  604. form_obj = OpenApiUtilClient.to_form(m)
  605. hashed_request_payload = OpenApiUtilClient.hex_encode(OpenApiUtilClient.hash(UtilClient.to_bytes(form_obj), signature_algorithm))
  606. _request.body = form_obj
  607. _request.headers['content-type'] = 'application/x-www-form-urlencoded'
  608. _request.headers['x-acs-content-sha256'] = hashed_request_payload
  609. if not UtilClient.equal_string(params.auth_type, 'Anonymous'):
  610. auth_type = self.get_type()
  611. if UtilClient.equal_string(auth_type, 'bearer'):
  612. bearer_token = self.get_bearer_token()
  613. _request.headers['x-acs-bearer-token'] = bearer_token
  614. else:
  615. access_key_id = self.get_access_key_id()
  616. access_key_secret = self.get_access_key_secret()
  617. security_token = self.get_security_token()
  618. if not UtilClient.empty(security_token):
  619. _request.headers['x-acs-accesskey-id'] = access_key_id
  620. _request.headers['x-acs-security-token'] = security_token
  621. _request.headers['Authorization'] = OpenApiUtilClient.get_authorization(_request, signature_algorithm, hashed_request_payload, access_key_id, access_key_secret)
  622. _last_request = _request
  623. _response = TeaCore.do_action(_request, _runtime)
  624. if UtilClient.is_4xx(_response.status_code) or UtilClient.is_5xx(_response.status_code):
  625. err = {}
  626. if not UtilClient.is_unset(_response.headers.get('content-type')) and UtilClient.equal_string(_response.headers.get('content-type'), 'text/xml;charset=utf-8'):
  627. _str = UtilClient.read_as_string(_response.body)
  628. resp_map = XMLClient.parse_xml(_str, None)
  629. err = UtilClient.assert_as_map(resp_map.get('Error'))
  630. else:
  631. _res = UtilClient.read_as_json(_response.body)
  632. err = UtilClient.assert_as_map(_res)
  633. err['statusCode'] = _response.status_code
  634. raise TeaException({
  635. 'code': '%s' % TeaConverter.to_unicode(self.default_any(err.get('Code'), err.get('code'))),
  636. 'message': 'code: %s, %s request id: %s' % (TeaConverter.to_unicode(_response.status_code), TeaConverter.to_unicode(self.default_any(err.get('Message'), err.get('message'))), TeaConverter.to_unicode(self.default_any(err.get('RequestId'), err.get('requestId')))),
  637. 'data': err
  638. })
  639. if UtilClient.equal_string(params.body_type, 'binary'):
  640. resp = {
  641. 'body': _response.body,
  642. 'headers': _response.headers
  643. }
  644. return resp
  645. elif UtilClient.equal_string(params.body_type, 'byte'):
  646. byt = UtilClient.read_as_bytes(_response.body)
  647. return {
  648. 'body': byt,
  649. 'headers': _response.headers
  650. }
  651. elif UtilClient.equal_string(params.body_type, 'string'):
  652. str = UtilClient.read_as_string(_response.body)
  653. return {
  654. 'body': str,
  655. 'headers': _response.headers
  656. }
  657. elif UtilClient.equal_string(params.body_type, 'json'):
  658. obj = UtilClient.read_as_json(_response.body)
  659. res = UtilClient.assert_as_map(obj)
  660. return {
  661. 'body': res,
  662. 'headers': _response.headers
  663. }
  664. elif UtilClient.equal_string(params.body_type, 'array'):
  665. arr = UtilClient.read_as_json(_response.body)
  666. return {
  667. 'body': arr,
  668. 'headers': _response.headers
  669. }
  670. else:
  671. return {
  672. 'headers': _response.headers
  673. }
  674. except Exception as e:
  675. if TeaCore.is_retryable(e):
  676. _last_exception = e
  677. continue
  678. raise e
  679. raise UnretryableException(_last_request, _last_exception)
  680. def execute(self, params, request, runtime):
  681. """
  682. Encapsulate the request and invoke the network
  683. @param action: api name
  684. @param version: product version
  685. @param protocol: http or https
  686. @param method: e.g. GET
  687. @param auth_type: authorization type e.g. AK
  688. @param body_type: response body type e.g. String
  689. @param request: object of OpenApiRequest
  690. @param runtime: which controls some details of call api, such as retry times
  691. @rtype: dict
  692. @return: the response
  693. """
  694. params.validate()
  695. request.validate()
  696. runtime.validate()
  697. _runtime = {
  698. 'timeouted': 'retry',
  699. 'readTimeout': UtilClient.default_number(runtime.read_timeout, self._read_timeout),
  700. 'connectTimeout': UtilClient.default_number(runtime.connect_timeout, self._connect_timeout),
  701. 'httpProxy': UtilClient.default_string(runtime.http_proxy, self._http_proxy),
  702. 'httpsProxy': UtilClient.default_string(runtime.https_proxy, self._https_proxy),
  703. 'noProxy': UtilClient.default_string(runtime.no_proxy, self._no_proxy),
  704. 'socks5Proxy': UtilClient.default_string(runtime.socks_5proxy, self._socks_5proxy),
  705. 'socks5NetWork': UtilClient.default_string(runtime.socks_5net_work, self._socks_5net_work),
  706. 'maxIdleConns': UtilClient.default_number(runtime.max_idle_conns, self._max_idle_conns),
  707. 'retry': {
  708. 'retryable': runtime.autoretry,
  709. 'maxAttempts': UtilClient.default_number(runtime.max_attempts, 3)
  710. },
  711. 'backoff': {
  712. 'policy': UtilClient.default_string(runtime.backoff_policy, 'no'),
  713. 'period': UtilClient.default_number(runtime.backoff_period, 1)
  714. },
  715. 'ignoreSSL': runtime.ignore_ssl
  716. }
  717. _last_request = None
  718. _last_exception = None
  719. _now = time.time()
  720. _retry_times = 0
  721. while TeaCore.allow_retry(_runtime.get('retry'), _retry_times, _now):
  722. if _retry_times > 0:
  723. _backoff_time = TeaCore.get_backoff_time(_runtime.get('backoff'), _retry_times)
  724. if _backoff_time > 0:
  725. TeaCore.sleep(_backoff_time)
  726. _retry_times = _retry_times + 1
  727. try:
  728. _request = TeaRequest()
  729. # spi = new Gateway();//Gateway implements SPI,这一步在产品 SDK 中实例化
  730. headers = self.get_rpc_headers()
  731. request_context = spi_models.InterceptorContextRequest(
  732. headers=TeaCore.merge(request.headers,
  733. headers),
  734. query=request.query,
  735. body=request.body,
  736. stream=request.stream,
  737. host_map=request.host_map,
  738. pathname=params.pathname,
  739. product_id=self._product_id,
  740. action=params.action,
  741. version=params.version,
  742. protocol=UtilClient.default_string(self._protocol, params.protocol),
  743. method=UtilClient.default_string(self._method, params.method),
  744. auth_type=params.auth_type,
  745. body_type=params.body_type,
  746. req_body_type=params.req_body_type,
  747. style=params.style,
  748. credential=self._credential,
  749. signature_version=self._signature_version,
  750. signature_algorithm=self._signature_algorithm,
  751. user_agent=self.get_user_agent()
  752. )
  753. configuration_context = spi_models.InterceptorContextConfiguration(
  754. region_id=self._region_id,
  755. endpoint=UtilClient.default_string(request.endpoint_override, self._endpoint),
  756. endpoint_rule=self._endpoint_rule,
  757. endpoint_map=self._endpoint_map,
  758. endpoint_type=self._endpoint_type,
  759. network=self._network,
  760. suffix=self._suffix
  761. )
  762. interceptor_context = spi_models.InterceptorContext(
  763. request=request_context,
  764. configuration=configuration_context
  765. )
  766. attribute_map = spi_models.AttributeMap()
  767. # 1. spi.modifyConfiguration(context: SPI.InterceptorContext, attributeMap: SPI.AttributeMap);
  768. self._spi.modify_configuration(interceptor_context, attribute_map)
  769. # 2. spi.modifyRequest(context: SPI.InterceptorContext, attributeMap: SPI.AttributeMap);
  770. self._spi.modify_request(interceptor_context, attribute_map)
  771. _request.protocol = interceptor_context.request.protocol
  772. _request.method = interceptor_context.request.method
  773. _request.pathname = interceptor_context.request.pathname
  774. _request.query = interceptor_context.request.query
  775. _request.body = interceptor_context.request.stream
  776. _request.headers = interceptor_context.request.headers
  777. _last_request = _request
  778. _response = TeaCore.do_action(_request, _runtime)
  779. response_context = spi_models.InterceptorContextResponse(
  780. status_code=_response.status_code,
  781. headers=_response.headers,
  782. body=_response.body
  783. )
  784. interceptor_context.response = response_context
  785. # 3. spi.modifyResponse(context: SPI.InterceptorContext, attributeMap: SPI.AttributeMap);
  786. self._spi.modify_response(interceptor_context, attribute_map)
  787. return {
  788. 'headers': interceptor_context.response.headers,
  789. 'body': interceptor_context.response.deserialized_body
  790. }
  791. except Exception as e:
  792. if TeaCore.is_retryable(e):
  793. _last_exception = e
  794. continue
  795. raise e
  796. raise UnretryableException(_last_request, _last_exception)
  797. def call_api(self, params, request, runtime):
  798. if UtilClient.is_unset(params):
  799. raise TeaException({
  800. 'code': 'ParameterMissing',
  801. 'message': "'params' can not be unset"
  802. })
  803. if UtilClient.is_unset(self._signature_algorithm) or not UtilClient.equal_string(self._signature_algorithm, 'v2'):
  804. return self.do_request(params, request, runtime)
  805. elif UtilClient.equal_string(params.style, 'ROA') and UtilClient.equal_string(params.req_body_type, 'json'):
  806. return self.do_roarequest(params.action, params.version, params.protocol, params.method, params.auth_type, params.pathname, params.body_type, request, runtime)
  807. elif UtilClient.equal_string(params.style, 'ROA'):
  808. return self.do_roarequest_with_form(params.action, params.version, params.protocol, params.method, params.auth_type, params.pathname, params.body_type, request, runtime)
  809. else:
  810. return self.do_rpcrequest(params.action, params.version, params.protocol, params.method, params.auth_type, params.body_type, request, runtime)
  811. def get_user_agent(self):
  812. """
  813. Get user agent
  814. @rtype: str
  815. @return: user agent
  816. """
  817. user_agent = UtilClient.get_user_agent(self._user_agent)
  818. return user_agent
  819. def get_access_key_id(self):
  820. """
  821. Get accesskey id by using credential
  822. @rtype: str
  823. @return: accesskey id
  824. """
  825. if UtilClient.is_unset(self._credential):
  826. return ''
  827. access_key_id = self._credential.get_access_key_id()
  828. return access_key_id
  829. def get_access_key_secret(self):
  830. """
  831. Get accesskey secret by using credential
  832. @rtype: str
  833. @return: accesskey secret
  834. """
  835. if UtilClient.is_unset(self._credential):
  836. return ''
  837. secret = self._credential.get_access_key_secret()
  838. return secret
  839. def get_security_token(self):
  840. """
  841. Get security token by using credential
  842. @rtype: str
  843. @return: security token
  844. """
  845. if UtilClient.is_unset(self._credential):
  846. return ''
  847. token = self._credential.get_security_token()
  848. return token
  849. def get_bearer_token(self):
  850. """
  851. Get bearer token by credential
  852. @rtype: str
  853. @return: bearer token
  854. """
  855. if UtilClient.is_unset(self._credential):
  856. return ''
  857. token = self._credential.get_bearer_token()
  858. return token
  859. def get_type(self):
  860. """
  861. Get credential type by credential
  862. @rtype: str
  863. @return: credential type e.g. access_key
  864. """
  865. if UtilClient.is_unset(self._credential):
  866. return ''
  867. auth_type = self._credential.get_type()
  868. return auth_type
  869. @staticmethod
  870. def default_any(input_value, default_value):
  871. """
  872. If inputValue is not null, return it or return defaultValue
  873. @param input_value: users input value
  874. @param default_value: default value
  875. @return: the final result
  876. """
  877. if UtilClient.is_unset(input_value):
  878. return default_value
  879. return input_value
  880. def check_config(self, config):
  881. """
  882. If the endpointRule and config.endpoint are empty, throw error
  883. @param config: config contains the necessary information to create a client
  884. """
  885. if UtilClient.empty(self._endpoint_rule) and UtilClient.empty(config.endpoint):
  886. raise TeaException({
  887. 'code': 'ParameterMissing',
  888. 'message': "'config.endpoint' can not be empty"
  889. })
  890. def set_rpc_headers(self, headers):
  891. """
  892. set RPC header for debug
  893. @type headers: dict
  894. @param headers: headers for debug, this header can be used only once.
  895. """
  896. self._headers = headers
  897. def get_rpc_headers(self):
  898. """
  899. get RPC header for debug
  900. """
  901. headers = self._headers
  902. self._headers = None
  903. return headers