Client::ClientOutcome Client::AttemptRequest()

in sdk/src/client/Client.cc [53:82]


Client::ClientOutcome Client::AttemptRequest(const std::string & endpoint, const ServiceRequest & request, Http::Method method) const
{
    for (int retry =0; ;retry++) {
        auto outcome = AttemptOnceRequest(endpoint, request, method);
        if (outcome.isSuccess()) {
            return outcome;
        } 
        else if (!httpClient_->isEnable()) {
            return outcome;
        }
        else {
            if (configuration_.enableDateSkewAdjustment &&
                outcome.error().Status() == 403 &&
                outcome.error().Message().find("RequestTimeTooSkewed")) {
                auto serverTimeStr = analyzeServerTime(outcome.error().Message());
                auto serverTime = UtcToUnixTime(serverTimeStr);
                if (serverTime != -1) {
                    std::time_t localTime = std::time(nullptr);
                    setRequestDateOffset(serverTime - localTime);
                }
            }
            RetryStrategy *retryStrategy = configuration().retryStrategy.get();
            if (retryStrategy == nullptr || !retryStrategy->shouldRetry(outcome.error(), retry)) {
                return outcome;
            }
            long sleepTmeMs = retryStrategy->calcDelayTimeMs(outcome.error(), retry);
            httpClient_->waitForRetry(sleepTmeMs);
        }
    }
}