/** * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0. */ #include #include #include #include using namespace Aws::Client; using namespace Aws::Utils; using namespace Aws::Http; #ifdef _MSC_VER #pragma warning(push) // VS2015 compiler's bug, warning s_CoreErrorsMapper: symbol will be dynamically initialized (implementation limitation) #pragma warning(disable : 4592) #endif using ErrorsMapperContainer = Aws::Map >; static ErrorsMapperContainer* s_CoreErrorsMapper(nullptr); #ifdef _MSC_VER #pragma warning(pop) #endif void CoreErrorsMapper::InitCoreErrorsMapper() { if (s_CoreErrorsMapper) { return; } s_CoreErrorsMapper = Aws::New("InitCoreErrorsMapper"); s_CoreErrorsMapper->emplace("IncompleteSignature", AWSError(CoreErrors::INCOMPLETE_SIGNATURE, false)); s_CoreErrorsMapper->emplace("IncompleteSignatureException", AWSError(CoreErrors::INCOMPLETE_SIGNATURE, false)); s_CoreErrorsMapper->emplace("InvalidSignatureException", AWSError(CoreErrors::INVALID_SIGNATURE, false)); s_CoreErrorsMapper->emplace("InvalidSignature", AWSError(CoreErrors::INVALID_SIGNATURE, false)); s_CoreErrorsMapper->emplace("InternalFailureException", AWSError(CoreErrors::INTERNAL_FAILURE, true)); s_CoreErrorsMapper->emplace("InternalFailure", AWSError(CoreErrors::INTERNAL_FAILURE, true)); s_CoreErrorsMapper->emplace("InternalServerError", AWSError(CoreErrors::INTERNAL_FAILURE, true)); s_CoreErrorsMapper->emplace("InternalError", AWSError(CoreErrors::INTERNAL_FAILURE, true)); s_CoreErrorsMapper->emplace("InvalidActionException", AWSError(CoreErrors::INVALID_ACTION, false)); s_CoreErrorsMapper->emplace("InvalidAction", AWSError(CoreErrors::INVALID_ACTION, false)); s_CoreErrorsMapper->emplace("InvalidClientTokenIdException", AWSError(CoreErrors::INVALID_CLIENT_TOKEN_ID, false)); s_CoreErrorsMapper->emplace("InvalidClientTokenId", AWSError(CoreErrors::INVALID_CLIENT_TOKEN_ID, false)); s_CoreErrorsMapper->emplace("InvalidParameterCombinationException", AWSError(CoreErrors::INVALID_PARAMETER_COMBINATION, false)); s_CoreErrorsMapper->emplace("InvalidParameterCombination", AWSError(CoreErrors::INVALID_PARAMETER_COMBINATION, false)); s_CoreErrorsMapper->emplace("InvalidParameterValueException", AWSError(CoreErrors::INVALID_PARAMETER_VALUE, false)); s_CoreErrorsMapper->emplace("InvalidParameterValue", AWSError(CoreErrors::INVALID_PARAMETER_VALUE, false)); s_CoreErrorsMapper->emplace("InvalidQueryParameterException", AWSError(CoreErrors::INVALID_QUERY_PARAMETER, false)); s_CoreErrorsMapper->emplace("InvalidQueryParameter", AWSError(CoreErrors::INVALID_QUERY_PARAMETER, false)); s_CoreErrorsMapper->emplace("MalformedQueryStringException", AWSError(CoreErrors::MALFORMED_QUERY_STRING, false)); s_CoreErrorsMapper->emplace("MalformedQueryString", AWSError(CoreErrors::MALFORMED_QUERY_STRING, false)); s_CoreErrorsMapper->emplace("MissingActionException", AWSError(CoreErrors::MISSING_ACTION, false)); s_CoreErrorsMapper->emplace("MissingAction", AWSError(CoreErrors::MISSING_ACTION, false)); s_CoreErrorsMapper->emplace("MissingAuthenticationTokenException", AWSError(CoreErrors::MISSING_AUTHENTICATION_TOKEN, false)); s_CoreErrorsMapper->emplace("MissingAuthenticationToken", AWSError(CoreErrors::MISSING_AUTHENTICATION_TOKEN, false)); s_CoreErrorsMapper->emplace("MissingParameterException", AWSError(CoreErrors::MISSING_PARAMETER, false)); s_CoreErrorsMapper->emplace("MissingParameter", AWSError(CoreErrors::MISSING_PARAMETER, false)); s_CoreErrorsMapper->emplace("OptInRequired", AWSError(CoreErrors::OPT_IN_REQUIRED, false)); s_CoreErrorsMapper->emplace("RequestExpiredException", AWSError(CoreErrors::REQUEST_EXPIRED, true)); s_CoreErrorsMapper->emplace("RequestExpired", AWSError(CoreErrors::REQUEST_EXPIRED, true)); s_CoreErrorsMapper->emplace("ServiceUnavailableException", AWSError(CoreErrors::SERVICE_UNAVAILABLE, true)); s_CoreErrorsMapper->emplace("ServiceUnavailableError", AWSError(CoreErrors::SERVICE_UNAVAILABLE, true)); s_CoreErrorsMapper->emplace("ServiceUnavailable", AWSError(CoreErrors::SERVICE_UNAVAILABLE, true)); s_CoreErrorsMapper->emplace("RequestThrottledException", AWSError(CoreErrors::THROTTLING, true)); s_CoreErrorsMapper->emplace("RequestThrottled", AWSError(CoreErrors::THROTTLING, true)); s_CoreErrorsMapper->emplace("ThrottlingException", AWSError(CoreErrors::THROTTLING, true)); s_CoreErrorsMapper->emplace("ThrottledException", AWSError(CoreErrors::THROTTLING, true)); s_CoreErrorsMapper->emplace("Throttling", AWSError(CoreErrors::THROTTLING, true)); s_CoreErrorsMapper->emplace("ValidationErrorException", AWSError(CoreErrors::VALIDATION, false)); s_CoreErrorsMapper->emplace("ValidationException", AWSError(CoreErrors::VALIDATION, false)); s_CoreErrorsMapper->emplace("ValidationError", AWSError(CoreErrors::VALIDATION, false)); s_CoreErrorsMapper->emplace("AccessDeniedException", AWSError(CoreErrors::ACCESS_DENIED, false)); s_CoreErrorsMapper->emplace("AccessDenied", AWSError(CoreErrors::ACCESS_DENIED, false)); s_CoreErrorsMapper->emplace("ResourceNotFoundException", AWSError(CoreErrors::RESOURCE_NOT_FOUND, false)); s_CoreErrorsMapper->emplace("ResourceNotFound", AWSError(CoreErrors::RESOURCE_NOT_FOUND, false)); s_CoreErrorsMapper->emplace("UnrecognizedClientException", AWSError(CoreErrors::UNRECOGNIZED_CLIENT, false)); s_CoreErrorsMapper->emplace("UnrecognizedClient", AWSError(CoreErrors::UNRECOGNIZED_CLIENT, false)); s_CoreErrorsMapper->emplace("SlowDownException", AWSError(CoreErrors::SLOW_DOWN, true)); s_CoreErrorsMapper->emplace("SlowDown", AWSError(CoreErrors::SLOW_DOWN, true)); s_CoreErrorsMapper->emplace("SignatureDoesNotMatchException", AWSError(CoreErrors::SIGNATURE_DOES_NOT_MATCH, false)); s_CoreErrorsMapper->emplace("SignatureDoesNotMatch", AWSError(CoreErrors::SIGNATURE_DOES_NOT_MATCH, false)); s_CoreErrorsMapper->emplace("InvalidAccessKeyIdException", AWSError(CoreErrors::INVALID_ACCESS_KEY_ID, false)); s_CoreErrorsMapper->emplace("InvalidAccessKeyId", AWSError(CoreErrors::INVALID_ACCESS_KEY_ID, false)); s_CoreErrorsMapper->emplace("RequestTimeTooSkewedException", AWSError(CoreErrors::REQUEST_TIME_TOO_SKEWED, true)); s_CoreErrorsMapper->emplace("RequestTimeTooSkewed", AWSError(CoreErrors::REQUEST_TIME_TOO_SKEWED, true)); s_CoreErrorsMapper->emplace("RequestTimeoutException", AWSError(CoreErrors::REQUEST_TIMEOUT, true)); s_CoreErrorsMapper->emplace("RequestTimeout", AWSError(CoreErrors::REQUEST_TIMEOUT, true)); } void CoreErrorsMapper::CleanupCoreErrorsMapper() { Aws::Delete(s_CoreErrorsMapper); s_CoreErrorsMapper = nullptr; } AWSError CoreErrorsMapper::GetErrorForName(const char* errorName) { auto iter = s_CoreErrorsMapper->find(errorName); if (iter != s_CoreErrorsMapper->end()) { return iter->second; } return AWSError(CoreErrors::UNKNOWN, false); } AWS_CORE_API AWSError CoreErrorsMapper::GetErrorForHttpResponseCode(HttpResponseCode code) { // best effort attempt to map HTTP response codes to CoreErrors bool retryable = IsRetryableHttpResponseCode(code); AWSError error; switch (code) { case HttpResponseCode::UNAUTHORIZED: case HttpResponseCode::FORBIDDEN: error = AWSError(CoreErrors::ACCESS_DENIED, retryable); break; case HttpResponseCode::NOT_FOUND: error = AWSError(CoreErrors::RESOURCE_NOT_FOUND, retryable); break; case HttpResponseCode::TOO_MANY_REQUESTS: error = AWSError(CoreErrors::SLOW_DOWN, retryable); break; case HttpResponseCode::INTERNAL_SERVER_ERROR: error = AWSError(CoreErrors::INTERNAL_FAILURE, retryable); break; case HttpResponseCode::BANDWIDTH_LIMIT_EXCEEDED: error = AWSError(CoreErrors::THROTTLING, retryable); break; case HttpResponseCode::SERVICE_UNAVAILABLE: error = AWSError(CoreErrors::SERVICE_UNAVAILABLE, retryable); break; case HttpResponseCode::REQUEST_TIMEOUT: case HttpResponseCode::AUTHENTICATION_TIMEOUT: case HttpResponseCode::LOGIN_TIMEOUT: case HttpResponseCode::GATEWAY_TIMEOUT: case HttpResponseCode::NETWORK_READ_TIMEOUT: case HttpResponseCode::NETWORK_CONNECT_TIMEOUT: error = AWSError(CoreErrors::REQUEST_TIMEOUT, retryable); break; default: int codeValue = static_cast(code); error = AWSError(CoreErrors::UNKNOWN, codeValue >= 500 && codeValue < 600); } error.SetResponseCode(code); return error; } /** * Overload ostream operator<< for CoreErrors enum class for a prettier output such as "103" and not "<67-00 00-00>" */ Aws::OStream& Aws::Client::operator<< (Aws::OStream& oStream, CoreErrors code) { oStream << Aws::Utils::StringUtils::to_string(static_cast::type>(code)); return oStream; }