map Alibabacloud_OpenApi::Client::doRequest()

in cpp/src/open_api.cpp [667:895]


map<string, boost::any> Alibabacloud_OpenApi::Client::doRequest(
    shared_ptr<Params> params, shared_ptr<OpenApiRequest> request,
    shared_ptr<Darabonba_Util::RuntimeOptions> runtime) {
  params->validate();
  request->validate();
  runtime->validate();
  shared_ptr<map<string, boost::any>> runtime_ = make_shared<
      map<string, boost::any>>(map<string, boost::any>(
      {{"timeouted", boost::any(string("retry"))},
       {"readTimeout", boost::any(Darabonba_Util::Client::defaultNumber(
                           runtime->readTimeout, _readTimeout))},
       {"connectTimeout", boost::any(Darabonba_Util::Client::defaultNumber(
                              runtime->connectTimeout, _connectTimeout))},
       {"httpProxy", boost::any(string(Darabonba_Util::Client::defaultString(
                         runtime->httpProxy, _httpProxy)))},
       {"httpsProxy", boost::any(string(Darabonba_Util::Client::defaultString(
                          runtime->httpsProxy, _httpsProxy)))},
       {"noProxy", boost::any(string(Darabonba_Util::Client::defaultString(
                       runtime->noProxy, _noProxy)))},
       {"maxIdleConns", boost::any(Darabonba_Util::Client::defaultNumber(
                            runtime->maxIdleConns, _maxIdleConns))},
       {"retry", boost::any(map<string, boost::any>(
                     {{"retryable", !runtime->autoretry
                                        ? boost::any()
                                        : boost::any(*runtime->autoretry)},
                      {"maxAttempts",
                       boost::any(Darabonba_Util::Client::defaultNumber(
                           runtime->maxAttempts, make_shared<int>(3)))}}))},
       {"backoff",
        boost::any(map<string, boost::any>(
            {{"policy",
              boost::any(string(Darabonba_Util::Client::defaultString(
                  runtime->backoffPolicy, make_shared<string>("no"))))},
             {"period", boost::any(Darabonba_Util::Client::defaultNumber(
                            runtime->backoffPeriod, make_shared<int>(1)))}}))},
       {"ignoreSSL", !runtime->ignoreSSL ? boost::any()
                                         : boost::any(*runtime->ignoreSSL)}}));
  shared_ptr<Darabonba::Request> _lastRequest;
  shared_ptr<std::exception> _lastException;
  shared_ptr<int> _now = make_shared<int>(0);
  shared_ptr<int> _retryTimes = make_shared<int>(0);
  while (Darabonba::Core::allowRetry(
      make_shared<boost::any>((*runtime_)["retry"]), _retryTimes, _now)) {
    if (*_retryTimes > 0) {
      shared_ptr<int> _backoffTime =
          make_shared<int>(Darabonba::Core::getBackoffTime(
              make_shared<boost::any>((*runtime_)["backoff"]), _retryTimes));
      if (*_backoffTime > 0) {
        Darabonba::Core::sleep(_backoffTime);
      }
    }
    _retryTimes = make_shared<int>(*_retryTimes + 1);
    try {
      shared_ptr<Darabonba::Request> request_ =
          make_shared<Darabonba::Request>();
      request_->protocol =
          Darabonba_Util::Client::defaultString(_protocol, params->protocol);
      request_->method = *params->method;
      request_->pathname = *params->pathname;
      request_->query = *request->query;
      // endpoint is setted in product client
      request_->headers = Darabonba::Converter::merge(
          map<string, string>(
              {{"host", !_endpoint ? string() : *_endpoint},
               {"x-acs-version",
                !params->version ? string() : *params->version},
               {"x-acs-action", !params->action ? string() : *params->action},
               {"user-agent", getUserAgent()},
               {"x-acs-date", Alibabacloud_OpenApiUtil::Client::getTimestamp()},
               {"x-acs-signature-nonce", Darabonba_Util::Client::getNonce()},
               {"accept", "application/json"}}),
          !request->headers ? map<string, string>() : *request->headers);
      shared_ptr<string> signatureAlgorithm =
          make_shared<string>(Darabonba_Util::Client::defaultString(
              _signatureAlgorithm, make_shared<string>("ACS3-HMAC-SHA256")));
      shared_ptr<string> hashedRequestPayload =
          make_shared<string>(Alibabacloud_OpenApiUtil::Client::hexEncode(
              make_shared<vector<uint8_t>>(
                  Alibabacloud_OpenApiUtil::Client::hash(
                      make_shared<vector<uint8_t>>(
                          Darabonba_Util::Client::toBytes(
                              make_shared<string>(""))),
                      signatureAlgorithm))));
      if (!Darabonba_Util::Client::isUnset<boost::any>(request->body)) {
        if (Darabonba_Util::Client::equalString(params->reqBodyType,
                                                make_shared<string>("json"))) {
          shared_ptr<string> jsonObj = make_shared<string>(
              Darabonba_Util::Client::toJSONString(request->body));
          hashedRequestPayload =
              make_shared<string>(Alibabacloud_OpenApiUtil::Client::hexEncode(
                  make_shared<vector<uint8_t>>(
                      Alibabacloud_OpenApiUtil::Client::hash(
                          make_shared<vector<uint8_t>>(
                              Darabonba_Util::Client::toBytes(jsonObj)),
                          signatureAlgorithm))));
          request_->body = Darabonba::Converter::toStream(*jsonObj);
        } else {
          shared_ptr<map<string, boost::any>> m =
              make_shared<map<string, boost::any>>(
                  Darabonba_Util::Client::assertAsMap(request->body));
          shared_ptr<string> formObj =
              make_shared<string>(Alibabacloud_OpenApiUtil::Client::toForm(m));
          hashedRequestPayload =
              make_shared<string>(Alibabacloud_OpenApiUtil::Client::hexEncode(
                  make_shared<vector<uint8_t>>(
                      Alibabacloud_OpenApiUtil::Client::hash(
                          make_shared<vector<uint8_t>>(
                              Darabonba_Util::Client::toBytes(formObj)),
                          signatureAlgorithm))));
          request_->body = Darabonba::Converter::toStream(*formObj);
          request_->headers.insert(pair<string, string>(
              "content-type", "application/x-www-form-urlencoded"));
        }
      }
      if (!Darabonba_Util::Client::isUnset<Darabonba::Stream>(
              request->stream)) {
        shared_ptr<vector<uint8_t>> tmp = make_shared<vector<uint8_t>>(
            Darabonba_Util::Client::readAsBytes(request->stream));
        hashedRequestPayload =
            make_shared<string>(Alibabacloud_OpenApiUtil::Client::hexEncode(
                make_shared<vector<uint8_t>>(
                    Alibabacloud_OpenApiUtil::Client::hash(
                        tmp, signatureAlgorithm))));
        request_->body = Darabonba::Converter::toStream(*tmp);
        request_->headers.insert(pair<string, string>(
              "content-type", "application/octet-stream"));
      }
      request_->headers.insert(
          pair<string, string>("x-acs-content-sha256", *hashedRequestPayload));
      if (!Darabonba_Util::Client::equalString(
              params->authType, make_shared<string>("Anonymous"))) {
        shared_ptr<string> accessKeyId = make_shared<string>(getAccessKeyId());
        shared_ptr<string> accessKeySecret =
            make_shared<string>(getAccessKeySecret());
        shared_ptr<string> securityToken =
            make_shared<string>(getSecurityToken());
        if (!Darabonba_Util::Client::empty(securityToken)) {
          request_->headers.insert(
              pair<string, string>("x-acs-accesskey-id", *accessKeyId));
          request_->headers.insert(
              pair<string, string>("x-acs-security-token", *securityToken));
        }
        request_->headers.insert(pair<string, string>(
            "Authorization",
            Alibabacloud_OpenApiUtil::Client::getAuthorization(
                request_, signatureAlgorithm, hashedRequestPayload, accessKeyId,
                accessKeySecret)));
      }
      _lastRequest = request_;
      shared_ptr<Darabonba::Response> response_ =
          make_shared<Darabonba::Response>(
              Darabonba::Core::doAction(request_, runtime_));
      if (Darabonba_Util::Client::is4xx(
              make_shared<int>(response_->statusCode)) ||
          Darabonba_Util::Client::is5xx(
              make_shared<int>(response_->statusCode))) {
        shared_ptr<boost::any> _res = make_shared<boost::any>(
            Darabonba_Util::Client::readAsJSON(response_->body));
        shared_ptr<map<string, boost::any>> err =
            make_shared<map<string, boost::any>>(
                Darabonba_Util::Client::assertAsMap(_res));
        BOOST_THROW_EXCEPTION(Darabonba::Error(map<string, boost::any>(
            {{"code", boost::any(string(
                          Darabonba::Converter::toString(Client::defaultAny(
                              (*err)["Code"],
                              (*err)["code"]))))},
             {"message",
              boost::any(
                  string("code: ") +
                  string(boost::lexical_cast<string>(response_->statusCode)) +
                  string(", ") +
                  string(Darabonba::Converter::toString(Client::defaultAny(
                      (*err)["Message"],
                      (*err)["message"]))) +
                  string(" request id: ") +
                  string(Darabonba::Converter::toString(Client::defaultAny(
                      (*err)["RequestId"],
                      (*err)["requestId"]))))},
             {"data", !err ? boost::any() : boost::any(*err)}})));
      }
      if (Darabonba_Util::Client::equalString(params->bodyType,
                                              make_shared<string>("binary"))) {
        shared_ptr<map<string, boost::any>> resp =
            make_shared<map<string, boost::any>>(map<string, boost::any>(
                {{"body", !response_->body ? boost::any()
                                           : boost::any(*response_->body)},
                 {"headers", boost::any(response_->headers)}}));
        return *resp;
      } else if (Darabonba_Util::Client::equalString(
                     params->bodyType, make_shared<string>("byte"))) {
        shared_ptr<vector<uint8_t>> byt = make_shared<vector<uint8_t>>(
            Darabonba_Util::Client::readAsBytes(response_->body));
        return {{"body", !byt ? boost::any() : boost::any(*byt)},
                {"headers", boost::any(response_->headers)}};
      } else if (Darabonba_Util::Client::equalString(
                     params->bodyType, make_shared<string>("string"))) {
        shared_ptr<string> str = make_shared<string>(
            Darabonba_Util::Client::readAsString(response_->body));
        return {{"body", !str ? boost::any() : boost::any(*str)},
                {"headers", boost::any(response_->headers)}};
      } else if (Darabonba_Util::Client::equalString(
                     params->bodyType, make_shared<string>("json"))) {
        shared_ptr<boost::any> obj = make_shared<boost::any>(
            Darabonba_Util::Client::readAsJSON(response_->body));
        shared_ptr<map<string, boost::any>> res =
            make_shared<map<string, boost::any>>(
                Darabonba_Util::Client::assertAsMap(obj));
        return {{"body", !res ? boost::any() : boost::any(*res)},
                {"headers", boost::any(response_->headers)}};
      } else if (Darabonba_Util::Client::equalString(
                     params->bodyType, make_shared<string>("array"))) {
        shared_ptr<boost::any> arr = make_shared<boost::any>(
            Darabonba_Util::Client::readAsJSON(response_->body));
        return {{"body", !arr ? boost::any() : boost::any(*arr)},
                {"headers", boost::any(response_->headers)}};
      } else {
        return {{"headers", response_->headers}};
      }
    } catch (std::exception &e) {
      if (Darabonba::Core::isRetryable(e)) {
        _lastException = make_shared<std::exception>(e);
        continue;
      }
      throw;
    }
  }
  BOOST_THROW_EXCEPTION(
      Darabonba::UnretryableError(_lastRequest, _lastException));
}