OpenApiClient.php 59 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274
  1. <?php
  2. // This file is auto-generated, don't edit it. Thanks.
  3. namespace Darabonba\OpenApi;
  4. use AlibabaCloud\Tea\Utils\Utils;
  5. use AlibabaCloud\Tea\Exception\TeaError;
  6. use AlibabaCloud\Credentials\Credential;
  7. use \Exception;
  8. use AlibabaCloud\Tea\Exception\TeaUnableRetryError;
  9. use AlibabaCloud\Tea\Tea;
  10. use AlibabaCloud\Tea\Request;
  11. use AlibabaCloud\OpenApiUtil\OpenApiUtilClient;
  12. use AlibabaCloud\Tea\XML\XML;
  13. use Darabonba\GatewaySpi\Client;
  14. use AlibabaCloud\Credentials\Credential\Config;
  15. use Darabonba\OpenApi\Models\OpenApiRequest;
  16. use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions;
  17. use Darabonba\OpenApi\Models\Params;
  18. use Darabonba\GatewaySpi\Models\InterceptorContext\configuration;
  19. use Darabonba\GatewaySpi\Models\InterceptorContext;
  20. use Darabonba\GatewaySpi\Models\AttributeMap;
  21. use Darabonba\GatewaySpi\Models\InterceptorContext\response;
  22. /**
  23. * This is for OpenApi SDK
  24. */
  25. class OpenApiClient
  26. {
  27. protected $_endpoint;
  28. protected $_regionId;
  29. protected $_protocol;
  30. protected $_method;
  31. protected $_userAgent;
  32. protected $_endpointRule;
  33. protected $_endpointMap;
  34. protected $_suffix;
  35. protected $_readTimeout;
  36. protected $_connectTimeout;
  37. protected $_httpProxy;
  38. protected $_httpsProxy;
  39. protected $_socks5Proxy;
  40. protected $_socks5NetWork;
  41. protected $_noProxy;
  42. protected $_network;
  43. protected $_productId;
  44. protected $_maxIdleConns;
  45. protected $_endpointType;
  46. protected $_openPlatformEndpoint;
  47. protected $_credential;
  48. protected $_signatureVersion;
  49. protected $_signatureAlgorithm;
  50. protected $_headers;
  51. protected $_spi;
  52. protected $_globalParameters;
  53. protected $_key;
  54. protected $_cert;
  55. protected $_ca;
  56. protected $_disableHttp2;
  57. /**
  58. * Init client with Config
  59. * @param config config contains the necessary information to create a client
  60. */
  61. public function __construct($config)
  62. {
  63. if (Utils::isUnset($config)) {
  64. throw new TeaError([
  65. "code" => "ParameterMissing",
  66. "message" => "'config' can not be unset"
  67. ]);
  68. }
  69. if (!Utils::empty_($config->accessKeyId) && !Utils::empty_($config->accessKeySecret)) {
  70. if (!Utils::empty_($config->securityToken)) {
  71. $config->type = "sts";
  72. } else {
  73. $config->type = "access_key";
  74. }
  75. $credentialConfig = new Config([
  76. "accessKeyId" => $config->accessKeyId,
  77. "type" => $config->type,
  78. "accessKeySecret" => $config->accessKeySecret
  79. ]);
  80. $credentialConfig->securityToken = $config->securityToken;
  81. $this->_credential = new Credential($credentialConfig);
  82. } else if (!Utils::empty_($config->bearerToken)) {
  83. $cc = new Config([
  84. "type" => "bearer",
  85. "bearerToken" => $config->bearerToken
  86. ]);
  87. $this->_credential = new Credential($cc);
  88. } else if (!Utils::isUnset($config->credential)) {
  89. $this->_credential = $config->credential;
  90. }
  91. $this->_endpoint = $config->endpoint;
  92. $this->_endpointType = $config->endpointType;
  93. $this->_network = $config->network;
  94. $this->_suffix = $config->suffix;
  95. $this->_protocol = $config->protocol;
  96. $this->_method = $config->method;
  97. $this->_regionId = $config->regionId;
  98. $this->_userAgent = $config->userAgent;
  99. $this->_readTimeout = $config->readTimeout;
  100. $this->_connectTimeout = $config->connectTimeout;
  101. $this->_httpProxy = $config->httpProxy;
  102. $this->_httpsProxy = $config->httpsProxy;
  103. $this->_noProxy = $config->noProxy;
  104. $this->_socks5Proxy = $config->socks5Proxy;
  105. $this->_socks5NetWork = $config->socks5NetWork;
  106. $this->_maxIdleConns = $config->maxIdleConns;
  107. $this->_signatureVersion = $config->signatureVersion;
  108. $this->_signatureAlgorithm = $config->signatureAlgorithm;
  109. $this->_globalParameters = $config->globalParameters;
  110. $this->_key = $config->key;
  111. $this->_cert = $config->cert;
  112. $this->_ca = $config->ca;
  113. $this->_disableHttp2 = $config->disableHttp2;
  114. }
  115. /**
  116. * Encapsulate the request and invoke the network
  117. * @param string $action api name
  118. * @param string $version product version
  119. * @param string $protocol http or https
  120. * @param string $method e.g. GET
  121. * @param string $authType authorization type e.g. AK
  122. * @param string $bodyType response body type e.g. String
  123. * @param OpenApiRequest $request object of OpenApiRequest
  124. * @param RuntimeOptions $runtime which controls some details of call api, such as retry times
  125. * @return array the response
  126. * @throws TeaError
  127. * @throws Exception
  128. * @throws TeaUnableRetryError
  129. */
  130. public function doRPCRequest($action, $version, $protocol, $method, $authType, $bodyType, $request, $runtime)
  131. {
  132. $request->validate();
  133. $runtime->validate();
  134. $_runtime = [
  135. "timeouted" => "retry",
  136. "key" => Utils::defaultString($runtime->key, $this->_key),
  137. "cert" => Utils::defaultString($runtime->cert, $this->_cert),
  138. "ca" => Utils::defaultString($runtime->ca, $this->_ca),
  139. "readTimeout" => Utils::defaultNumber($runtime->readTimeout, $this->_readTimeout),
  140. "connectTimeout" => Utils::defaultNumber($runtime->connectTimeout, $this->_connectTimeout),
  141. "httpProxy" => Utils::defaultString($runtime->httpProxy, $this->_httpProxy),
  142. "httpsProxy" => Utils::defaultString($runtime->httpsProxy, $this->_httpsProxy),
  143. "noProxy" => Utils::defaultString($runtime->noProxy, $this->_noProxy),
  144. "socks5Proxy" => Utils::defaultString($runtime->socks5Proxy, $this->_socks5Proxy),
  145. "socks5NetWork" => Utils::defaultString($runtime->socks5NetWork, $this->_socks5NetWork),
  146. "maxIdleConns" => Utils::defaultNumber($runtime->maxIdleConns, $this->_maxIdleConns),
  147. "retry" => [
  148. "retryable" => $runtime->autoretry,
  149. "maxAttempts" => Utils::defaultNumber($runtime->maxAttempts, 3)
  150. ],
  151. "backoff" => [
  152. "policy" => Utils::defaultString($runtime->backoffPolicy, "no"),
  153. "period" => Utils::defaultNumber($runtime->backoffPeriod, 1)
  154. ],
  155. "ignoreSSL" => $runtime->ignoreSSL
  156. ];
  157. $_lastRequest = null;
  158. $_lastException = null;
  159. $_now = time();
  160. $_retryTimes = 0;
  161. while (Tea::allowRetry(@$_runtime["retry"], $_retryTimes, $_now)) {
  162. if ($_retryTimes > 0) {
  163. $_backoffTime = Tea::getBackoffTime(@$_runtime["backoff"], $_retryTimes);
  164. if ($_backoffTime > 0) {
  165. Tea::sleep($_backoffTime);
  166. }
  167. }
  168. $_retryTimes = $_retryTimes + 1;
  169. try {
  170. $_request = new Request();
  171. $_request->protocol = Utils::defaultString($this->_protocol, $protocol);
  172. $_request->method = $method;
  173. $_request->pathname = "/";
  174. $globalQueries = [];
  175. $globalHeaders = [];
  176. if (!Utils::isUnset($this->_globalParameters)) {
  177. $globalParams = $this->_globalParameters;
  178. if (!Utils::isUnset($globalParams->queries)) {
  179. $globalQueries = $globalParams->queries;
  180. }
  181. if (!Utils::isUnset($globalParams->headers)) {
  182. $globalHeaders = $globalParams->headers;
  183. }
  184. }
  185. $extendsHeaders = [];
  186. $extendsQueries = [];
  187. if (!Utils::isUnset($runtime->extendsParameters)) {
  188. $extendsParameters = $runtime->extendsParameters;
  189. if (!Utils::isUnset($extendsParameters->headers)) {
  190. $extendsHeaders = $extendsParameters->headers;
  191. }
  192. if (!Utils::isUnset($extendsParameters->queries)) {
  193. $extendsQueries = $extendsParameters->queries;
  194. }
  195. }
  196. $_request->query = Tea::merge([
  197. "Action" => $action,
  198. "Format" => "json",
  199. "Version" => $version,
  200. "Timestamp" => OpenApiUtilClient::getTimestamp(),
  201. "SignatureNonce" => Utils::getNonce()
  202. ], $globalQueries, $extendsQueries, $request->query);
  203. $headers = $this->getRpcHeaders();
  204. if (Utils::isUnset($headers)) {
  205. // endpoint is setted in product client
  206. $_request->headers = Tea::merge([
  207. "host" => $this->_endpoint,
  208. "x-acs-version" => $version,
  209. "x-acs-action" => $action,
  210. "user-agent" => $this->getUserAgent()
  211. ], $globalHeaders, $extendsHeaders);
  212. } else {
  213. $_request->headers = Tea::merge([
  214. "host" => $this->_endpoint,
  215. "x-acs-version" => $version,
  216. "x-acs-action" => $action,
  217. "user-agent" => $this->getUserAgent()
  218. ], $globalHeaders, $extendsHeaders, $headers);
  219. }
  220. if (!Utils::isUnset($request->body)) {
  221. $m = Utils::assertAsMap($request->body);
  222. $tmp = Utils::anyifyMapValue(OpenApiUtilClient::query($m));
  223. $_request->body = Utils::toFormString($tmp);
  224. $_request->headers["content-type"] = "application/x-www-form-urlencoded";
  225. }
  226. if (!Utils::equalString($authType, "Anonymous")) {
  227. $credentialType = $this->getType();
  228. if (Utils::equalString($credentialType, "bearer")) {
  229. $bearerToken = $this->getBearerToken();
  230. $_request->query["BearerToken"] = $bearerToken;
  231. $_request->query["SignatureType"] = "BEARERTOKEN";
  232. } else {
  233. $accessKeyId = $this->getAccessKeyId();
  234. $accessKeySecret = $this->getAccessKeySecret();
  235. $securityToken = $this->getSecurityToken();
  236. if (!Utils::empty_($securityToken)) {
  237. $_request->query["SecurityToken"] = $securityToken;
  238. }
  239. $_request->query["SignatureMethod"] = "HMAC-SHA1";
  240. $_request->query["SignatureVersion"] = "1.0";
  241. $_request->query["AccessKeyId"] = $accessKeyId;
  242. $t = null;
  243. if (!Utils::isUnset($request->body)) {
  244. $t = Utils::assertAsMap($request->body);
  245. }
  246. $signedParam = Tea::merge($_request->query, OpenApiUtilClient::query($t));
  247. $_request->query["Signature"] = OpenApiUtilClient::getRPCSignature($signedParam, $_request->method, $accessKeySecret);
  248. }
  249. }
  250. $_lastRequest = $_request;
  251. $_response = Tea::send($_request, $_runtime);
  252. if (Utils::is4xx($_response->statusCode) || Utils::is5xx($_response->statusCode)) {
  253. $_res = Utils::readAsJSON($_response->body);
  254. $err = Utils::assertAsMap($_res);
  255. $requestId = self::defaultAny(@$err["RequestId"], @$err["requestId"]);
  256. @$err["statusCode"] = $_response->statusCode;
  257. throw new TeaError([
  258. "code" => "" . (string) (self::defaultAny(@$err["Code"], @$err["code"])) . "",
  259. "message" => "code: " . (string) ($_response->statusCode) . ", " . (string) (self::defaultAny(@$err["Message"], @$err["message"])) . " request id: " . (string) ($requestId) . "",
  260. "data" => $err,
  261. "description" => "" . (string) (self::defaultAny(@$err["Description"], @$err["description"])) . "",
  262. "accessDeniedDetail" => self::defaultAny(@$err["AccessDeniedDetail"], @$err["accessDeniedDetail"])
  263. ]);
  264. }
  265. if (Utils::equalString($bodyType, "binary")) {
  266. $resp = [
  267. "body" => $_response->body,
  268. "headers" => $_response->headers,
  269. "statusCode" => $_response->statusCode
  270. ];
  271. return $resp;
  272. } else if (Utils::equalString($bodyType, "byte")) {
  273. $byt = Utils::readAsBytes($_response->body);
  274. return [
  275. "body" => $byt,
  276. "headers" => $_response->headers,
  277. "statusCode" => $_response->statusCode
  278. ];
  279. } else if (Utils::equalString($bodyType, "string")) {
  280. $str = Utils::readAsString($_response->body);
  281. return [
  282. "body" => $str,
  283. "headers" => $_response->headers,
  284. "statusCode" => $_response->statusCode
  285. ];
  286. } else if (Utils::equalString($bodyType, "json")) {
  287. $obj = Utils::readAsJSON($_response->body);
  288. $res = Utils::assertAsMap($obj);
  289. return [
  290. "body" => $res,
  291. "headers" => $_response->headers,
  292. "statusCode" => $_response->statusCode
  293. ];
  294. } else if (Utils::equalString($bodyType, "array")) {
  295. $arr = Utils::readAsJSON($_response->body);
  296. return [
  297. "body" => $arr,
  298. "headers" => $_response->headers,
  299. "statusCode" => $_response->statusCode
  300. ];
  301. } else {
  302. return [
  303. "headers" => $_response->headers,
  304. "statusCode" => $_response->statusCode
  305. ];
  306. }
  307. } catch (Exception $e) {
  308. if (!($e instanceof TeaError)) {
  309. $e = new TeaError([], $e->getMessage(), $e->getCode(), $e);
  310. }
  311. if (Tea::isRetryable($e)) {
  312. $_lastException = $e;
  313. continue;
  314. }
  315. throw $e;
  316. }
  317. }
  318. throw new TeaUnableRetryError($_lastRequest, $_lastException);
  319. }
  320. /**
  321. * Encapsulate the request and invoke the network
  322. * @param string $action api name
  323. * @param string $version product version
  324. * @param string $protocol http or https
  325. * @param string $method e.g. GET
  326. * @param string $authType authorization type e.g. AK
  327. * @param string $pathname pathname of every api
  328. * @param string $bodyType response body type e.g. String
  329. * @param OpenApiRequest $request object of OpenApiRequest
  330. * @param RuntimeOptions $runtime which controls some details of call api, such as retry times
  331. * @return array the response
  332. * @throws TeaError
  333. * @throws Exception
  334. * @throws TeaUnableRetryError
  335. */
  336. public function doROARequest($action, $version, $protocol, $method, $authType, $pathname, $bodyType, $request, $runtime)
  337. {
  338. $request->validate();
  339. $runtime->validate();
  340. $_runtime = [
  341. "timeouted" => "retry",
  342. "key" => Utils::defaultString($runtime->key, $this->_key),
  343. "cert" => Utils::defaultString($runtime->cert, $this->_cert),
  344. "ca" => Utils::defaultString($runtime->ca, $this->_ca),
  345. "readTimeout" => Utils::defaultNumber($runtime->readTimeout, $this->_readTimeout),
  346. "connectTimeout" => Utils::defaultNumber($runtime->connectTimeout, $this->_connectTimeout),
  347. "httpProxy" => Utils::defaultString($runtime->httpProxy, $this->_httpProxy),
  348. "httpsProxy" => Utils::defaultString($runtime->httpsProxy, $this->_httpsProxy),
  349. "noProxy" => Utils::defaultString($runtime->noProxy, $this->_noProxy),
  350. "socks5Proxy" => Utils::defaultString($runtime->socks5Proxy, $this->_socks5Proxy),
  351. "socks5NetWork" => Utils::defaultString($runtime->socks5NetWork, $this->_socks5NetWork),
  352. "maxIdleConns" => Utils::defaultNumber($runtime->maxIdleConns, $this->_maxIdleConns),
  353. "retry" => [
  354. "retryable" => $runtime->autoretry,
  355. "maxAttempts" => Utils::defaultNumber($runtime->maxAttempts, 3)
  356. ],
  357. "backoff" => [
  358. "policy" => Utils::defaultString($runtime->backoffPolicy, "no"),
  359. "period" => Utils::defaultNumber($runtime->backoffPeriod, 1)
  360. ],
  361. "ignoreSSL" => $runtime->ignoreSSL
  362. ];
  363. $_lastRequest = null;
  364. $_lastException = null;
  365. $_now = time();
  366. $_retryTimes = 0;
  367. while (Tea::allowRetry(@$_runtime["retry"], $_retryTimes, $_now)) {
  368. if ($_retryTimes > 0) {
  369. $_backoffTime = Tea::getBackoffTime(@$_runtime["backoff"], $_retryTimes);
  370. if ($_backoffTime > 0) {
  371. Tea::sleep($_backoffTime);
  372. }
  373. }
  374. $_retryTimes = $_retryTimes + 1;
  375. try {
  376. $_request = new Request();
  377. $_request->protocol = Utils::defaultString($this->_protocol, $protocol);
  378. $_request->method = $method;
  379. $_request->pathname = $pathname;
  380. $globalQueries = [];
  381. $globalHeaders = [];
  382. if (!Utils::isUnset($this->_globalParameters)) {
  383. $globalParams = $this->_globalParameters;
  384. if (!Utils::isUnset($globalParams->queries)) {
  385. $globalQueries = $globalParams->queries;
  386. }
  387. if (!Utils::isUnset($globalParams->headers)) {
  388. $globalHeaders = $globalParams->headers;
  389. }
  390. }
  391. $extendsHeaders = [];
  392. $extendsQueries = [];
  393. if (!Utils::isUnset($runtime->extendsParameters)) {
  394. $extendsParameters = $runtime->extendsParameters;
  395. if (!Utils::isUnset($extendsParameters->headers)) {
  396. $extendsHeaders = $extendsParameters->headers;
  397. }
  398. if (!Utils::isUnset($extendsParameters->queries)) {
  399. $extendsQueries = $extendsParameters->queries;
  400. }
  401. }
  402. $_request->headers = Tea::merge([
  403. "date" => Utils::getDateUTCString(),
  404. "host" => $this->_endpoint,
  405. "accept" => "application/json",
  406. "x-acs-signature-nonce" => Utils::getNonce(),
  407. "x-acs-signature-method" => "HMAC-SHA1",
  408. "x-acs-signature-version" => "1.0",
  409. "x-acs-version" => $version,
  410. "x-acs-action" => $action,
  411. "user-agent" => Utils::getUserAgent($this->_userAgent)
  412. ], $globalHeaders, $extendsHeaders, $request->headers);
  413. if (!Utils::isUnset($request->body)) {
  414. $_request->body = Utils::toJSONString($request->body);
  415. $_request->headers["content-type"] = "application/json; charset=utf-8";
  416. }
  417. $_request->query = Tea::merge($globalQueries, $extendsQueries);
  418. if (!Utils::isUnset($request->query)) {
  419. $_request->query = Tea::merge($_request->query, $request->query);
  420. }
  421. if (!Utils::equalString($authType, "Anonymous")) {
  422. $credentialType = $this->getType();
  423. if (Utils::equalString($credentialType, "bearer")) {
  424. $bearerToken = $this->getBearerToken();
  425. $_request->headers["x-acs-bearer-token"] = $bearerToken;
  426. $_request->headers["x-acs-signature-type"] = "BEARERTOKEN";
  427. } else {
  428. $accessKeyId = $this->getAccessKeyId();
  429. $accessKeySecret = $this->getAccessKeySecret();
  430. $securityToken = $this->getSecurityToken();
  431. if (!Utils::empty_($securityToken)) {
  432. $_request->headers["x-acs-accesskey-id"] = $accessKeyId;
  433. $_request->headers["x-acs-security-token"] = $securityToken;
  434. }
  435. $stringToSign = OpenApiUtilClient::getStringToSign($_request);
  436. $_request->headers["authorization"] = "acs " . $accessKeyId . ":" . OpenApiUtilClient::getROASignature($stringToSign, $accessKeySecret) . "";
  437. }
  438. }
  439. $_lastRequest = $_request;
  440. $_response = Tea::send($_request, $_runtime);
  441. if (Utils::equalNumber($_response->statusCode, 204)) {
  442. return [
  443. "headers" => $_response->headers
  444. ];
  445. }
  446. if (Utils::is4xx($_response->statusCode) || Utils::is5xx($_response->statusCode)) {
  447. $_res = Utils::readAsJSON($_response->body);
  448. $err = Utils::assertAsMap($_res);
  449. $requestId = self::defaultAny(@$err["RequestId"], @$err["requestId"]);
  450. $requestId = self::defaultAny($requestId, @$err["requestid"]);
  451. @$err["statusCode"] = $_response->statusCode;
  452. throw new TeaError([
  453. "code" => "" . (string) (self::defaultAny(@$err["Code"], @$err["code"])) . "",
  454. "message" => "code: " . (string) ($_response->statusCode) . ", " . (string) (self::defaultAny(@$err["Message"], @$err["message"])) . " request id: " . (string) ($requestId) . "",
  455. "data" => $err,
  456. "description" => "" . (string) (self::defaultAny(@$err["Description"], @$err["description"])) . "",
  457. "accessDeniedDetail" => self::defaultAny(@$err["AccessDeniedDetail"], @$err["accessDeniedDetail"])
  458. ]);
  459. }
  460. if (Utils::equalString($bodyType, "binary")) {
  461. $resp = [
  462. "body" => $_response->body,
  463. "headers" => $_response->headers,
  464. "statusCode" => $_response->statusCode
  465. ];
  466. return $resp;
  467. } else if (Utils::equalString($bodyType, "byte")) {
  468. $byt = Utils::readAsBytes($_response->body);
  469. return [
  470. "body" => $byt,
  471. "headers" => $_response->headers,
  472. "statusCode" => $_response->statusCode
  473. ];
  474. } else if (Utils::equalString($bodyType, "string")) {
  475. $str = Utils::readAsString($_response->body);
  476. return [
  477. "body" => $str,
  478. "headers" => $_response->headers,
  479. "statusCode" => $_response->statusCode
  480. ];
  481. } else if (Utils::equalString($bodyType, "json")) {
  482. $obj = Utils::readAsJSON($_response->body);
  483. $res = Utils::assertAsMap($obj);
  484. return [
  485. "body" => $res,
  486. "headers" => $_response->headers,
  487. "statusCode" => $_response->statusCode
  488. ];
  489. } else if (Utils::equalString($bodyType, "array")) {
  490. $arr = Utils::readAsJSON($_response->body);
  491. return [
  492. "body" => $arr,
  493. "headers" => $_response->headers,
  494. "statusCode" => $_response->statusCode
  495. ];
  496. } else {
  497. return [
  498. "headers" => $_response->headers,
  499. "statusCode" => $_response->statusCode
  500. ];
  501. }
  502. } catch (Exception $e) {
  503. if (!($e instanceof TeaError)) {
  504. $e = new TeaError([], $e->getMessage(), $e->getCode(), $e);
  505. }
  506. if (Tea::isRetryable($e)) {
  507. $_lastException = $e;
  508. continue;
  509. }
  510. throw $e;
  511. }
  512. }
  513. throw new TeaUnableRetryError($_lastRequest, $_lastException);
  514. }
  515. /**
  516. * Encapsulate the request and invoke the network with form body
  517. * @param string $action api name
  518. * @param string $version product version
  519. * @param string $protocol http or https
  520. * @param string $method e.g. GET
  521. * @param string $authType authorization type e.g. AK
  522. * @param string $pathname pathname of every api
  523. * @param string $bodyType response body type e.g. String
  524. * @param OpenApiRequest $request object of OpenApiRequest
  525. * @param RuntimeOptions $runtime which controls some details of call api, such as retry times
  526. * @return array the response
  527. * @throws TeaError
  528. * @throws Exception
  529. * @throws TeaUnableRetryError
  530. */
  531. public function doROARequestWithForm($action, $version, $protocol, $method, $authType, $pathname, $bodyType, $request, $runtime)
  532. {
  533. $request->validate();
  534. $runtime->validate();
  535. $_runtime = [
  536. "timeouted" => "retry",
  537. "key" => Utils::defaultString($runtime->key, $this->_key),
  538. "cert" => Utils::defaultString($runtime->cert, $this->_cert),
  539. "ca" => Utils::defaultString($runtime->ca, $this->_ca),
  540. "readTimeout" => Utils::defaultNumber($runtime->readTimeout, $this->_readTimeout),
  541. "connectTimeout" => Utils::defaultNumber($runtime->connectTimeout, $this->_connectTimeout),
  542. "httpProxy" => Utils::defaultString($runtime->httpProxy, $this->_httpProxy),
  543. "httpsProxy" => Utils::defaultString($runtime->httpsProxy, $this->_httpsProxy),
  544. "noProxy" => Utils::defaultString($runtime->noProxy, $this->_noProxy),
  545. "socks5Proxy" => Utils::defaultString($runtime->socks5Proxy, $this->_socks5Proxy),
  546. "socks5NetWork" => Utils::defaultString($runtime->socks5NetWork, $this->_socks5NetWork),
  547. "maxIdleConns" => Utils::defaultNumber($runtime->maxIdleConns, $this->_maxIdleConns),
  548. "retry" => [
  549. "retryable" => $runtime->autoretry,
  550. "maxAttempts" => Utils::defaultNumber($runtime->maxAttempts, 3)
  551. ],
  552. "backoff" => [
  553. "policy" => Utils::defaultString($runtime->backoffPolicy, "no"),
  554. "period" => Utils::defaultNumber($runtime->backoffPeriod, 1)
  555. ],
  556. "ignoreSSL" => $runtime->ignoreSSL
  557. ];
  558. $_lastRequest = null;
  559. $_lastException = null;
  560. $_now = time();
  561. $_retryTimes = 0;
  562. while (Tea::allowRetry(@$_runtime["retry"], $_retryTimes, $_now)) {
  563. if ($_retryTimes > 0) {
  564. $_backoffTime = Tea::getBackoffTime(@$_runtime["backoff"], $_retryTimes);
  565. if ($_backoffTime > 0) {
  566. Tea::sleep($_backoffTime);
  567. }
  568. }
  569. $_retryTimes = $_retryTimes + 1;
  570. try {
  571. $_request = new Request();
  572. $_request->protocol = Utils::defaultString($this->_protocol, $protocol);
  573. $_request->method = $method;
  574. $_request->pathname = $pathname;
  575. $globalQueries = [];
  576. $globalHeaders = [];
  577. if (!Utils::isUnset($this->_globalParameters)) {
  578. $globalParams = $this->_globalParameters;
  579. if (!Utils::isUnset($globalParams->queries)) {
  580. $globalQueries = $globalParams->queries;
  581. }
  582. if (!Utils::isUnset($globalParams->headers)) {
  583. $globalHeaders = $globalParams->headers;
  584. }
  585. }
  586. $extendsHeaders = [];
  587. $extendsQueries = [];
  588. if (!Utils::isUnset($runtime->extendsParameters)) {
  589. $extendsParameters = $runtime->extendsParameters;
  590. if (!Utils::isUnset($extendsParameters->headers)) {
  591. $extendsHeaders = $extendsParameters->headers;
  592. }
  593. if (!Utils::isUnset($extendsParameters->queries)) {
  594. $extendsQueries = $extendsParameters->queries;
  595. }
  596. }
  597. $_request->headers = Tea::merge([
  598. "date" => Utils::getDateUTCString(),
  599. "host" => $this->_endpoint,
  600. "accept" => "application/json",
  601. "x-acs-signature-nonce" => Utils::getNonce(),
  602. "x-acs-signature-method" => "HMAC-SHA1",
  603. "x-acs-signature-version" => "1.0",
  604. "x-acs-version" => $version,
  605. "x-acs-action" => $action,
  606. "user-agent" => Utils::getUserAgent($this->_userAgent)
  607. ], $globalHeaders, $extendsHeaders, $request->headers);
  608. if (!Utils::isUnset($request->body)) {
  609. $m = Utils::assertAsMap($request->body);
  610. $_request->body = OpenApiUtilClient::toForm($m);
  611. $_request->headers["content-type"] = "application/x-www-form-urlencoded";
  612. }
  613. $_request->query = Tea::merge($globalQueries, $extendsQueries);
  614. if (!Utils::isUnset($request->query)) {
  615. $_request->query = Tea::merge($_request->query, $request->query);
  616. }
  617. if (!Utils::equalString($authType, "Anonymous")) {
  618. $credentialType = $this->getType();
  619. if (Utils::equalString($credentialType, "bearer")) {
  620. $bearerToken = $this->getBearerToken();
  621. $_request->headers["x-acs-bearer-token"] = $bearerToken;
  622. $_request->headers["x-acs-signature-type"] = "BEARERTOKEN";
  623. } else {
  624. $accessKeyId = $this->getAccessKeyId();
  625. $accessKeySecret = $this->getAccessKeySecret();
  626. $securityToken = $this->getSecurityToken();
  627. if (!Utils::empty_($securityToken)) {
  628. $_request->headers["x-acs-accesskey-id"] = $accessKeyId;
  629. $_request->headers["x-acs-security-token"] = $securityToken;
  630. }
  631. $stringToSign = OpenApiUtilClient::getStringToSign($_request);
  632. $_request->headers["authorization"] = "acs " . $accessKeyId . ":" . OpenApiUtilClient::getROASignature($stringToSign, $accessKeySecret) . "";
  633. }
  634. }
  635. $_lastRequest = $_request;
  636. $_response = Tea::send($_request, $_runtime);
  637. if (Utils::equalNumber($_response->statusCode, 204)) {
  638. return [
  639. "headers" => $_response->headers
  640. ];
  641. }
  642. if (Utils::is4xx($_response->statusCode) || Utils::is5xx($_response->statusCode)) {
  643. $_res = Utils::readAsJSON($_response->body);
  644. $err = Utils::assertAsMap($_res);
  645. @$err["statusCode"] = $_response->statusCode;
  646. throw new TeaError([
  647. "code" => "" . (string) (self::defaultAny(@$err["Code"], @$err["code"])) . "",
  648. "message" => "code: " . (string) ($_response->statusCode) . ", " . (string) (self::defaultAny(@$err["Message"], @$err["message"])) . " request id: " . (string) (self::defaultAny(@$err["RequestId"], @$err["requestId"])) . "",
  649. "data" => $err,
  650. "description" => "" . (string) (self::defaultAny(@$err["Description"], @$err["description"])) . "",
  651. "accessDeniedDetail" => self::defaultAny(@$err["AccessDeniedDetail"], @$err["accessDeniedDetail"])
  652. ]);
  653. }
  654. if (Utils::equalString($bodyType, "binary")) {
  655. $resp = [
  656. "body" => $_response->body,
  657. "headers" => $_response->headers,
  658. "statusCode" => $_response->statusCode
  659. ];
  660. return $resp;
  661. } else if (Utils::equalString($bodyType, "byte")) {
  662. $byt = Utils::readAsBytes($_response->body);
  663. return [
  664. "body" => $byt,
  665. "headers" => $_response->headers,
  666. "statusCode" => $_response->statusCode
  667. ];
  668. } else if (Utils::equalString($bodyType, "string")) {
  669. $str = Utils::readAsString($_response->body);
  670. return [
  671. "body" => $str,
  672. "headers" => $_response->headers,
  673. "statusCode" => $_response->statusCode
  674. ];
  675. } else if (Utils::equalString($bodyType, "json")) {
  676. $obj = Utils::readAsJSON($_response->body);
  677. $res = Utils::assertAsMap($obj);
  678. return [
  679. "body" => $res,
  680. "headers" => $_response->headers,
  681. "statusCode" => $_response->statusCode
  682. ];
  683. } else if (Utils::equalString($bodyType, "array")) {
  684. $arr = Utils::readAsJSON($_response->body);
  685. return [
  686. "body" => $arr,
  687. "headers" => $_response->headers,
  688. "statusCode" => $_response->statusCode
  689. ];
  690. } else {
  691. return [
  692. "headers" => $_response->headers,
  693. "statusCode" => $_response->statusCode
  694. ];
  695. }
  696. } catch (Exception $e) {
  697. if (!($e instanceof TeaError)) {
  698. $e = new TeaError([], $e->getMessage(), $e->getCode(), $e);
  699. }
  700. if (Tea::isRetryable($e)) {
  701. $_lastException = $e;
  702. continue;
  703. }
  704. throw $e;
  705. }
  706. }
  707. throw new TeaUnableRetryError($_lastRequest, $_lastException);
  708. }
  709. /**
  710. * Encapsulate the request and invoke the network
  711. * @param Params $params
  712. * @param OpenApiRequest $request object of OpenApiRequest
  713. * @param RuntimeOptions $runtime which controls some details of call api, such as retry times
  714. * @return array the response
  715. * @throws TeaError
  716. * @throws Exception
  717. * @throws TeaUnableRetryError
  718. */
  719. public function doRequest($params, $request, $runtime)
  720. {
  721. $params->validate();
  722. $request->validate();
  723. $runtime->validate();
  724. $_runtime = [
  725. "timeouted" => "retry",
  726. "key" => Utils::defaultString($runtime->key, $this->_key),
  727. "cert" => Utils::defaultString($runtime->cert, $this->_cert),
  728. "ca" => Utils::defaultString($runtime->ca, $this->_ca),
  729. "readTimeout" => Utils::defaultNumber($runtime->readTimeout, $this->_readTimeout),
  730. "connectTimeout" => Utils::defaultNumber($runtime->connectTimeout, $this->_connectTimeout),
  731. "httpProxy" => Utils::defaultString($runtime->httpProxy, $this->_httpProxy),
  732. "httpsProxy" => Utils::defaultString($runtime->httpsProxy, $this->_httpsProxy),
  733. "noProxy" => Utils::defaultString($runtime->noProxy, $this->_noProxy),
  734. "socks5Proxy" => Utils::defaultString($runtime->socks5Proxy, $this->_socks5Proxy),
  735. "socks5NetWork" => Utils::defaultString($runtime->socks5NetWork, $this->_socks5NetWork),
  736. "maxIdleConns" => Utils::defaultNumber($runtime->maxIdleConns, $this->_maxIdleConns),
  737. "retry" => [
  738. "retryable" => $runtime->autoretry,
  739. "maxAttempts" => Utils::defaultNumber($runtime->maxAttempts, 3)
  740. ],
  741. "backoff" => [
  742. "policy" => Utils::defaultString($runtime->backoffPolicy, "no"),
  743. "period" => Utils::defaultNumber($runtime->backoffPeriod, 1)
  744. ],
  745. "ignoreSSL" => $runtime->ignoreSSL
  746. ];
  747. $_lastRequest = null;
  748. $_lastException = null;
  749. $_now = time();
  750. $_retryTimes = 0;
  751. while (Tea::allowRetry(@$_runtime["retry"], $_retryTimes, $_now)) {
  752. if ($_retryTimes > 0) {
  753. $_backoffTime = Tea::getBackoffTime(@$_runtime["backoff"], $_retryTimes);
  754. if ($_backoffTime > 0) {
  755. Tea::sleep($_backoffTime);
  756. }
  757. }
  758. $_retryTimes = $_retryTimes + 1;
  759. try {
  760. $_request = new Request();
  761. $_request->protocol = Utils::defaultString($this->_protocol, $params->protocol);
  762. $_request->method = $params->method;
  763. $_request->pathname = $params->pathname;
  764. $globalQueries = [];
  765. $globalHeaders = [];
  766. if (!Utils::isUnset($this->_globalParameters)) {
  767. $globalParams = $this->_globalParameters;
  768. if (!Utils::isUnset($globalParams->queries)) {
  769. $globalQueries = $globalParams->queries;
  770. }
  771. if (!Utils::isUnset($globalParams->headers)) {
  772. $globalHeaders = $globalParams->headers;
  773. }
  774. }
  775. $extendsHeaders = [];
  776. $extendsQueries = [];
  777. if (!Utils::isUnset($runtime->extendsParameters)) {
  778. $extendsParameters = $runtime->extendsParameters;
  779. if (!Utils::isUnset($extendsParameters->headers)) {
  780. $extendsHeaders = $extendsParameters->headers;
  781. }
  782. if (!Utils::isUnset($extendsParameters->queries)) {
  783. $extendsQueries = $extendsParameters->queries;
  784. }
  785. }
  786. $_request->query = Tea::merge($globalQueries, $extendsQueries, $request->query);
  787. // endpoint is setted in product client
  788. $_request->headers = Tea::merge([
  789. "host" => $this->_endpoint,
  790. "x-acs-version" => $params->version,
  791. "x-acs-action" => $params->action,
  792. "user-agent" => $this->getUserAgent(),
  793. "x-acs-date" => OpenApiUtilClient::getTimestamp(),
  794. "x-acs-signature-nonce" => Utils::getNonce(),
  795. "accept" => "application/json"
  796. ], $globalHeaders, $extendsHeaders, $request->headers);
  797. if (Utils::equalString($params->style, "RPC")) {
  798. $headers = $this->getRpcHeaders();
  799. if (!Utils::isUnset($headers)) {
  800. $_request->headers = Tea::merge($_request->headers, $headers);
  801. }
  802. }
  803. $signatureAlgorithm = Utils::defaultString($this->_signatureAlgorithm, "ACS3-HMAC-SHA256");
  804. $hashedRequestPayload = OpenApiUtilClient::hexEncode(OpenApiUtilClient::hash(Utils::toBytes(""), $signatureAlgorithm));
  805. if (!Utils::isUnset($request->stream)) {
  806. $tmp = Utils::readAsBytes($request->stream);
  807. $hashedRequestPayload = OpenApiUtilClient::hexEncode(OpenApiUtilClient::hash($tmp, $signatureAlgorithm));
  808. $_request->body = $tmp;
  809. $_request->headers["content-type"] = "application/octet-stream";
  810. } else {
  811. if (!Utils::isUnset($request->body)) {
  812. if (Utils::equalString($params->reqBodyType, "byte")) {
  813. $byteObj = Utils::assertAsBytes($request->body);
  814. $hashedRequestPayload = OpenApiUtilClient::hexEncode(OpenApiUtilClient::hash($byteObj, $signatureAlgorithm));
  815. $_request->body = $byteObj;
  816. } else if (Utils::equalString($params->reqBodyType, "json")) {
  817. $jsonObj = Utils::toJSONString($request->body);
  818. $hashedRequestPayload = OpenApiUtilClient::hexEncode(OpenApiUtilClient::hash(Utils::toBytes($jsonObj), $signatureAlgorithm));
  819. $_request->body = $jsonObj;
  820. $_request->headers["content-type"] = "application/json; charset=utf-8";
  821. } else {
  822. $m = Utils::assertAsMap($request->body);
  823. $formObj = OpenApiUtilClient::toForm($m);
  824. $hashedRequestPayload = OpenApiUtilClient::hexEncode(OpenApiUtilClient::hash(Utils::toBytes($formObj), $signatureAlgorithm));
  825. $_request->body = $formObj;
  826. $_request->headers["content-type"] = "application/x-www-form-urlencoded";
  827. }
  828. }
  829. }
  830. $_request->headers["x-acs-content-sha256"] = $hashedRequestPayload;
  831. if (!Utils::equalString($params->authType, "Anonymous")) {
  832. $authType = $this->getType();
  833. if (Utils::equalString($authType, "bearer")) {
  834. $bearerToken = $this->getBearerToken();
  835. $_request->headers["x-acs-bearer-token"] = $bearerToken;
  836. if (Utils::equalString($params->style, "RPC")) {
  837. $_request->query["SignatureType"] = "BEARERTOKEN";
  838. } else {
  839. $_request->headers["x-acs-signature-type"] = "BEARERTOKEN";
  840. }
  841. } else {
  842. $accessKeyId = $this->getAccessKeyId();
  843. $accessKeySecret = $this->getAccessKeySecret();
  844. $securityToken = $this->getSecurityToken();
  845. if (!Utils::empty_($securityToken)) {
  846. $_request->headers["x-acs-accesskey-id"] = $accessKeyId;
  847. $_request->headers["x-acs-security-token"] = $securityToken;
  848. }
  849. $_request->headers["Authorization"] = OpenApiUtilClient::getAuthorization($_request, $signatureAlgorithm, $hashedRequestPayload, $accessKeyId, $accessKeySecret);
  850. }
  851. }
  852. $_lastRequest = $_request;
  853. $_response = Tea::send($_request, $_runtime);
  854. if (Utils::is4xx($_response->statusCode) || Utils::is5xx($_response->statusCode)) {
  855. $_res = Utils::readAsJSON($_response->body);
  856. $err = Utils::assertAsMap($_res);
  857. @$err["statusCode"] = $_response->statusCode;
  858. throw new TeaError([
  859. "code" => "" . (string) (self::defaultAny(@$err["Code"], @$err["code"])) . "",
  860. "message" => "code: " . (string) ($_response->statusCode) . ", " . (string) (self::defaultAny(@$err["Message"], @$err["message"])) . " request id: " . (string) (self::defaultAny(@$err["RequestId"], @$err["requestId"])) . "",
  861. "data" => $err,
  862. "description" => "" . (string) (self::defaultAny(@$err["Description"], @$err["description"])) . "",
  863. "accessDeniedDetail" => self::defaultAny(@$err["AccessDeniedDetail"], @$err["accessDeniedDetail"])
  864. ]);
  865. }
  866. if (Utils::equalString($params->bodyType, "binary")) {
  867. $resp = [
  868. "body" => $_response->body,
  869. "headers" => $_response->headers,
  870. "statusCode" => $_response->statusCode
  871. ];
  872. return $resp;
  873. } else if (Utils::equalString($params->bodyType, "byte")) {
  874. $byt = Utils::readAsBytes($_response->body);
  875. return [
  876. "body" => $byt,
  877. "headers" => $_response->headers,
  878. "statusCode" => $_response->statusCode
  879. ];
  880. } else if (Utils::equalString($params->bodyType, "string")) {
  881. $str = Utils::readAsString($_response->body);
  882. return [
  883. "body" => $str,
  884. "headers" => $_response->headers,
  885. "statusCode" => $_response->statusCode
  886. ];
  887. } else if (Utils::equalString($params->bodyType, "json")) {
  888. $obj = Utils::readAsJSON($_response->body);
  889. $res = Utils::assertAsMap($obj);
  890. return [
  891. "body" => $res,
  892. "headers" => $_response->headers,
  893. "statusCode" => $_response->statusCode
  894. ];
  895. } else if (Utils::equalString($params->bodyType, "array")) {
  896. $arr = Utils::readAsJSON($_response->body);
  897. return [
  898. "body" => $arr,
  899. "headers" => $_response->headers,
  900. "statusCode" => $_response->statusCode
  901. ];
  902. } else {
  903. $anything = Utils::readAsString($_response->body);
  904. return [
  905. "body" => $anything,
  906. "headers" => $_response->headers,
  907. "statusCode" => $_response->statusCode
  908. ];
  909. }
  910. } catch (Exception $e) {
  911. if (!($e instanceof TeaError)) {
  912. $e = new TeaError([], $e->getMessage(), $e->getCode(), $e);
  913. }
  914. if (Tea::isRetryable($e)) {
  915. $_lastException = $e;
  916. continue;
  917. }
  918. throw $e;
  919. }
  920. }
  921. throw new TeaUnableRetryError($_lastRequest, $_lastException);
  922. }
  923. /**
  924. * Encapsulate the request and invoke the network
  925. * @param Params $params
  926. * @param OpenApiRequest $request object of OpenApiRequest
  927. * @param RuntimeOptions $runtime which controls some details of call api, such as retry times
  928. * @return array the response
  929. * @throws TeaError
  930. * @throws Exception
  931. * @throws TeaUnableRetryError
  932. */
  933. public function execute($params, $request, $runtime)
  934. {
  935. $params->validate();
  936. $request->validate();
  937. $runtime->validate();
  938. $_runtime = [
  939. "timeouted" => "retry",
  940. "key" => Utils::defaultString($runtime->key, $this->_key),
  941. "cert" => Utils::defaultString($runtime->cert, $this->_cert),
  942. "ca" => Utils::defaultString($runtime->ca, $this->_ca),
  943. "readTimeout" => Utils::defaultNumber($runtime->readTimeout, $this->_readTimeout),
  944. "connectTimeout" => Utils::defaultNumber($runtime->connectTimeout, $this->_connectTimeout),
  945. "httpProxy" => Utils::defaultString($runtime->httpProxy, $this->_httpProxy),
  946. "httpsProxy" => Utils::defaultString($runtime->httpsProxy, $this->_httpsProxy),
  947. "noProxy" => Utils::defaultString($runtime->noProxy, $this->_noProxy),
  948. "socks5Proxy" => Utils::defaultString($runtime->socks5Proxy, $this->_socks5Proxy),
  949. "socks5NetWork" => Utils::defaultString($runtime->socks5NetWork, $this->_socks5NetWork),
  950. "maxIdleConns" => Utils::defaultNumber($runtime->maxIdleConns, $this->_maxIdleConns),
  951. "retry" => [
  952. "retryable" => $runtime->autoretry,
  953. "maxAttempts" => Utils::defaultNumber($runtime->maxAttempts, 3)
  954. ],
  955. "backoff" => [
  956. "policy" => Utils::defaultString($runtime->backoffPolicy, "no"),
  957. "period" => Utils::defaultNumber($runtime->backoffPeriod, 1)
  958. ],
  959. "ignoreSSL" => $runtime->ignoreSSL,
  960. "disableHttp2" => self::defaultAny($this->_disableHttp2, false)
  961. ];
  962. $_lastRequest = null;
  963. $_lastException = null;
  964. $_now = time();
  965. $_retryTimes = 0;
  966. while (Tea::allowRetry(@$_runtime["retry"], $_retryTimes, $_now)) {
  967. if ($_retryTimes > 0) {
  968. $_backoffTime = Tea::getBackoffTime(@$_runtime["backoff"], $_retryTimes);
  969. if ($_backoffTime > 0) {
  970. Tea::sleep($_backoffTime);
  971. }
  972. }
  973. $_retryTimes = $_retryTimes + 1;
  974. try {
  975. $_request = new Request();
  976. // spi = new Gateway();//Gateway implements SPI,这一步在产品 SDK 中实例化
  977. $headers = $this->getRpcHeaders();
  978. $globalQueries = [];
  979. $globalHeaders = [];
  980. if (!Utils::isUnset($this->_globalParameters)) {
  981. $globalParams = $this->_globalParameters;
  982. if (!Utils::isUnset($globalParams->queries)) {
  983. $globalQueries = $globalParams->queries;
  984. }
  985. if (!Utils::isUnset($globalParams->headers)) {
  986. $globalHeaders = $globalParams->headers;
  987. }
  988. }
  989. $extendsHeaders = [];
  990. $extendsQueries = [];
  991. if (!Utils::isUnset($runtime->extendsParameters)) {
  992. $extendsParameters = $runtime->extendsParameters;
  993. if (!Utils::isUnset($extendsParameters->headers)) {
  994. $extendsHeaders = $extendsParameters->headers;
  995. }
  996. if (!Utils::isUnset($extendsParameters->queries)) {
  997. $extendsQueries = $extendsParameters->queries;
  998. }
  999. }
  1000. $requestContext = new \Darabonba\GatewaySpi\Models\InterceptorContext\request([
  1001. "headers" => Tea::merge($globalHeaders, $extendsHeaders, $request->headers, $headers),
  1002. "query" => Tea::merge($globalQueries, $extendsQueries, $request->query),
  1003. "body" => $request->body,
  1004. "stream" => $request->stream,
  1005. "hostMap" => $request->hostMap,
  1006. "pathname" => $params->pathname,
  1007. "productId" => $this->_productId,
  1008. "action" => $params->action,
  1009. "version" => $params->version,
  1010. "protocol" => Utils::defaultString($this->_protocol, $params->protocol),
  1011. "method" => Utils::defaultString($this->_method, $params->method),
  1012. "authType" => $params->authType,
  1013. "bodyType" => $params->bodyType,
  1014. "reqBodyType" => $params->reqBodyType,
  1015. "style" => $params->style,
  1016. "credential" => $this->_credential,
  1017. "signatureVersion" => $this->_signatureVersion,
  1018. "signatureAlgorithm" => $this->_signatureAlgorithm,
  1019. "userAgent" => $this->getUserAgent()
  1020. ]);
  1021. $configurationContext = new configuration([
  1022. "regionId" => $this->_regionId,
  1023. "endpoint" => Utils::defaultString($request->endpointOverride, $this->_endpoint),
  1024. "endpointRule" => $this->_endpointRule,
  1025. "endpointMap" => $this->_endpointMap,
  1026. "endpointType" => $this->_endpointType,
  1027. "network" => $this->_network,
  1028. "suffix" => $this->_suffix
  1029. ]);
  1030. $interceptorContext = new InterceptorContext([
  1031. "request" => $requestContext,
  1032. "configuration" => $configurationContext
  1033. ]);
  1034. $attributeMap = new AttributeMap([]);
  1035. // 1. spi.modifyConfiguration(context: SPI.InterceptorContext, attributeMap: SPI.AttributeMap);
  1036. $this->_spi->modifyConfiguration($interceptorContext, $attributeMap);
  1037. // 2. spi.modifyRequest(context: SPI.InterceptorContext, attributeMap: SPI.AttributeMap);
  1038. $this->_spi->modifyRequest($interceptorContext, $attributeMap);
  1039. $_request->protocol = $interceptorContext->request->protocol;
  1040. $_request->method = $interceptorContext->request->method;
  1041. $_request->pathname = $interceptorContext->request->pathname;
  1042. $_request->query = $interceptorContext->request->query;
  1043. $_request->body = $interceptorContext->request->stream;
  1044. $_request->headers = $interceptorContext->request->headers;
  1045. $_lastRequest = $_request;
  1046. $_response = Tea::send($_request, $_runtime);
  1047. $responseContext = new response([
  1048. "statusCode" => $_response->statusCode,
  1049. "headers" => $_response->headers,
  1050. "body" => $_response->body
  1051. ]);
  1052. $interceptorContext->response = $responseContext;
  1053. // 3. spi.modifyResponse(context: SPI.InterceptorContext, attributeMap: SPI.AttributeMap);
  1054. $this->_spi->modifyResponse($interceptorContext, $attributeMap);
  1055. return [
  1056. "headers" => $interceptorContext->response->headers,
  1057. "statusCode" => $interceptorContext->response->statusCode,
  1058. "body" => $interceptorContext->response->deserializedBody
  1059. ];
  1060. } catch (Exception $e) {
  1061. if (!($e instanceof TeaError)) {
  1062. $e = new TeaError([], $e->getMessage(), $e->getCode(), $e);
  1063. }
  1064. if (Tea::isRetryable($e)) {
  1065. $_lastException = $e;
  1066. continue;
  1067. }
  1068. throw $e;
  1069. }
  1070. }
  1071. throw new TeaUnableRetryError($_lastRequest, $_lastException);
  1072. }
  1073. /**
  1074. * @param Params $params
  1075. * @param OpenApiRequest $request
  1076. * @param RuntimeOptions $runtime
  1077. * @return array
  1078. * @throws TeaError
  1079. */
  1080. public function callApi($params, $request, $runtime)
  1081. {
  1082. if (Utils::isUnset($params)) {
  1083. throw new TeaError([
  1084. "code" => "ParameterMissing",
  1085. "message" => "'params' can not be unset"
  1086. ]);
  1087. }
  1088. if (Utils::isUnset($this->_signatureAlgorithm) || !Utils::equalString($this->_signatureAlgorithm, "v2")) {
  1089. return $this->doRequest($params, $request, $runtime);
  1090. } else if (Utils::equalString($params->style, "ROA") && Utils::equalString($params->reqBodyType, "json")) {
  1091. return $this->doROARequest($params->action, $params->version, $params->protocol, $params->method, $params->authType, $params->pathname, $params->bodyType, $request, $runtime);
  1092. } else if (Utils::equalString($params->style, "ROA")) {
  1093. return $this->doROARequestWithForm($params->action, $params->version, $params->protocol, $params->method, $params->authType, $params->pathname, $params->bodyType, $request, $runtime);
  1094. } else {
  1095. return $this->doRPCRequest($params->action, $params->version, $params->protocol, $params->method, $params->authType, $params->bodyType, $request, $runtime);
  1096. }
  1097. }
  1098. /**
  1099. * Get user agent
  1100. * @return string user agent
  1101. */
  1102. public function getUserAgent()
  1103. {
  1104. $userAgent = Utils::getUserAgent($this->_userAgent);
  1105. return $userAgent;
  1106. }
  1107. /**
  1108. * Get accesskey id by using credential
  1109. * @return string accesskey id
  1110. */
  1111. public function getAccessKeyId()
  1112. {
  1113. if (Utils::isUnset($this->_credential)) {
  1114. return '';
  1115. }
  1116. $accessKeyId = $this->_credential->getAccessKeyId();
  1117. return $accessKeyId;
  1118. }
  1119. /**
  1120. * Get accesskey secret by using credential
  1121. * @return string accesskey secret
  1122. */
  1123. public function getAccessKeySecret()
  1124. {
  1125. if (Utils::isUnset($this->_credential)) {
  1126. return '';
  1127. }
  1128. $secret = $this->_credential->getAccessKeySecret();
  1129. return $secret;
  1130. }
  1131. /**
  1132. * Get security token by using credential
  1133. * @return string security token
  1134. */
  1135. public function getSecurityToken()
  1136. {
  1137. if (Utils::isUnset($this->_credential)) {
  1138. return '';
  1139. }
  1140. $token = $this->_credential->getSecurityToken();
  1141. return $token;
  1142. }
  1143. /**
  1144. * Get bearer token by credential
  1145. * @return string bearer token
  1146. */
  1147. public function getBearerToken()
  1148. {
  1149. if (Utils::isUnset($this->_credential)) {
  1150. return '';
  1151. }
  1152. $token = $this->_credential->getBearerToken();
  1153. return $token;
  1154. }
  1155. /**
  1156. * Get credential type by credential
  1157. * @return string credential type e.g. access_key
  1158. */
  1159. public function getType()
  1160. {
  1161. if (Utils::isUnset($this->_credential)) {
  1162. return '';
  1163. }
  1164. $authType = $this->_credential->getType();
  1165. return $authType;
  1166. }
  1167. /**
  1168. * If inputValue is not null, return it or return defaultValue
  1169. * @param mixed $inputValue users input value
  1170. * @param mixed $defaultValue default value
  1171. * @return any the final result
  1172. */
  1173. public static function defaultAny($inputValue, $defaultValue)
  1174. {
  1175. if (Utils::isUnset($inputValue)) {
  1176. return $defaultValue;
  1177. }
  1178. return $inputValue;
  1179. }
  1180. /**
  1181. * If the endpointRule and config.endpoint are empty, throw error
  1182. * @param \Darabonba\OpenApi\Models\Config $config config contains the necessary information to create a client
  1183. * @return void
  1184. * @throws TeaError
  1185. */
  1186. public function checkConfig($config)
  1187. {
  1188. if (Utils::empty_($this->_endpointRule) && Utils::empty_($config->endpoint)) {
  1189. throw new TeaError([
  1190. "code" => "ParameterMissing",
  1191. "message" => "'config.endpoint' can not be empty"
  1192. ]);
  1193. }
  1194. }
  1195. /**
  1196. * set gateway client
  1197. * @param Client $spi
  1198. * @return void
  1199. */
  1200. public function setGatewayClient($spi)
  1201. {
  1202. $this->_spi = $spi;
  1203. }
  1204. /**
  1205. * set RPC header for debug
  1206. * @param string[] $headers headers for debug, this header can be used only once.
  1207. * @return void
  1208. */
  1209. public function setRpcHeaders($headers)
  1210. {
  1211. $this->_headers = $headers;
  1212. }
  1213. /**
  1214. * get RPC header for debug
  1215. * @return array
  1216. */
  1217. public function getRpcHeaders()
  1218. {
  1219. $headers = $this->_headers;
  1220. $this->_headers = null;
  1221. return $headers;
  1222. }
  1223. }