77#include < aws/core/endpoint/EndpointProviderBase.h>
88#include < aws/core/client/ConfiguredEndpointResolver.h>
99#include < aws/core/client/ClientConfiguration.h>
10+ #include < aws/core/utils/Optional.h>
11+ #include < aws/core/platform/Environment.h>
12+ #include < aws/core/http/URI.h>
1013#include < memory>
1114
1215namespace Aws
@@ -22,25 +25,86 @@ class ConfiguredEndpointProvider : public Aws::Endpoint::EndpointProviderBase<Cl
2225 std::shared_ptr<Aws::Endpoint::EndpointProviderBase<ClientConfigurationT>> inner,
2326 Aws::String serviceId,
2427 std::shared_ptr<Aws::Config::AWSConfigFileProfileConfigLoader> loader,
25- const ClientConfigurationT& config);
28+ const ClientConfigurationT& config)
29+ : m_inner(std::move(inner)), m_serviceId(std::move(serviceId))
30+ {
31+ // Check for explicit override
32+ m_explicit = config.endpointOverride ;
2633
27- void InitBuiltInParameters (const ClientConfigurationT& config) override ;
28- void OverrideEndpoint (const Aws::String& endpoint) override ;
34+ // Check for opt-out flags
35+ auto envValue = Environment::GetEnv (" AWS_IGNORE_CONFIGURED_ENDPOINT_URLS" );
36+ bool ignoreEnv = (envValue == " true" || envValue == " TRUE" || envValue == " True" || envValue == " 1" );
37+
38+ // Only resolve configured endpoints if not ignored and no explicit override
39+ if (!ignoreEnv && m_explicit.empty ())
40+ {
41+ ConfiguredEndpointResolver::Options opts;
42+ opts.policy = ConfiguredEndpointsPolicy::UseConfigured;
43+ if (!config.profileName .empty ()) {
44+ opts.profileName = config.profileName ;
45+ }
46+
47+ ConfiguredEndpointResolver resolver (loader, opts);
48+ auto result = resolver.ResolveForService (m_serviceId);
49+ if (!result.url .empty ()) {
50+ m_chain = result;
51+ }
52+ }
53+ }
54+
55+ void InitBuiltInParameters (const ClientConfigurationT& config) override
56+ {
57+ m_inner->InitBuiltInParameters (config);
58+ }
59+
60+ void OverrideEndpoint (const Aws::String& endpoint) override
61+ {
62+ m_explicit = endpoint;
63+ m_inner->OverrideEndpoint (endpoint);
64+ }
2965
3066 typename Aws::Endpoint::EndpointProviderBase<ClientConfigurationT>::ClientContextParameters&
31- AccessClientContextParameters () override ;
67+ AccessClientContextParameters () override
68+ {
69+ return m_inner->AccessClientContextParameters ();
70+ }
3271
3372 const typename Aws::Endpoint::EndpointProviderBase<ClientConfigurationT>::ClientContextParameters&
34- GetClientContextParameters () const override ;
73+ GetClientContextParameters () const override
74+ {
75+ return m_inner->GetClientContextParameters ();
76+ }
3577
3678 Aws::Endpoint::ResolveEndpointOutcome
37- ResolveEndpoint (const Aws::Endpoint::EndpointParameters& params) const override ;
79+ ResolveEndpoint (const Aws::Endpoint::EndpointParameters& params) const override
80+ {
81+ // 1. Explicit override wins
82+ if (!m_explicit.empty ())
83+ {
84+ Aws::Http::URI uri (m_explicit);
85+ Aws::Endpoint::AWSEndpoint endpoint;
86+ endpoint.SetURI (uri);
87+ return Aws::Endpoint::ResolveEndpointOutcome (endpoint);
88+ }
89+
90+ // 2. Configured chain (env / services / profile)
91+ if (m_chain.has_value ())
92+ {
93+ Aws::Http::URI uri (m_chain->url );
94+ Aws::Endpoint::AWSEndpoint endpoint;
95+ endpoint.SetURI (uri);
96+ return Aws::Endpoint::ResolveEndpointOutcome (endpoint);
97+ }
98+
99+ // 3. Default rules-based provider
100+ return m_inner->ResolveEndpoint (params);
101+ }
38102
39103private:
40104 std::shared_ptr<Aws::Endpoint::EndpointProviderBase<ClientConfigurationT>> m_inner;
41105 Aws::String m_serviceId;
42106 Aws::String m_explicit;
43- ResolvedEndpoint m_chain;
107+ Aws::Utils::Optional< ResolvedEndpoint> m_chain;
44108};
45109
46110} // namespace Client
0 commit comments