async doROARequest()

in ts/src/client.ts [393:625]


  async doROARequest(action: string, version: string, protocol: string, method: string, authType: string, pathname: string, bodyType: string, request: $OpenApiUtil.OpenApiRequest, runtime: $dara.RuntimeOptions): Promise<{[key: string]: any}> {
    let _runtime: { [key: string]: any } = {
      key: runtime.key || this._key,
      cert: runtime.cert || this._cert,
      ca: runtime.ca || this._ca,
      readTimeout: runtime.readTimeout || this._readTimeout,
      connectTimeout: runtime.connectTimeout || this._connectTimeout,
      httpProxy: runtime.httpProxy || this._httpProxy,
      httpsProxy: runtime.httpsProxy || this._httpsProxy,
      noProxy: runtime.noProxy || this._noProxy,
      socks5Proxy: runtime.socks5Proxy || this._socks5Proxy,
      socks5NetWork: runtime.socks5NetWork || this._socks5NetWork,
      maxIdleConns: runtime.maxIdleConns || this._maxIdleConns,
      retryOptions: this._retryOptions,
      ignoreSSL: runtime.ignoreSSL,
      tlsMinVersion: this._tlsMinVersion,
    }

    let _retriesAttempted = 0;
    let _lastRequest = null, _lastResponse = null;
    let _context = new $dara.RetryPolicyContext({
      retriesAttempted: _retriesAttempted,
    });
    while ($dara.shouldRetry(_runtime['retryOptions'], _context)) {
      if (_retriesAttempted > 0) {
        let _backoffTime = $dara.getBackoffDelay(_runtime['retryOptions'], _context);
        if (_backoffTime > 0) {
          await $dara.sleep(_backoffTime);
        }
      }

      _retriesAttempted = _retriesAttempted + 1;
      try {
        let request_ = new $dara.Request();
        request_.protocol = this._protocol || protocol;
        request_.method = method;
        request_.pathname = pathname;
        let globalQueries : {[key: string ]: string} = { };
        let globalHeaders : {[key: string ]: string} = { };
        if (!$dara.isNull(this._globalParameters)) {
          let globalParams = this._globalParameters;
          if (!$dara.isNull(globalParams.queries)) {
            globalQueries = globalParams.queries;
          }

          if (!$dara.isNull(globalParams.headers)) {
            globalHeaders = globalParams.headers;
          }

        }

        let extendsHeaders : {[key: string ]: string} = { };
        let extendsQueries : {[key: string ]: string} = { };
        if (!$dara.isNull(runtime.extendsParameters)) {
          let extendsParameters = runtime.extendsParameters;
          if (!$dara.isNull(extendsParameters.headers)) {
            extendsHeaders = extendsParameters.headers;
          }

          if (!$dara.isNull(extendsParameters.queries)) {
            extendsQueries = extendsParameters.queries;
          }

        }

        request_.headers = {
          date: OpenApiUtil.getDateUTCString(),
          host: this._endpoint,
          accept: "application/json",
          'x-acs-signature-nonce': OpenApiUtil.getNonce(),
          'x-acs-signature-method': "HMAC-SHA1",
          'x-acs-signature-version': "1.0",
          'x-acs-version': version,
          'x-acs-action': action,
          'user-agent': OpenApiUtil.getUserAgent(this._userAgent),
          ...globalHeaders,
          ...extendsHeaders,
          ...request.headers,
        };
        if (!$dara.isNull(request.body)) {
          request_.body = new $dara.BytesReadable(typeof request.body === "string" ? request.body : JSON.stringify(request.body));
          request_.headers["content-type"] = "application/json; charset=utf-8";
        }

        request_.query = {
          ...globalQueries,
          ...extendsQueries,
        };
        if (!$dara.isNull(request.query)) {
          request_.query = {
            ...request_.query,
            ...request.query,
          };
        }

        if (authType != "Anonymous") {
          if ($dara.isNull(this._credential)) {
            throw new $_error.ClientError({
              code: `InvalidCredentials`,
              message: `Please set up the credentials correctly. If you are setting them through environment variables, please ensure that ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET are set correctly. See https://help.aliyun.com/zh/sdk/developer-reference/configure-the-alibaba-cloud-accesskey-environment-variable-on-linux-macos-and-windows-systems for more details.`,
            });
          }

          let credentialModel = await this._credential.getCredential();
          if (!$dara.isNull(credentialModel.providerName)) {
            request_.headers["x-acs-credentials-provider"] = credentialModel.providerName;
          }

          let credentialType = credentialModel.type;
          if (credentialType == "bearer") {
            let bearerToken = credentialModel.bearerToken;
            request_.headers["x-acs-bearer-token"] = bearerToken;
            request_.headers["x-acs-signature-type"] = "BEARERTOKEN";
          } else {
            let accessKeyId = credentialModel.accessKeyId;
            let accessKeySecret = credentialModel.accessKeySecret;
            let securityToken = credentialModel.securityToken;
            if (!$dara.isNull(securityToken) && securityToken != "") {
              request_.headers["x-acs-accesskey-id"] = accessKeyId;
              request_.headers["x-acs-security-token"] = securityToken;
            }

            let stringToSign = OpenApiUtil.getStringToSign(request_);
            request_.headers["authorization"] = `acs ${accessKeyId}:${OpenApiUtil.getROASignature(stringToSign, accessKeySecret)}`;
          }

        }

        let response_ = await $dara.doAction(request_, _runtime);
        _lastRequest = request_;
        _lastResponse = response_;

        if (response_.statusCode == 204) {
          return {
            headers: response_.headers,
          };
        }

        if ((response_.statusCode >= 400) && (response_.statusCode < 600)) {
          let _res = await $dara.Stream.readAsJSON(response_.body);
          let err = _res;
          let requestId = err["RequestId"] || err["requestId"];
          requestId = requestId || err["requestid"];
          let code = err["Code"] || err["code"];
          if ((`${code}` == "Throttling") || (`${code}` == "Throttling.User") || (`${code}` == "Throttling.Api")) {
            throw new $_error.ThrottlingError({
              statusCode: response_.statusCode,
              code: `${code}`,
              message: `code: ${response_.statusCode}, ${err["Message"] || err["message"]} request id: ${requestId}`,
              description: `${err["Description"] || err["description"]}`,
              retryAfter: OpenApiUtil.getThrottlingTimeLeft(response_.headers),
              data: err,
              requestId: `${requestId}`,
            });
          } else if ((response_.statusCode >= 400) && (response_.statusCode < 500)) {
            throw new $_error.ClientError({
              statusCode: response_.statusCode,
              code: `${code}`,
              message: `code: ${response_.statusCode}, ${err["Message"] || err["message"]} request id: ${requestId}`,
              description: `${err["Description"] || err["description"]}`,
              data: err,
              accessDeniedDetail: this.getAccessDeniedDetail(err),
              requestId: `${requestId}`,
            });
          } else {
            throw new $_error.ServerError({
              statusCode: response_.statusCode,
              code: `${code}`,
              message: `code: ${response_.statusCode}, ${err["Message"] || err["message"]} request id: ${requestId}`,
              description: `${err["Description"] || err["description"]}`,
              data: err,
              requestId: `${requestId}`,
            });
          }

        }

        if (bodyType == "binary") {
          let resp = {
            body: response_.body,
            headers: response_.headers,
            statusCode: response_.statusCode,
          };
          return resp;
        } else if (bodyType == "byte") {
          let byt = await $dara.Stream.readAsBytes(response_.body);
          return {
            body: byt,
            headers: response_.headers,
            statusCode: response_.statusCode,
          };
        } else if (bodyType == "string") {
          let _str = await $dara.Stream.readAsString(response_.body);
          return {
            body: _str,
            headers: response_.headers,
            statusCode: response_.statusCode,
          };
        } else if (bodyType == "json") {
          let obj = await $dara.Stream.readAsJSON(response_.body);
          let res = obj;
          return {
            body: res,
            headers: response_.headers,
            statusCode: response_.statusCode,
          };
        } else if (bodyType == "array") {
          let arr = await $dara.Stream.readAsJSON(response_.body);
          return {
            body: arr,
            headers: response_.headers,
            statusCode: response_.statusCode,
          };
        } else {
          return {
            headers: response_.headers,
            statusCode: response_.statusCode,
          };
        }

      } catch (ex) {
        _context = new $dara.RetryPolicyContext({
          retriesAttempted : _retriesAttempted,
          httpRequest : _lastRequest,
          httpResponse : _lastResponse,
          exception : ex,
        });
        continue;
      }
    }

    throw $dara.newUnretryableError(_context);
  }