7#include <smithy/client/AwsSmithyClientBase.h>
8#include <smithy/client/AwsSmithyClientAsyncRequestContext.h>
9#include <smithy/client/common/AwsSmithyRequestSigning.h>
10#include <smithy/identity/identity/AwsIdentity.h>
11#include <smithy/identity/auth/AuthSchemeOption.h>
12#include <smithy/identity/auth/AuthSchemeResolverBase.h>
13#include <smithy/tracing/TelemetryProvider.h>
15#include <aws/crt/Variant.h>
17#include <aws/core/client/ClientConfiguration.h>
18#include <aws/core/http/HttpResponse.h>
19#include <aws/core/utils/memory/stl/AWSMap.h>
20#include <aws/core/utils/FutureOutcome.h>
21#include <aws/core/utils/Outcome.h>
22#include <aws/core/utils/threading/Executor.h>
23#include <aws/core/http/HttpResponse.h>
24#include <aws/core/http/HttpClientFactory.h>
25#include <smithy/identity/signer/built-in/SignerProperties.h>
26#include <smithy/client/AwsLegacyClient.h>
31 template<
const char* ServiceNameT,
32 typename ServiceClientConfigurationT,
33 typename ServiceAuthSchemeResolverT,
34 typename AuthSchemesVariantT,
35 typename EndpointProviderT,
38 typename ErrorMarshallerT>
40 AwsSmithyClientT<ServiceNameT,
41 ServiceClientConfigurationT,
42 ServiceAuthSchemeResolverT,
50 static_assert(std::is_base_of<Aws::Client::AWSErrorMarshaller, ErrorMarshallerT>::value,
"MarshallerT must be derived from class Aws::Client::AWSErrorMarshaller");
55 const std::shared_ptr<Aws::Http::HttpClient>& httpClient,
56 const std::shared_ptr<Aws::Client::AWSErrorMarshaller>& errorMarshaller,
57 const std::shared_ptr<EndpointProviderT> endpointProvider,
58 const std::shared_ptr<ServiceAuthSchemeResolverT>& authSchemeResolver,
78 Aws::MakeShared<ErrorMarshallerT>(ServiceNameT)),
95 Aws::MakeShared<ErrorMarshallerT>(ServiceNameT));
140 AWS_LOGSTREAM_FATAL(ServiceNameT,
"Unable to init client: endpoint provider=" <<
m_endpointProvider
153 epCallback(resolveEndpointOutcome.
GetResult());
155 return resolveEndpointOutcome;
161 typename ServiceAuthSchemeResolverT::ServiceAuthSchemeParameters identityParams;
170 for (
const auto& epParam : epParams) {
172 if(epParam.GetStoredType() == ParameterType::STRING) {
173 identityParams.additionalProperties.insert({epParam.GetName(), epParam.GetStrValueNoCheck()});
174 }
else if (epParam.GetStoredType() == ParameterType::BOOLEAN) {
175 identityParams.additionalProperties.insert({epParam.GetName(), epParam.GetBoolValueNoCheck()});
176 }
else if (epParam.GetStoredType() == ParameterType::STRING_ARRAY) {
177 identityParams.additionalProperties.insert({epParam.GetName(), epParam.GetStrArrayValueNoCheck()});
179 assert(!
"Unknown endpoint parameter!");
184 for (
const auto& serviceParam : serviceParams->parameterMap) {
185 identityParams.additionalProperties.insert({serviceParam.first, serviceParam.second});
192 auto authSchemeOptionIt = std::find_if(authSchemeOptions.begin(), authSchemeOptions.end(),
195 return m_authSchemes.find(opt.schemeId) != m_authSchemes.end();
197 assert(authSchemeOptionIt != authSchemeOptions.end());
199 if (authSchemeOptionIt != authSchemeOptions.end()) {
204 "Failed to select an auth scheme",
223 return GetContextEndpointParametersImpl(ctx);
227 const char* requestName,
231 auto httpResponseOutcome =
MakeRequestSync(request, requestName, method, std::move(endpointCallback));
240 long long expirationInSeconds,
242 const std::shared_ptr<Aws::Http::ServiceSpecificParameters> serviceSpecificParameters)
const
248 const auto authSchemeEpParams = authSchemeOption.endpointParameters();
249 epParams.insert(epParams.end(), authSchemeEpParams.begin(), authSchemeEpParams.end());
250 if(serviceSpecificParameters)
252 auto bucketIt = serviceSpecificParameters->parameterMap.find(
"bucketName");
253 if(bucketIt != serviceSpecificParameters->parameterMap.end())
255 auto bucket = bucketIt->second;
256 epParams.emplace_back(
Aws::String(
"Bucket"), bucket);
260 auto epResolutionOutcome = this->
ResolveEndpoint(std::move(epParams), std::move(endpointCallback));
261 if (!epResolutionOutcome.IsSuccess())
263 AWS_LOGSTREAM_ERROR(ServiceNameT,
"Presigned URL generating failed. Encountered error: " << epResolutionOutcome.GetError().GetMessage());
266 auto endpoint = std::move(epResolutionOutcome.GetResultWithOwnership());
267 uri = endpoint.GetURI();
268 signerRegionOverride = region;
269 signerServiceNameOverride = serviceName;
271 if (endpoint.GetAttributes()) {
272 if (endpoint.GetAttributes()->authScheme.GetSigningRegion()) {
273 signerRegionOverride = endpoint.GetAttributes()->authScheme.GetSigningRegion()->c_str();
275 if (endpoint.GetAttributes()->authScheme.GetSigningRegionSet()) {
276 signerRegionOverride = endpoint.GetAttributes()->authScheme.GetSigningRegionSet()->c_str();
278 if (endpoint.GetAttributes()->authScheme.GetSigningName()) {
279 signerServiceNameOverride = endpoint.GetAttributes()->authScheme.GetSigningName()->c_str();
285 CreateHttpRequestCallback createHttpRequestCallback = [&customizedHeaders, &serviceSpecificParameters](
const Aws::Http::URI& uri,
const Aws::Http::HttpMethod& method) -> std::shared_ptr<HttpRequest> {
287 request->SetServiceSpecificParameters(serviceSpecificParameters);
288 for (
const auto& it: customizedHeaders)
290 request->SetHeaderValue(it.first.c_str(), it.second);
296 std::move(getUriCallback),
297 std::move(createHttpRequestCallback),
301 expirationInSeconds);
318 ExtractUriCallback&& getUriCallback,
319 CreateHttpRequestCallback&& createHttpRequestCallback,
323 long long expirationInSeconds)
const
327 auto authSchemeOption = std::move(authSchemeOptionOutcome.GetResultWithOwnership());
330 Aws::String signerServiceNameOverride = serviceName;
331 if(!getUriCallback(uri , signerRegionOverride, signerServiceNameOverride, authSchemeOption))
335 std::shared_ptr<HttpRequest> request = createHttpRequestCallback(uri, method);
338 return request->GetURIString();
344 ServiceClientConfigurationT,
345 ServiceAuthSchemeResolverT,
354 const auto resolvedAccountId = ctx.
m_awsIdentity->accountId();
355 const auto resolvedNonEmptyAccountId = resolvedAccountId.has_value() && !resolvedAccountId.value().empty();
357 if (resolvedNonEmptyAccountId) {
364 return endpointParameters;
virtual EndpointParameters GetEndpointContextParams() const
void AddUserAgentFeature(Aws::Client::UserAgentFeature feature) const
virtual std::shared_ptr< Http::ServiceSpecificParameters > GetServiceSpecificParameters() const
const R & GetResult() const
static SigningOutcome SignRequest(std::shared_ptr< HttpRequest > HTTPRequest, const client::AwsSmithyClientAsyncRequestContext &ctx, const Aws::UnorderedMap< Aws::String, AuthSchemesVariantT > &authSchemes)
static IdentityOutcome ResolveIdentity(const client::AwsSmithyClientAsyncRequestContext &ctx, const Aws::UnorderedMap< Aws::String, AuthSchemesVariantT > &authSchemes)
static bool AdjustClockSkew(HttpResponseOutcome &outcome, const AuthSchemeOption &authSchemeOption, const Aws::UnorderedMap< Aws::String, AuthSchemesVariantT > &authSchemes)
Aws::String m_requestName
const Aws::AmazonWebServiceRequest * m_pRequest
std::shared_ptr< smithy::AwsIdentity > m_awsIdentity
Aws::Utils::Outcome< Aws::Vector< Aws::Endpoint::EndpointParameter >, AWSCoreError > GetContextEndpointParametersOutcome
HttpResponseOutcome MakeRequestSync(Aws::AmazonWebServiceRequest const *const request, const char *requestName, Aws::Http::HttpMethod method, EndpointUpdateCallback &&endpointCallback) const
void baseCopyAssign(const AwsSmithyClientBase &other, std::shared_ptr< Aws::Http::HttpClient > httpClient, std::shared_ptr< Aws::Client::AWSErrorMarshaller > errorMarshaller)
std::function< void(Aws::Endpoint::AWSEndpoint &)> EndpointUpdateCallback
Aws::Utils::Outcome< AuthSchemeOption, AWSCoreError > SelectAuthSchemeOptionOutcome
void baseMoveAssign(AwsSmithyClientBase &&other)
Aws::String m_serviceName
const Aws::UniquePtr< Aws::Client::ClientConfiguration > m_clientConfig
SelectAuthSchemeOptionOutcome SelectAuthSchemeOption(const AwsSmithyClientAsyncRequestContext &ctx) const override
ResponseT MakeRequestDeserialize(Aws::AmazonWebServiceRequest const *const request, const char *requestName, Aws::Http::HttpMethod method, EndpointUpdateCallback &&endpointCallback) const
virtual ~AwsSmithyClientT()=default
GetContextEndpointParametersOutcome GetContextEndpointParameters(const AwsSmithyClientAsyncRequestContext &ctx) const override
AwsSmithyClientT(const ServiceClientConfigurationT &clientConfig, const Aws::String &serviceName, const Aws::String &serviceUserAgentName, const std::shared_ptr< Aws::Http::HttpClient > &httpClient, const std::shared_ptr< Aws::Client::AWSErrorMarshaller > &errorMarshaller, const std::shared_ptr< EndpointProviderT > endpointProvider, const std::shared_ptr< ServiceAuthSchemeResolverT > &authSchemeResolver, const Aws::UnorderedMap< Aws::String, AuthSchemesVariantT > &authSchemes)
const char * GetServiceClientName() const override
std::shared_ptr< ServiceAuthSchemeResolverT > m_authSchemeResolver
AwsSmithyClientT & operator=(const AwsSmithyClientT &other)
ResolveEndpointOutcome ResolveEndpoint(const Aws::Endpoint::EndpointParameters &endpointParameters, EndpointUpdateCallback &&epCallback) const override
Aws::UnorderedMap< Aws::String, AuthSchemesVariantT > m_authSchemes
IdentityOutcome ResolveIdentity(const AwsSmithyClientAsyncRequestContext &ctx) const override
AwsSmithyClientT & operator=(AwsSmithyClientT &&other)
Aws::String GeneratePresignedUrl(EndpointUpdateCallback &&endpointCallback, Aws::Http::HttpMethod method, const Aws::String ®ion, const Aws::String &serviceName, long long expirationInSeconds, const Aws::Http::HeaderValueCollection &customizedHeaders, const std::shared_ptr< Aws::Http::ServiceSpecificParameters > serviceSpecificParameters) const
bool AdjustClockSkew(HttpResponseOutcome &outcome, const AuthSchemeOption &authSchemeOption) const override
SigningOutcome SignHttpRequest(std::shared_ptr< HttpRequest > httpRequest, const AwsSmithyClientAsyncRequestContext &ctx) const override
ServiceClientConfigurationT & m_clientConfiguration
std::shared_ptr< SerializerT > m_serializer
AwsSmithyClientT(AwsSmithyClientT &&other)
AwsSmithyClientT(const AwsSmithyClientT &other)
std::shared_ptr< EndpointProviderT > m_endpointProvider
Aws::Vector< Aws::Endpoint::EndpointParameter > EndpointParameters
AWS_CORE_API std::shared_ptr< HttpClient > CreateHttpClient(const Aws::Client::ClientConfiguration &clientConfiguration)
Aws::Map< Aws::String, Aws::String > HeaderValueCollection
AWS_CORE_API Aws::IOStream * DefaultResponseStreamFactoryMethod()
std::basic_string< char, std::char_traits< char >, Aws::Allocator< char > > String
std::vector< T, Aws::Allocator< T > > Vector
std::unordered_map< K, V, std::hash< K >, std::equal_to< K >, Aws::Allocator< std::pair< const K, V > > > UnorderedMap