in csharp/core/Client.cs [2340:2510]
public Dictionary<string, object> Execute(Params params_, OpenApiRequest request, AlibabaCloud.TeaUtil.Models.RuntimeOptions runtime)
{
params_.Validate();
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},
{"disableHttp2", DefaultAny(_disableHttp2, false)},
};
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();
// spi = new Gateway();//Gateway implements SPI,这一步在产品 SDK 中实例化
Dictionary<string, string> headers = GetRpcHeaders();
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;
}
}
AlibabaCloud.GatewaySpi.Models.InterceptorContext.InterceptorContextRequest requestContext = new AlibabaCloud.GatewaySpi.Models.InterceptorContext.InterceptorContextRequest
{
Headers = TeaConverter.merge<string>
(
globalHeaders,
extendsHeaders,
request.Headers,
headers
),
Query = TeaConverter.merge<string>
(
globalQueries,
extendsQueries,
request.Query
),
Body = request.Body,
Stream = request.Stream,
HostMap = request.HostMap,
Pathname = params_.Pathname,
ProductId = _productId,
Action = params_.Action,
Version = params_.Version,
Protocol = AlibabaCloud.TeaUtil.Common.DefaultString(_protocol, params_.Protocol),
Method = AlibabaCloud.TeaUtil.Common.DefaultString(_method, params_.Method),
AuthType = params_.AuthType,
BodyType = params_.BodyType,
ReqBodyType = params_.ReqBodyType,
Style = params_.Style,
Credential = _credential,
SignatureVersion = _signatureVersion,
SignatureAlgorithm = _signatureAlgorithm,
UserAgent = GetUserAgent(),
};
AlibabaCloud.GatewaySpi.Models.InterceptorContext.InterceptorContextConfiguration configurationContext = new AlibabaCloud.GatewaySpi.Models.InterceptorContext.InterceptorContextConfiguration
{
RegionId = _regionId,
Endpoint = AlibabaCloud.TeaUtil.Common.DefaultString(request.EndpointOverride, _endpoint),
EndpointRule = _endpointRule,
EndpointMap = _endpointMap,
EndpointType = _endpointType,
Network = _network,
Suffix = _suffix,
};
AlibabaCloud.GatewaySpi.Models.InterceptorContext interceptorContext = new AlibabaCloud.GatewaySpi.Models.InterceptorContext
{
Request = requestContext,
Configuration = configurationContext,
};
AlibabaCloud.GatewaySpi.Models.AttributeMap attributeMap = new AlibabaCloud.GatewaySpi.Models.AttributeMap();
// 1. spi.modifyConfiguration(context: SPI.InterceptorContext, attributeMap: SPI.AttributeMap);
this._spi.ModifyConfiguration(interceptorContext, attributeMap);
// 2. spi.modifyRequest(context: SPI.InterceptorContext, attributeMap: SPI.AttributeMap);
this._spi.ModifyRequest(interceptorContext, attributeMap);
request_.Protocol = interceptorContext.Request.Protocol;
request_.Method = interceptorContext.Request.Method;
request_.Pathname = interceptorContext.Request.Pathname;
request_.Query = interceptorContext.Request.Query;
request_.Body = interceptorContext.Request.Stream;
request_.Headers = interceptorContext.Request.Headers;
_lastRequest = request_;
TeaResponse response_ = TeaCore.DoAction(request_, runtime_);
AlibabaCloud.GatewaySpi.Models.InterceptorContext.InterceptorContextResponse responseContext = new AlibabaCloud.GatewaySpi.Models.InterceptorContext.InterceptorContextResponse
{
StatusCode = response_.StatusCode,
Headers = response_.Headers,
Body = response_.Body,
};
interceptorContext.Response = responseContext;
// 3. spi.modifyResponse(context: SPI.InterceptorContext, attributeMap: SPI.AttributeMap);
this._spi.ModifyResponse(interceptorContext, attributeMap);
return new Dictionary<string, object>
{
{"headers", interceptorContext.Response.Headers},
{"statusCode", interceptorContext.Response.StatusCode},
{"body", interceptorContext.Response.DeserializedBody},
};
}
catch (Exception e)
{
if (TeaCore.IsRetryable(e))
{
_lastException = e;
continue;
}
throw e;
}
}
throw new TeaUnretryableException(_lastRequest, _lastException);
}