GameLiftPlugin/Source/AWSSDK/Include/smithy/client/AwsSmithyClientBase.h (141 lines of code) (raw):
/**
* 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