private HttpResponse doRealAction()

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