Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/


#pragma once

#include <aws/core/endpoint/internal/CrtEndpointProvider.h>

#include <aws/crt/endpoints/BddEngine.h>

namespace Aws
{
namespace Endpoint
{
static const char BDD_ENDPOINT_PROVIDER_TAG[] = "Aws::Endpoint::BDDEndpointProvider";

/**
* Resolves an endpoint using the compiled-bytecode CRT BDD engine.
*/
AWS_CORE_API ResolveEndpointOutcome
ResolveEndpointBddImpl(const Aws::Crt::Endpoints::BddEngine& bddEngine,
const EndpointParameters& builtInParameters,
const EndpointParameters& clientContextParameters,
const EndpointParameters& endpointParameters);

/**
* BDD endpoint provider template. Resolves endpoints from compiled BDD bytecode via the
* CRT Aws::Crt::Endpoints::BddEngine rather than a JSON ruleset. Drop-in replacement for
* DefaultEndpointProvider with improved performance.
*/
template<typename ClientConfigurationT = Aws::Client::GenericClientConfiguration,
typename BuiltInParametersT = Aws::Endpoint::BuiltInParameters,
typename ClientContextParametersT = Aws::Endpoint::ClientContextParameters>
class AWS_CORE_API BDDEndpointProvider : public CrtEndpointProvider<Aws::Crt::Endpoints::BddEngine,
ResolveEndpointBddImpl, ClientConfigurationT, BuiltInParametersT, ClientContextParametersT>
{
public:
using CrtEndpointProvider<Aws::Crt::Endpoints::BddEngine, ResolveEndpointBddImpl,
ClientConfigurationT, BuiltInParametersT, ClientContextParametersT>::CrtEndpointProvider;

virtual ~BDDEndpointProvider() = default;
};

/**
* Export endpoint provider symbols for Windows DLL, otherwise declare as extern
*/
AWS_CORE_EXTERN template class AWS_CORE_API BDDEndpointProvider<Aws::Client::GenericClientConfiguration,
Aws::Endpoint::BuiltInParameters,
Aws::Endpoint::ClientContextParameters>;
} // namespace Endpoint
} // namespace Aws
Original file line number Diff line number Diff line change
Expand Up @@ -6,20 +6,10 @@

#pragma once

#include <aws/core/endpoint/AWSPartitions.h>
#include <aws/core/endpoint/EndpointProviderBase.h>
#include <aws/core/endpoint/EndpointParameter.h>
#include <aws/core/endpoint/ClientContextParameters.h>
#include <aws/core/endpoint/BuiltInParameters.h>
#include <aws/core/utils/memory/stl/AWSArray.h>
#include <aws/core/endpoint/internal/CrtEndpointProvider.h>

#include <aws/crt/endpoints/RuleEngine.h>

#include <aws/core/utils/Outcome.h>
#include <aws/core/client/AWSError.h>
#include <aws/core/client/CoreErrors.h>
#include "aws/core/utils/logging/LogMacros.h"

