in aliyun-java-sdk-core/src/main/java/com/aliyuncs/DefaultAcsClient.java [321:454]
private <T extends AcsResponse> HttpResponse doRealAction(AcsRequest<T> request,
String regionId, AlibabaCloudCredentials credentials, Signer signer, FormatType format)
throws ClientException, ServerException {
doActionWithProxy(request.getSysProtocol(), System.getenv("HTTPS_PROXY"), System.getenv("HTTP_PROXY"));
doActionWithIgnoreSSL(request, X509TrustAll.ignoreSSLCerts);
Logger logger = clientProfile.getLogger();
String startTime = "";
String timeCost = "";
HttpResponse response = null;
String errorMessage = "";
try {
FormatType requestFormatType = request.getSysAcceptFormat();
if (null != requestFormatType) {
format = requestFormatType;
}
ProductDomain domain = getDomain(request, regionId);
if (request.getSysProtocol() == null) {
request.setSysProtocol(this.clientProfile.getHttpClientConfig().getProtocolType());
}
request.putHeaderParameter("User-Agent",
UserAgentConfig.resolve(request.getSysUserAgentConfig(), this.userAgentConfig));
request.putHeaderParameter("x-acs-version", request.getSysVersion());
if (null != request.getSysActionName()) {
request.putHeaderParameter("x-acs-action", request.getSysActionName());
}
String coordinate = credentials.getAccessKeyId() == null ? "" : credentials.getAccessKeyId()
+ SEPARATOR + request.getSysProduct()
+ SEPARATOR + request.getSysVersion()
+ SEPARATOR + request.getSysActionName()
+ SEPARATOR + request.getSysRegionId();
RetryPolicy retryPolicy = request.getSysRetryPolicy() != null ? request.getSysRetryPolicy() :
this.retryPolicy != null ? this.retryPolicy : RetryPolicy.none();
int retriesAttempted = 0;
RetryPolicyContext context = RetryPolicyContext.builder()
.coordinate(coordinate)
.retriesAttempted(retriesAttempted)
.build();
if (retryPolicy.enableAliyunThrottlingControl()) {
request.putHeaderParameter("x-sdk-throttling-control", "enable");
}
while (retryPolicy.shouldRetry(context)) {
TimeUnit.MILLISECONDS.sleep(retryPolicy.getBackoffDelay(context));
HttpRequest httpRequest = request.signRequest(signer, credentials, format, domain);
Exception ex;
try {
HttpUtil.debugHttpRequest(httpRequest);
startTime = LogUtils.localeNow();
long start = System.nanoTime();
response = this.httpClient.syncInvoke(httpRequest);
long end = System.nanoTime();
timeCost = TimeUnit.NANOSECONDS.toMillis(end - start) + "ms";
HttpUtil.debugHttpResponse(response);
if (response.isSuccess()) {
return response;
} else {
FormatType responseFormat = response.getHttpContentType();
AcsError error = readError(response, responseFormat);
if (500 <= response.getStatus()) {
ex = new ServerException(error.getErrorCode(), error.getErrorMessage(), error.getRequestId());
} else {
ex = new ClientException(error.getErrorCode(), error.getErrorMessage(), error.getRequestId(), error.getErrorDescription(), error.getAccessDeniedDetail());
}
}
} catch (SocketTimeoutException exp) {
ex = exp;
} catch (IOException exp) {
ex = exp;
}
context = RetryPolicyContext.builder()
.coordinate(coordinate)
.retriesAttempted(++retriesAttempted)
.httpResponse(response)
.exception(ex)
.build();
}
if (context.httpResponse() != null) {
return context.httpResponse();
}
if (context.exception() != null) {
throw context.exception();
}
errorMessage = "Some errors occurred. Maybe the client triggered throttling policy.";
throw new ClientException("SDK.RequestTryOrRetryFailed", errorMessage, context.exception());
} catch (InterruptedException exp) {
errorMessage = exp.getMessage();
throw new ClientException("SDK.InterruptedException",
"Client has been interrupted: connection " + request.getSysUrl() + " failed", exp);
} catch (InvalidKeyException exp) {
errorMessage = exp.getMessage();
throw new ClientException("SDK.InvalidAccessSecret", "Specified access secret is not valid.", exp);
} catch (NoSuchAlgorithmException exp) {
errorMessage = exp.getMessage();
throw new ClientException("SDK.InvalidMD5Algorithm", "MD5 hash is not supported by client side.", exp);
} catch (UnsupportedEncodingException exp) {
errorMessage = exp.getMessage();
throw new ClientException("SDK.UnsupportedEncodingException", "UTF-8 encoding is not supported by client side.", exp);
} catch (Throwable exp) {
errorMessage = exp.getMessage();
if (SocketTimeoutException.class.isAssignableFrom(exp.getClass())) {
throw new ClientException("SDK.ReadTimeout",
"SocketTimeoutException has occurred on a socket read or accept.The url is " +
request.getSysUrl(), exp);
} else if (IOException.class.isAssignableFrom(exp.getClass())) {
throw new ClientException("SDK.ServerUnreachable",
"Server unreachable: connection " + request.getSysUrl() + " failed", exp);
} else if (ServerException.class.isAssignableFrom(exp.getClass())) {
throw (ServerException) exp;
} else if (ThrottlingException.class.isAssignableFrom(exp.getClass())) {
throw new ClientException("SDK.RequestTryOrRetryFailed", errorMessage, exp);
} else if (ClientException.class.isAssignableFrom(exp.getClass())) {
throw (ClientException) exp;
} else {
throw new ClientException("SDK.RequestTryOrRetryFailed",
"Some errors occurred. Error message for latest request is " + exp.getMessage(), exp);
}
} finally {
if (null != logger) {
try {
LogUtils.LogUnit logUnit = LogUtils.createLogUnit(request, response);
logUnit.setStartTime(startTime);
logUnit.setCost(timeCost);
logUnit.setError(errorMessage);
String logContent = LogUtils.fillContent(clientProfile.getLogFormat(), logUnit);
logger.info(logContent);
} catch (Throwable e) {
e.printStackTrace();
}
}
}
}