8#include <aws/core/Core_EXPORTS.h>
9#include <aws/core/http/HttpRequest.h>
10#include <aws/core/utils/Chrono.h>
11#include <aws/core/utils/DateTime.h>
12#include <aws/core/utils/StringUtils.h>
13#include <aws/core/client/AWSError.h>
14#include <aws/core/client/CoreErrors.h>
15#include <aws/crt/Optional.h>
51 Aws::Crt::Optional<Aws::Utils::DateTime> serverTime;
52 if (dateIt != headers.end())
68 return Aws::Crt::Optional<std::chrono::milliseconds>{};
73 const int64_t serverMs = measurement.
serverTime.value().Millis();
75 const std::chrono::milliseconds elapsed{receivedMs - sentMs};
78 return Aws::Crt::Optional<std::chrono::milliseconds>{};
82 const int64_t midpointMs = sentMs + (receivedMs - sentMs) / 2;
83 return Aws::Crt::Optional<std::chrono::milliseconds>(std::chrono::milliseconds{serverMs - midpointMs});
105 std::chrono::milliseconds
skew{0};
111 explicit ClientSkew(std::chrono::milliseconds initial) : m_skew(initial) {}
113 std::chrono::milliseconds
Load()
const {
return m_skew.load(); }
119 if (candidate.has_value())
121 m_skew.store(candidate.value());
128 const Aws::Crt::Optional<std::chrono::milliseconds> candidate = RecordResponse(measurement);
130 adjustment.
skew = m_skew.load();
132 if (candidate.has_value())
134 const std::chrono::milliseconds absDelta =
Aws::chrono::abs(attemptSkew - candidate.value());
141 std::atomic<std::chrono::milliseconds> m_skew;
const Aws::String & GetExceptionName() const
const ERROR_TYPE GetErrorType() const
std::chrono::milliseconds Load() const
Aws::Crt::Optional< std::chrono::milliseconds > RecordResponse(const ClockSkewMeasurement &measurement)
ClockSkewAdjustment EvaluateFailure(const ClockSkewMeasurement &measurement, std::chrono::milliseconds attemptSkew)
ClientSkew(std::chrono::milliseconds initial)
bool WasParseSuccessful() const
static Aws::String ToLower(const char *source)
@ SIGNATURE_DOES_NOT_MATCH
@ REQUEST_TIME_TOO_SKEWED
AWS_CORE_API const char DATE_HEADER[]
Aws::Map< Aws::String, Aws::String > HeaderValueCollection
ClockSkewMeasurement MakeClockSkewMeasurement(const Aws::Http::HeaderValueCollection &headers, const Aws::Utils::DateTime &timeRequestSent, const Aws::Utils::DateTime &timeResponseReceived)
static const char CLOCK_SKEW_AGE_HEADER[]
static const std::chrono::milliseconds CLOCK_SKEW_DETECTION_THRESHOLD
static const std::chrono::milliseconds CLOCK_SKEW_MAX_TRUSTED_REQUEST_DURATION
bool IsClockSkewError(const Aws::Client::AWSError< Aws::Client::CoreErrors > &error)
Aws::Crt::Optional< std::chrono::milliseconds > ComputeClockSkewCandidate(const ClockSkewMeasurement &measurement)
constexpr std::enable_if< std::numeric_limits< Rep >::is_signed, std::chrono::duration< Rep, Period > >::type abs(std::chrono::duration< Rep, Period > d)
bool skewExceedsThreshold
std::chrono::milliseconds skew
Aws::Utils::DateTime timeResponseReceived
Aws::Utils::DateTime timeRequestSent
ClockSkewMeasurement(const Aws::Crt::Optional< Aws::Utils::DateTime > &serverTime, const Aws::Utils::DateTime &timeRequestSent, const Aws::Utils::DateTime &timeResponseReceived, bool servedFromCache)
Aws::Crt::Optional< Aws::Utils::DateTime > serverTime