in csharp/core/Client.cs [132:398]
public Dictionary<string, object> DoRPCRequest(string action, string version, string protocol, string method, string authType, string bodyType, OpenApiRequest request, AlibabaCloud.TeaUtil.Models.RuntimeOptions runtime)
{
request.Validate();
Dictionary<string, object> runtime_ = new Dictionary<string, object>
{
{"timeouted", "retry"},
{"key", AlibabaCloud.TeaUtil.Common.DefaultString(runtime.Key, _key)},
{"cert", AlibabaCloud.TeaUtil.Common.DefaultString(runtime.Cert, _cert)},
{"ca", AlibabaCloud.TeaUtil.Common.DefaultString(runtime.Ca, _ca)},
{"readTimeout", AlibabaCloud.TeaUtil.Common.DefaultNumber(runtime.ReadTimeout, _readTimeout)},
{"connectTimeout", AlibabaCloud.TeaUtil.Common.DefaultNumber(runtime.ConnectTimeout, _connectTimeout)},
{"httpProxy", AlibabaCloud.TeaUtil.Common.DefaultString(runtime.HttpProxy, _httpProxy)},
{"httpsProxy", AlibabaCloud.TeaUtil.Common.DefaultString(runtime.HttpsProxy, _httpsProxy)},
{"noProxy", AlibabaCloud.TeaUtil.Common.DefaultString(runtime.NoProxy, _noProxy)},
{"socks5Proxy", AlibabaCloud.TeaUtil.Common.DefaultString(runtime.Socks5Proxy, _socks5Proxy)},
{"socks5NetWork", AlibabaCloud.TeaUtil.Common.DefaultString(runtime.Socks5NetWork, _socks5NetWork)},
{"maxIdleConns", AlibabaCloud.TeaUtil.Common.DefaultNumber(runtime.MaxIdleConns, _maxIdleConns)},
{"retry", new Dictionary<string, object>
{
{"retryable", runtime.Autoretry},
{"maxAttempts", AlibabaCloud.TeaUtil.Common.DefaultNumber(runtime.MaxAttempts, 3)},
}},
{"backoff", new Dictionary<string, object>
{
{"policy", AlibabaCloud.TeaUtil.Common.DefaultString(runtime.BackoffPolicy, "no")},
{"period", AlibabaCloud.TeaUtil.Common.DefaultNumber(runtime.BackoffPeriod, 1)},
}},
{"ignoreSSL", runtime.IgnoreSSL},
};
TeaRequest _lastRequest = null;
Exception _lastException = null;
long _now = System.DateTime.Now.Millisecond;
int _retryTimes = 0;
while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
{
if (_retryTimes > 0)
{
int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
if (backoffTime > 0)
{
TeaCore.Sleep(backoffTime);
}
}
_retryTimes = _retryTimes + 1;
try
{
TeaRequest request_ = new TeaRequest();
request_.Protocol = AlibabaCloud.TeaUtil.Common.DefaultString(_protocol, protocol);
request_.Method = method;
request_.Pathname = "/";
Dictionary<string, string> globalQueries = new Dictionary<string, string>(){};
Dictionary<string, string> globalHeaders = new Dictionary<string, string>(){};
if (!AlibabaCloud.TeaUtil.Common.IsUnset(_globalParameters))
{
GlobalParameters globalParams = _globalParameters;
if (!AlibabaCloud.TeaUtil.Common.IsUnset(globalParams.Queries))
{
globalQueries = globalParams.Queries;
}
if (!AlibabaCloud.TeaUtil.Common.IsUnset(globalParams.Headers))
{
globalHeaders = globalParams.Headers;
}
}
Dictionary<string, string> extendsHeaders = new Dictionary<string, string>(){};
Dictionary<string, string> extendsQueries = new Dictionary<string, string>(){};
if (!AlibabaCloud.TeaUtil.Common.IsUnset(runtime.ExtendsParameters))
{
AlibabaCloud.TeaUtil.Models.ExtendsParameters extendsParameters = runtime.ExtendsParameters;
if (!AlibabaCloud.TeaUtil.Common.IsUnset(extendsParameters.Headers))
{
extendsHeaders = extendsParameters.Headers;
}
if (!AlibabaCloud.TeaUtil.Common.IsUnset(extendsParameters.Queries))
{
extendsQueries = extendsParameters.Queries;
}
}
request_.Query = TeaConverter.merge<string>
(
new Dictionary<string, string>()
{
{"Action", action},
{"Format", "json"},
{"Version", version},
{"Timestamp", AlibabaCloud.OpenApiUtil.Client.GetTimestamp()},
{"SignatureNonce", AlibabaCloud.TeaUtil.Common.GetNonce()},
},
globalQueries,
extendsQueries,
request.Query
);
Dictionary<string, string> headers = GetRpcHeaders();
if (AlibabaCloud.TeaUtil.Common.IsUnset(headers))
{
// endpoint is setted in product client
request_.Headers = TeaConverter.merge<string>
(
new Dictionary<string, string>()
{
{"host", _endpoint},
{"x-acs-version", version},
{"x-acs-action", action},
{"user-agent", GetUserAgent()},
},
globalHeaders,
extendsHeaders
);
}
else
{
request_.Headers = TeaConverter.merge<string>
(
new Dictionary<string, string>()
{
{"host", _endpoint},
{"x-acs-version", version},
{"x-acs-action", action},
{"user-agent", GetUserAgent()},
},
globalHeaders,
extendsHeaders,
headers
);
}
if (!AlibabaCloud.TeaUtil.Common.IsUnset(request.Body))
{
Dictionary<string, object> m = AlibabaCloud.TeaUtil.Common.AssertAsMap(request.Body);
Dictionary<string, object> tmp = AlibabaCloud.TeaUtil.Common.AnyifyMapValue(AlibabaCloud.OpenApiUtil.Client.Query(m));
request_.Body = TeaCore.BytesReadable(AlibabaCloud.TeaUtil.Common.ToFormString(tmp));
request_.Headers["content-type"] = "application/x-www-form-urlencoded";
}
if (!AlibabaCloud.TeaUtil.Common.EqualString(authType, "Anonymous"))
{
if (AlibabaCloud.TeaUtil.Common.IsUnset(_credential))
{
throw new TeaException(new Dictionary<string, string>
{
{"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."},
});
}
Aliyun.Credentials.Models.CredentialModel credentialModel = this._credential.GetCredential();
string credentialType = credentialModel.Type;
if (AlibabaCloud.TeaUtil.Common.EqualString(credentialType, "bearer"))
{
string bearerToken = credentialModel.BearerToken;
request_.Query["BearerToken"] = bearerToken;
request_.Query["SignatureType"] = "BEARERTOKEN";
}
else
{
string accessKeyId = credentialModel.AccessKeyId;
string accessKeySecret = credentialModel.AccessKeySecret;
string securityToken = credentialModel.SecurityToken;
if (!AlibabaCloud.TeaUtil.Common.Empty(securityToken))
{
request_.Query["SecurityToken"] = securityToken;
}
request_.Query["SignatureMethod"] = "HMAC-SHA1";
request_.Query["SignatureVersion"] = "1.0";
request_.Query["AccessKeyId"] = accessKeyId;
Dictionary<string, object> t = null;
if (!AlibabaCloud.TeaUtil.Common.IsUnset(request.Body))
{
t = AlibabaCloud.TeaUtil.Common.AssertAsMap(request.Body);
}
Dictionary<string, string> signedParam = TeaConverter.merge<string>
(
request_.Query,
AlibabaCloud.OpenApiUtil.Client.Query(t)
);
request_.Query["Signature"] = AlibabaCloud.OpenApiUtil.Client.GetRPCSignature(signedParam, request_.Method, accessKeySecret);
}
}
_lastRequest = request_;
TeaResponse response_ = TeaCore.DoAction(request_, runtime_);
if (AlibabaCloud.TeaUtil.Common.Is4xx(response_.StatusCode) || AlibabaCloud.TeaUtil.Common.Is5xx(response_.StatusCode))
{
object _res = AlibabaCloud.TeaUtil.Common.ReadAsJSON(response_.Body);
Dictionary<string, object> err = AlibabaCloud.TeaUtil.Common.AssertAsMap(_res);
object requestId = DefaultAny(err.Get("RequestId"), err.Get("requestId"));
err["statusCode"] = response_.StatusCode;
throw new TeaException(new Dictionary<string, object>
{
{"code", "" + DefaultAny(err.Get("Code"), err.Get("code"))},
{"message", "code: " + response_.StatusCode + ", " + DefaultAny(err.Get("Message"), err.Get("message")) + " request id: " + requestId},
{"data", err},
{"description", "" + DefaultAny(err.Get("Description"), err.Get("description"))},
{"accessDeniedDetail", DefaultAny(err.Get("AccessDeniedDetail"), err.Get("accessDeniedDetail"))},
});
}
if (AlibabaCloud.TeaUtil.Common.EqualString(bodyType, "binary"))
{
Dictionary<string, object> resp = new Dictionary<string, object>
{
{"body", response_.Body},
{"headers", response_.Headers},
{"statusCode", response_.StatusCode},
};
return resp;
}
else if (AlibabaCloud.TeaUtil.Common.EqualString(bodyType, "byte"))
{
byte[] byt = AlibabaCloud.TeaUtil.Common.ReadAsBytes(response_.Body);
return new Dictionary<string, object>
{
{"body", byt},
{"headers", response_.Headers},
{"statusCode", response_.StatusCode},
};
}
else if (AlibabaCloud.TeaUtil.Common.EqualString(bodyType, "string"))
{
string str = AlibabaCloud.TeaUtil.Common.ReadAsString(response_.Body);
return new Dictionary<string, object>
{
{"body", str},
{"headers", response_.Headers},
{"statusCode", response_.StatusCode},
};
}
else if (AlibabaCloud.TeaUtil.Common.EqualString(bodyType, "json"))
{
object obj = AlibabaCloud.TeaUtil.Common.ReadAsJSON(response_.Body);
Dictionary<string, object> res = AlibabaCloud.TeaUtil.Common.AssertAsMap(obj);
return new Dictionary<string, object>
{
{"body", res},
{"headers", response_.Headers},
{"statusCode", response_.StatusCode},
};
}
else if (AlibabaCloud.TeaUtil.Common.EqualString(bodyType, "array"))
{
object arr = AlibabaCloud.TeaUtil.Common.ReadAsJSON(response_.Body);
return new Dictionary<string, object>
{
{"body", arr},
{"headers", response_.Headers},
{"statusCode", response_.StatusCode},
};
}
else
{
return new Dictionary<string, object>
{
{"headers", response_.Headers},
{"statusCode", response_.StatusCode},
};
}
}
catch (Exception e)
{
if (TeaCore.IsRetryable(e))
{
_lastException = e;
continue;
}
throw e;
}
}
throw new TeaUnretryableException(_lastRequest, _lastException);
}