namespace Aws
{
namespace Endpoint
Expand All @@ -33,6 +23,7 @@ namespace Aws
* @param clientContextParameters
* @param endpointParameters
* @return
* Resolves an endpoint using the JSON-ruleset CRT rule engine.
*/
AWS_CORE_API ResolveEndpointOutcome
ResolveEndpointDefaultImpl(const Aws::Crt::Endpoints::RuleEngine& ruleEngine,
Expand All @@ -41,78 +32,19 @@ namespace Aws
const EndpointParameters& endpointParameters);

/**
* Default endpoint provider template used in this SDK.
* Resolves endpoints from a JSON ruleset blob via the CRT Aws::Crt::Endpoints::RuleEngine.
*/
template<typename ClientConfigurationT = Aws::Client::GenericClientConfiguration,
typename BuiltInParametersT = Aws::Endpoint::BuiltInParameters,
typename ClientContextParametersT = Aws::Endpoint::ClientContextParameters>
class AWS_CORE_API DefaultEndpointProvider : public EndpointProviderBase<ClientConfigurationT, BuiltInParametersT, ClientContextParametersT>
class AWS_CORE_API DefaultEndpointProvider : public CrtEndpointProvider<Aws::Crt::Endpoints::RuleEngine,
ResolveEndpointDefaultImpl, ClientConfigurationT, BuiltInParametersT, ClientContextParametersT>
{
public:
DefaultEndpointProvider(const char* endpointRulesBlob, const size_t endpointRulesBlobSz)
: m_crtRuleEngine(Aws::Crt::ByteCursorFromArray((const uint8_t*) endpointRulesBlob, endpointRulesBlobSz),
Aws::Crt::ByteCursorFromArray((const uint8_t*) AWSPartitions::GetPartitionsBlob(), AWSPartitions::PartitionsBlobSize))
{
if(!m_crtRuleEngine) {
AWS_LOGSTREAM_FATAL(DEFAULT_ENDPOINT_PROVIDER_TAG, "Invalid CRT Rule Engine state");
}
}

virtual ~DefaultEndpointProvider()
{
}

void InitBuiltInParameters(const ClientConfigurationT& config) override
{
m_builtInParameters.SetFromClientConfiguration(config);
}

void InitBuiltInParameters(const ClientConfigurationT& config, const Aws::String& serviceName) override
{
m_builtInParameters.SetFromClientConfiguration(config, serviceName);
}

/**
* Default implementation of the ResolveEndpoint
*/
ResolveEndpointOutcome ResolveEndpoint(const EndpointParameters& endpointParameters) const override
{
auto ResolveEndpointDefaultImpl = Aws::Endpoint::ResolveEndpointDefaultImpl;
return ResolveEndpointDefaultImpl(m_crtRuleEngine, m_builtInParameters.GetAllParameters(), m_clientContextParameters.GetAllParameters(), endpointParameters);
};

const ClientContextParametersT& GetClientContextParameters() const override
{
return m_clientContextParameters;
}
ClientContextParametersT& AccessClientContextParameters() override
{
return m_clientContextParameters;
}

const BuiltInParametersT& GetBuiltInParameters() const
{
return m_builtInParameters;
}
BuiltInParametersT& AccessBuiltInParameters()
{
return m_builtInParameters;
}

void OverrideEndpoint(const Aws::String& endpoint) override
{
m_builtInParameters.OverrideEndpoint(endpoint);
}

protected:
/* Crt RuleEngine evaluator built using the service's Rule engine */
Aws::Crt::Endpoints::RuleEngine m_crtRuleEngine;

/* Also known as a configurable parameters defined by the AWS Service in their c2j/smithy model definition */
ClientContextParametersT m_clientContextParameters;
using CrtEndpointProvider<Aws::Crt::Endpoints::RuleEngine, ResolveEndpointDefaultImpl,
ClientConfigurationT, BuiltInParametersT, ClientContextParametersT>::CrtEndpointProvider;

/* Also known as parameters on the ClientConfiguration in this SDK */
BuiltInParametersT m_builtInParameters;
virtual ~DefaultEndpointProvider() = default;
};

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/


#pragma once

#include <aws/core/endpoint/AWSPartitions.h>
#include <aws/core/endpoint/EndpointProviderBase.h>
#include <aws/core/endpoint/EndpointParameter.h>
#include <aws/core/endpoint/ClientContextParameters.h>
#include <aws/core/endpoint/BuiltInParameters.h>

#include <aws/crt/Types.h>

#include <aws/core/utils/Outcome.h>
#include <aws/core/client/AWSError.h>
#include <aws/core/utils/logging/LogMacros.h>

namespace Aws {
namespace Endpoint {
/**
* Endpoint provider backed by a CRT endpoint engine. The two things that differ between
* the JSON-ruleset and BDD-bytecode providers are captured as template parameters:
* - RulesEngineT: the CRT engine type (Aws::Crt::Endpoints::RuleEngine or BddEngine),
* both constructed from a ruleset blob plus the partitions blob.
* - ResolveFn: the resolution entry point for that engine. It is an out-of-line exported
* symbol (ResolveEndpointDefaultImpl / ResolveEndpointBddImpl) so the resolution body
* lives once in aws-cpp-sdk-core rather than inlined into every service binary.
* Everything else (parameter storage, init, override, accessors) is shared here.
*/
template<typename RulesEngineT,
ResolveEndpointOutcome(*ResolveFn)(const RulesEngineT &,
const EndpointParameters &,
const EndpointParameters &,
const EndpointParameters &),
typename ClientConfigurationT = Aws::Client::GenericClientConfiguration,
typename BuiltInParametersT = Aws::Endpoint::BuiltInParameters,
typename ClientContextParametersT = Aws::Endpoint::ClientContextParameters>
class CrtEndpointProvider : public EndpointProviderBase<ClientConfigurationT, BuiltInParametersT,
ClientContextParametersT> {
public:
CrtEndpointProvider(const char *endpointRulesBlob, const size_t endpointRulesBlobSz)
: m_crtEngine(Aws::Crt::ByteCursorFromArray((const uint8_t *) endpointRulesBlob, endpointRulesBlobSz),
Aws::Crt::ByteCursorFromArray((const uint8_t *) AWSPartitions::GetPartitionsBlob(),
AWSPartitions::PartitionsBlobSize)) {
if (!m_crtEngine) {
AWS_LOGSTREAM_FATAL("CrtEndpointProvider", "Invalid CRT endpoint engine state");
}
}

virtual ~CrtEndpointProvider() = default;

void InitBuiltInParameters(const ClientConfigurationT &config) override {
m_builtInParameters.SetFromClientConfiguration(config);
}

void InitBuiltInParameters(const ClientConfigurationT &config, const Aws::String &serviceName) override {
m_builtInParameters.SetFromClientConfiguration(config, serviceName);
}

ResolveEndpointOutcome ResolveEndpoint(const EndpointParameters &endpointParameters) const override {
return ResolveFn(m_crtEngine, m_builtInParameters.GetAllParameters(),
m_clientContextParameters.GetAllParameters(), endpointParameters);
};

const ClientContextParametersT &GetClientContextParameters() const override {
return m_clientContextParameters;
}

ClientContextParametersT &AccessClientContextParameters() override {
return m_clientContextParameters;
}

const BuiltInParametersT &GetBuiltInParameters() const {
return m_builtInParameters;
}

BuiltInParametersT &AccessBuiltInParameters() {
return m_builtInParameters;
}

void OverrideEndpoint(const Aws::String &endpoint) override {
m_builtInParameters.OverrideEndpoint(endpoint);
}

protected:
/* Crt endpoint engine (RuleEngine or BddEngine) built from the service's ruleset blob */
RulesEngineT m_crtEngine;

/* Also known as a configurable parameters defined by the AWS Service in their c2j/smithy model definition */
ClientContextParametersT m_clientContextParameters;

/* Also known as parameters on the ClientConfiguration in this SDK */
BuiltInParametersT m_builtInParameters;
};
} // namespace Endpoint
} // namespace Aws
Loading
Loading