PostObjectResponse Alibabacloud_OSS::Client::postObject()

in cpp/src/oss.cpp [7460:7591]


PostObjectResponse Alibabacloud_OSS::Client::postObject(
    shared_ptr<PostObjectRequest> request,
    shared_ptr<Alibabacloud_OSSUtil::RuntimeOptions> runtime) {
  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>();
      shared_ptr<string> boundary =
          make_shared<string>(Darabonba_FileForm::Client::getBoundary());
      request_->protocol = *_protocol;
      request_->method = "POST";
      request_->pathname = string("/");
      request_->headers = {
          {"host", Alibabacloud_OSSUtil::Client::getHost(
                       request->bucketName, _regionId, _endpoint, _hostModel)},
          {"date", Darabonba_Util::Client::getDateUTCString()},
          {"user-agent", getUserAgent()}};
      request_->headers.insert(pair<string, string>(
          "content-type",
          string("multipart/form-data; boundary=") + string(*boundary)));
      shared_ptr<map<string, boost::any>> form =
          make_shared<map<string, boost::any>>(Darabonba::Converter::merge(
              map<string, boost::any>(
                  {{"OSSAccessKeyId",
                    !request->header->accessKeyId
                        ? boost::any()
                        : boost::any(*request->header->accessKeyId)},
                   {"policy", !request->header->policy
                                  ? boost::any()
                                  : boost::any(*request->header->policy)},
                   {"Signature", !request->header->signature
                                     ? boost::any()
                                     : boost::any(*request->header->signature)},
                   {"key", !request->header->key
                               ? boost::any()
                               : boost::any(*request->header->key)},
                   {"success_action_status",
                    !request->header->successActionStatus
                        ? boost::any()
                        : boost::any(*request->header->successActionStatus)},
                   {"file", !request->header->file
                                ? boost::any()
                                : boost::any(*request->header->file)}}),
              Darabonba::Converter::toGenericMap(
                  Alibabacloud_OSSUtil::Client::toMeta(
                      request->header->userMeta,
                      make_shared<string>("x-oss-meta-")))));
      request_->body = Darabonba_FileForm::Client::toFileForm(form, boundary);
      _lastRequest = request_;
      shared_ptr<Darabonba::Response> response_ =
          make_shared<Darabonba::Response>(
              Darabonba::Core::doAction(request_, runtime_));
      shared_ptr<map<string, boost::any>> respMap;
      shared_ptr<string> bodyStr = make_shared<string>(
          Darabonba_Util::Client::readAsString(response_->body));
      if (Darabonba_Util::Client::is4xx(
              make_shared<int>(response_->statusCode)) ||
          Darabonba_Util::Client::is5xx(
              make_shared<int>(response_->statusCode))) {
        respMap = make_shared<map<string, boost::any>>(
            Alibabacloud_OSSUtil::Client::getErrMessage(bodyStr));
        BOOST_THROW_EXCEPTION(Darabonba::Error(map<string, boost::any>(
            {{"code", (*respMap)["Code"]},
             {"message", (*respMap)["Message"]},
             {"data", boost::any(map<string, boost::any>(
                          {{"httpCode", boost::any(response_->statusCode)},
                           {"requestId", (*respMap)["RequestId"]},
                           {"hostId", (*respMap)["HostId"]}}))}})));
      }
      respMap = make_shared<map<string, boost::any>>(
          Darabonba_XML::Client::parseXml(bodyStr, nullptr));
      return PostObjectResponse(Darabonba::Converter::merge(
          map<string, boost::any>(),
          !respMap ? map<string, boost::any>() : *respMap));
    } catch (std::exception &e) {
      if (Darabonba::Core::isRetryable(e)) {
        _lastException = make_shared<std::exception>(e);
        continue;
      }
      BOOST_THROW_EXCEPTION(e);
    }
  }
  BOOST_THROW_EXCEPTION(
      Darabonba::UnretryableError(_lastRequest, _lastException));
}