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));
}