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>
30 template <
typename OutcomeT,
typename ClientT,
typename RequestT,
typename HandlerT>
31 class SmithyBidirectionalStreamingTask;
38 template<
const char* ServiceNameT,
39 typename ServiceClientConfigurationT,
40 typename ServiceAuthSchemeResolverT,
41 typename AuthSchemesVariantT,
42 typename EndpointProviderT,
45 typename ErrorMarshallerT>
47 AwsSmithyClientT<ServiceNameT,
48 ServiceClientConfigurationT,
49 ServiceAuthSchemeResolverT,
57 static_assert(std::is_base_of<Aws::Client::AWSErrorMarshaller, ErrorMarshallerT>::value,
"MarshallerT must be derived from class Aws::Client::AWSErrorMarshaller");
62 const std::shared_ptr<Aws::Http::HttpClient>& httpClient,
63 const std::shared_ptr<Aws::Client::AWSErrorMarshaller>& errorMarshaller,
64 const std::shared_ptr<EndpointProviderT> endpointProvider,
65 const std::shared_ptr<ServiceAuthSchemeResolverT>& authSchemeResolver,
85 Aws::MakeShared<ErrorMarshallerT>(ServiceNameT)),
102 Aws::MakeShared<ErrorMarshallerT>(ServiceNameT));
142 template <
typename OutcomeT,
typename ClientT,
typename RequestT,
typename HandlerT>
145 template <
typename OutcomeT,
typename ClientT,
typename RequestT,
typename EncoderStreamT,
typename HandlerT>
153 AWS_LOGSTREAM_FATAL(ServiceNameT,
"Unable to init client: endpoint provider=" <<
m_endpointProvider
166 epCallback(resolveEndpointOutcome.
GetResult());
168 return resolveEndpointOutcome;
174 typename ServiceAuthSchemeResolverT::ServiceAuthSchemeParameters identityParams;
184 for (
const auto& epParam : epParams) {
186 if(epParam.GetStoredType() == ParameterType::STRING) {
187 identityParams.additionalProperties.insert({epParam.GetName(), epParam.GetStrValueNoCheck()});
188 }
else if (epParam.GetStoredType() == ParameterType::BOOLEAN) {
189 identityParams.additionalProperties.insert({epParam.GetName(), epParam.GetBoolValueNoCheck()});
190 }
else if (epParam.GetStoredType() == ParameterType::STRING_ARRAY) {
191 identityParams.additionalProperties.insert({epParam.GetName(), epParam.GetStrArrayValueNoCheck()});
193 assert(!
"Unknown endpoint parameter!");
198 for (
const auto& serviceParam : serviceParams->parameterMap) {
199 identityParams.additionalProperties.insert({serviceParam.first, serviceParam.second});
206 auto authSchemeOptionIt = std::find_if(authSchemeOptions.begin(), authSchemeOptions.end(),
209 return m_authSchemes.find(opt.schemeId) != m_authSchemes.end();
211 assert(authSchemeOptionIt != authSchemeOptions.end());
213 if (authSchemeOptionIt != authSchemeOptions.end()) {
218 "Failed to select an auth scheme",
242 return GetContextEndpointParametersImpl(ctx);
246 const char* requestName,
251 auto httpResponseOutcome =
MakeRequestSync(request, requestName, method, std::move(endpointCallback), std::move(authCallback));
260 long long expirationInSeconds,
262 const std::shared_ptr<Aws::Http::ServiceSpecificParameters> serviceSpecificParameters)
const
268 const auto authSchemeEpParams = authSchemeOption.endpointParameters();
269 epParams.insert(epParams.end(), authSchemeEpParams.begin(), authSchemeEpParams.end());
270 if(serviceSpecificParameters)
272 auto bucketIt = serviceSpecificParameters->parameterMap.find(
"bucketName");
273 if(bucketIt != serviceSpecificParameters->parameterMap.end())
275 auto bucket = bucketIt->second;
276 epParams.emplace_back(
Aws::String(
"Bucket"), bucket);
280 auto epResolutionOutcome = this->
ResolveEndpoint(std::move(epParams), std::move(endpointCallback));
281 if (!epResolutionOutcome.IsSuccess())
283 AWS_LOGSTREAM_ERROR(ServiceNameT,
"Presigned URL generating failed. Encountered error: " << epResolutionOutcome.GetError().GetMessage());
286 auto endpoint = std::move(epResolutionOutcome.GetResultWithOwnership());
287 uri = endpoint.GetURI();
288 signerRegionOverride = region;
289 signerServiceNameOverride = serviceName;
291 if (endpoint.GetAttributes()) {
292 if (endpoint.GetAttributes()->authScheme.GetSigningRegion()) {
293 signerRegionOverride = endpoint.GetAttributes()->authScheme.GetSigningRegion()->c_str();
295 if (endpoint.GetAttributes()->authScheme.GetSigningRegionSet()) {
296 signerRegionOverride = endpoint.GetAttributes()->authScheme.GetSigningRegionSet()->c_str();
298 if (endpoint.GetAttributes()->authScheme.GetSigningName()) {
299 signerServiceNameOverride = endpoint.GetAttributes()->authScheme.GetSigningName()->c_str();
305 CreateHttpRequestCallback createHttpRequestCallback = [&customizedHeaders, &serviceSpecificParameters](
const Aws::Http::URI& uri,
const Aws::Http::HttpMethod& method) -> std::shared_ptr<HttpRequest> {
307 request->SetServiceSpecificParameters(serviceSpecificParameters);
308 for (
const auto& it: customizedHeaders)
310 request->SetHeaderValue(it.first.c_str(), it.second);
316 std::move(getUriCallback),
317 std::move(createHttpRequestCallback),
321 expirationInSeconds);
338 ExtractUriCallback&& getUriCallback,
339 CreateHttpRequestCallback&& createHttpRequestCallback,
343 long long expirationInSeconds)
const
347 auto authSchemeOption = std::move(authSchemeOptionOutcome.GetResultWithOwnership());
350 Aws::String signerServiceNameOverride = serviceName;
351 if(!getUriCallback(uri , signerRegionOverride, signerServiceNameOverride, authSchemeOption))
355 std::shared_ptr<HttpRequest> request = createHttpRequestCallback(uri, method);
358 return request->GetURIString();
364 ServiceClientConfigurationT,
365 ServiceAuthSchemeResolverT,
374 const auto resolvedAccountId = ctx.
m_awsIdentity->accountId();
375 const auto resolvedNonEmptyAccountId = resolvedAccountId.has_value() && !resolvedAccountId.value().empty();
377 if (resolvedNonEmptyAccountId) {
384 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 SigningEventOutcome SignEventMessage(Aws::Utils::Event::Message &message, Aws::String &seed, const std::shared_ptr< client::AwsSmithyClientAsyncRequestContext > &ctx, const Aws::UnorderedMap< Aws::String, AuthSchemesVariantT > &authSchemes)
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::AuthSchemeResolverBase<> > m_authResolver
std::shared_ptr< smithy::AwsIdentity > m_awsIdentity
Aws::Utils::Outcome< Aws::Vector< Aws::Endpoint::EndpointParameter >, AWSCoreError > GetContextEndpointParametersOutcome
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
HttpResponseOutcome MakeRequestSync(Aws::AmazonWebServiceRequest const *const request, const char *requestName, Aws::Http::HttpMethod method, EndpointUpdateCallback &&endpointCallback, AuthResolvedCallback &&authCallback) const
const Aws::UniquePtr< Aws::Client::ClientConfiguration > m_clientConfig
std::function< void(std::shared_ptr< AwsSmithyClientAsyncRequestContext >)> AuthResolvedCallback
SelectAuthSchemeOptionOutcome SelectAuthSchemeOption(const AwsSmithyClientAsyncRequestContext &ctx) const override
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
SigningEventOutcome SignEventMessage(Aws::Utils::Event::Message &message, Aws::String &seed, const std::shared_ptr< AwsSmithyClientAsyncRequestContext > &ctx) const
ResponseT MakeRequestDeserialize(Aws::AmazonWebServiceRequest const *const request, const char *requestName, Aws::Http::HttpMethod method, EndpointUpdateCallback &&endpointCallback, AuthResolvedCallback &&authCallback=nullptr) const
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