173 lines
7.2 KiB
C++
173 lines
7.2 KiB
C++
/**
|
|
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
* SPDX-License-Identifier: Apache-2.0.
|
|
*/
|
|
#pragma once
|
|
|
|
#include <smithy/identity/auth/AuthSchemeOption.h>
|
|
#include <smithy/identity/identity/AwsIdentity.h>
|
|
#include <smithy/tracing/TelemetryProvider.h>
|
|
#include <smithy/interceptor/Interceptor.h>
|
|
#include <smithy/client/features/ChecksumInterceptor.h>
|
|
|
|
#include <aws/crt/Variant.h>
|
|
#include <aws/core/client/ClientConfiguration.h>
|
|
#include <aws/core/endpoint/EndpointParameter.h>
|
|
#include <aws/core/http/HttpResponse.h>
|
|
#include <aws/core/utils/FutureOutcome.h>
|
|
#include <aws/core/utils/memory/stl/AWSMap.h>
|
|
#include <aws/core/utils/Outcome.h>
|
|
|
|
namespace Aws
|
|
{
|
|
namespace Utils
|
|
{
|
|
namespace RateLimits
|
|
{
|
|
class RateLimiterInterface;
|
|
}
|
|
}
|
|
|
|
namespace Http
|
|
{
|
|
class HttpClient;
|
|
}
|
|
|
|
namespace Client
|
|
{
|
|
class AWSErrorMarshaller;
|
|
class RetryStrategy;
|
|
}
|
|
|
|
namespace Utils
|
|
{
|
|
namespace Threading
|
|
{
|
|
class Executor;
|
|
}
|
|
}
|
|
|
|
class AmazonWebServiceRequest;
|
|
}
|
|
|
|
namespace Aws
|
|
{
|
|
namespace Endpoint
|
|
{
|
|
class AWSEndpoint;
|
|
}
|
|
}
|
|
|
|
namespace smithy {
|
|
namespace client
|
|
{
|
|
class AwsSmithyClientAsyncRequestContext;
|
|
/* Non-template base client class that contains main Aws Client Request pipeline logic */
|
|
class SMITHY_API AwsSmithyClientBase
|
|
{
|
|
public:
|
|
using HttpRequest = Aws::Http::HttpRequest;
|
|
using HttpResponse = Aws::Http::HttpResponse;
|
|
using CoreErrors = Aws::Client::CoreErrors;
|
|
using AWSError = Aws::Client::AWSError<CoreErrors>;
|
|
using ClientError = AWSError;
|
|
using SigningError = AWSError;
|
|
using SigningOutcome = Aws::Utils::FutureOutcome<std::shared_ptr<Aws::Http::HttpRequest>, SigningError>;
|
|
using EndpointUpdateCallback = std::function<void(Aws::Endpoint::AWSEndpoint&)>;
|
|
using HttpResponseOutcome = Aws::Utils::Outcome<std::shared_ptr<Aws::Http::HttpResponse>, AWSError>;
|
|
using ResponseHandlerFunc = std::function<void(HttpResponseOutcome&&)>;
|
|
using SelectAuthSchemeOptionOutcome = Aws::Utils::Outcome<AuthSchemeOption, AWSError>;
|
|
using ResolveEndpointOutcome = Aws::Utils::Outcome<Aws::Endpoint::AWSEndpoint, AWSError>;
|
|
|
|
AwsSmithyClientBase(Aws::UniquePtr<Aws::Client::ClientConfiguration>&& clientConfig,
|
|
Aws::String serviceName,
|
|
std::shared_ptr<Aws::Http::HttpClient> httpClient,
|
|
std::shared_ptr<Aws::Client::AWSErrorMarshaller> errorMarshaller) :
|
|
m_clientConfig(std::move(clientConfig)),
|
|
m_serviceName(std::move(serviceName)),
|
|
m_userAgent(),
|
|
m_httpClient(std::move(httpClient)),
|
|
m_errorMarshaller(std::move(errorMarshaller)),
|
|
m_interceptors{Aws::MakeShared<ChecksumInterceptor>("AwsSmithyClientBase")}
|
|
{
|
|
if (!m_clientConfig->retryStrategy)
|
|
{
|
|
assert(m_clientConfig->configFactories.retryStrategyCreateFn);
|
|
m_clientConfig->retryStrategy = m_clientConfig->configFactories.retryStrategyCreateFn();
|
|
}
|
|
if (!m_clientConfig->executor)
|
|
{
|
|
assert(m_clientConfig->configFactories.executorCreateFn);
|
|
m_clientConfig->executor = m_clientConfig->configFactories.executorCreateFn();
|
|
}
|
|
if (!m_clientConfig->writeRateLimiter)
|
|
{
|
|
assert(m_clientConfig->configFactories.writeRateLimiterCreateFn);
|
|
m_clientConfig->writeRateLimiter = m_clientConfig->configFactories.writeRateLimiterCreateFn();
|
|
}
|
|
if (!m_clientConfig->readRateLimiter)
|
|
{
|
|
assert(m_clientConfig->configFactories.readRateLimiterCreateFn);
|
|
m_clientConfig->readRateLimiter = m_clientConfig->configFactories.readRateLimiterCreateFn();
|
|
}
|
|
if (!m_clientConfig->telemetryProvider)
|
|
{
|
|
assert(m_clientConfig->configFactories.telemetryProviderCreateFn);
|
|
m_clientConfig->telemetryProvider = m_clientConfig->configFactories.telemetryProviderCreateFn();
|
|
}
|
|
|
|
m_userAgent = Aws::Client::ComputeUserAgentString(m_clientConfig.get());
|
|
}
|
|
|
|
AwsSmithyClientBase(const AwsSmithyClientBase&) = delete;
|
|
AwsSmithyClientBase(AwsSmithyClientBase&&) = delete;
|
|
AwsSmithyClientBase& operator=(const AwsSmithyClientBase&) = delete;
|
|
AwsSmithyClientBase& operator=(AwsSmithyClientBase&&) = delete;
|
|
|
|
virtual ~AwsSmithyClientBase() = default;
|
|
|
|
void MakeRequestAsync(Aws::AmazonWebServiceRequest const * const request,
|
|
const char* requestName,
|
|
Aws::Http::HttpMethod method,
|
|
EndpointUpdateCallback&& endpointCallback,
|
|
ResponseHandlerFunc&& responseHandler,
|
|
std::shared_ptr<Aws::Utils::Threading::Executor> pExecutor) const;
|
|
|
|
HttpResponseOutcome MakeRequestSync(Aws::AmazonWebServiceRequest const * const request,
|
|
const char* requestName,
|
|
Aws::Http::HttpMethod method,
|
|
EndpointUpdateCallback&& endpointCallback) const;
|
|
|
|
protected:
|
|
/**
|
|
* Transforms the AmazonWebServicesResult object into an HttpRequest.
|
|
*/
|
|
std::shared_ptr<Aws::Http::HttpRequest> BuildHttpRequest(const std::shared_ptr<AwsSmithyClientAsyncRequestContext>& pRequestCtx, const Aws::Http::URI& uri, Aws::Http::HttpMethod method) const;
|
|
|
|
|
|
virtual void AttemptOneRequestAsync(std::shared_ptr<AwsSmithyClientAsyncRequestContext> pRequestCtx) const;
|
|
|
|
virtual void HandleAsyncReply(std::shared_ptr<AwsSmithyClientAsyncRequestContext> pRequestCtx,
|
|
std::shared_ptr<Aws::Http::HttpResponse> httpResponse) const;
|
|
|
|
inline virtual const char* GetServiceClientName() const { return m_serviceName.c_str(); }
|
|
inline virtual const std::shared_ptr<Aws::Http::HttpClient>& GetHttpClient() { return m_httpClient; }
|
|
virtual void DisableRequestProcessing();
|
|
|
|
virtual ResolveEndpointOutcome ResolveEndpoint(const Aws::Endpoint::EndpointParameters& endpointParameters, EndpointUpdateCallback&& epCallback) const = 0;
|
|
virtual SelectAuthSchemeOptionOutcome SelectAuthSchemeOption(const AwsSmithyClientAsyncRequestContext& ctx) const = 0;
|
|
virtual SigningOutcome SignRequest(std::shared_ptr<HttpRequest> httpRequest, const AuthSchemeOption& targetAuthSchemeOption) const = 0;
|
|
virtual bool AdjustClockSkew(HttpResponseOutcome& outcome, const AuthSchemeOption& authSchemeOption) const = 0;
|
|
|
|
protected:
|
|
Aws::UniquePtr<Aws::Client::ClientConfiguration> m_clientConfig;
|
|
Aws::String m_serviceName;
|
|
Aws::String m_userAgent;
|
|
|
|
std::shared_ptr<Aws::Http::HttpClient> m_httpClient;
|
|
std::shared_ptr<Aws::Client::AWSErrorMarshaller> m_errorMarshaller;
|
|
Aws::Vector<std::shared_ptr<smithy::interceptor::Interceptor>> m_interceptors{};
|
|
};
|
|
} // namespace client
|
|
} // namespace smithy
|