|
6 | 6 | import java.util.List; |
7 | 7 | import java.util.Optional; |
8 | 8 | import java.util.concurrent.CompletableFuture; |
| 9 | +import java.util.concurrent.CompletionException; |
9 | 10 | import java.util.function.Consumer; |
10 | 11 | import java.util.function.Function; |
11 | 12 | import org.slf4j.Logger; |
12 | 13 | import org.slf4j.LoggerFactory; |
13 | 14 | import software.amazon.awssdk.annotations.Generated; |
14 | 15 | import software.amazon.awssdk.annotations.SdkInternalApi; |
| 16 | +import software.amazon.awssdk.awscore.client.config.AwsClientOption; |
15 | 17 | import software.amazon.awssdk.awscore.client.handler.AwsAsyncClientHandler; |
| 18 | +import software.amazon.awssdk.awscore.endpoints.AwsEndpointAttribute; |
| 19 | +import software.amazon.awssdk.awscore.endpoints.authscheme.EndpointAuthScheme; |
16 | 20 | import software.amazon.awssdk.awscore.exception.AwsServiceException; |
17 | 21 | import software.amazon.awssdk.awscore.internal.AwsProtocolMetadata; |
18 | 22 | import software.amazon.awssdk.awscore.internal.AwsServiceProtocol; |
| 23 | +import software.amazon.awssdk.awscore.internal.endpoints.AwsEndpointProviderUtils; |
19 | 24 | import software.amazon.awssdk.awscore.retry.AwsRetryStrategy; |
20 | 25 | import software.amazon.awssdk.core.RequestOverrideConfiguration; |
21 | 26 | import software.amazon.awssdk.core.SdkPlugin; |
22 | 27 | import software.amazon.awssdk.core.SdkRequest; |
| 28 | +import software.amazon.awssdk.core.SelectedAuthScheme; |
23 | 29 | import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration; |
24 | 30 | import software.amazon.awssdk.core.client.config.SdkClientConfiguration; |
25 | 31 | import software.amazon.awssdk.core.client.config.SdkClientOption; |
26 | 32 | import software.amazon.awssdk.core.client.handler.AsyncClientHandler; |
27 | 33 | import software.amazon.awssdk.core.client.handler.ClientExecutionParams; |
| 34 | +import software.amazon.awssdk.core.exception.SdkClientException; |
28 | 35 | import software.amazon.awssdk.core.http.HttpResponseHandler; |
| 36 | +import software.amazon.awssdk.core.interceptor.ExecutionAttributes; |
| 37 | +import software.amazon.awssdk.core.interceptor.SdkInternalExecutionAttribute; |
29 | 38 | import software.amazon.awssdk.core.metrics.CoreMetric; |
30 | 39 | import software.amazon.awssdk.core.retry.RetryMode; |
| 40 | +import software.amazon.awssdk.endpoints.Endpoint; |
| 41 | +import software.amazon.awssdk.http.auth.spi.scheme.AuthSchemeOption; |
31 | 42 | import software.amazon.awssdk.metrics.MetricCollector; |
32 | 43 | import software.amazon.awssdk.metrics.MetricPublisher; |
33 | 44 | import software.amazon.awssdk.metrics.NoOpMetricCollector; |
|
37 | 48 | import software.amazon.awssdk.protocols.json.BaseAwsJsonProtocolFactory; |
38 | 49 | import software.amazon.awssdk.protocols.json.JsonOperationMetadata; |
39 | 50 | import software.amazon.awssdk.retries.api.RetryStrategy; |
| 51 | +import software.amazon.awssdk.services.querytojsoncompatible.auth.scheme.QueryToJsonCompatibleAuthSchemeParams; |
| 52 | +import software.amazon.awssdk.services.querytojsoncompatible.auth.scheme.QueryToJsonCompatibleAuthSchemeProvider; |
| 53 | +import software.amazon.awssdk.services.querytojsoncompatible.endpoints.QueryToJsonCompatibleEndpointParams; |
| 54 | +import software.amazon.awssdk.services.querytojsoncompatible.endpoints.QueryToJsonCompatibleEndpointProvider; |
| 55 | +import software.amazon.awssdk.services.querytojsoncompatible.endpoints.internal.QueryToJsonCompatibleEndpointResolverUtils; |
40 | 56 | import software.amazon.awssdk.services.querytojsoncompatible.internal.QueryToJsonCompatibleServiceClientConfigurationBuilder; |
41 | 57 | import software.amazon.awssdk.services.querytojsoncompatible.internal.ServiceVersionInfo; |
42 | 58 | import software.amazon.awssdk.services.querytojsoncompatible.model.APostOperationRequest; |
|
46 | 62 | import software.amazon.awssdk.services.querytojsoncompatible.transform.APostOperationRequestMarshaller; |
47 | 63 | import software.amazon.awssdk.utils.CompletableFutureUtils; |
48 | 64 | import software.amazon.awssdk.utils.HostnameValidator; |
| 65 | +import software.amazon.awssdk.utils.Validate; |
49 | 66 |
|
50 | 67 | /** |
51 | 68 | * Internal implementation of {@link QueryToJsonCompatibleAsyncClient}. |
@@ -133,10 +150,16 @@ public CompletableFuture<APostOperationResponse> aPostOperation(APostOperationRe |
133 | 150 |
|
134 | 151 | CompletableFuture<APostOperationResponse> executeFuture = clientHandler |
135 | 152 | .execute(new ClientExecutionParams<APostOperationRequest, APostOperationResponse>() |
136 | | - .withOperationName("APostOperation").withProtocolMetadata(protocolMetadata) |
| 153 | + .withOperationName("APostOperation") |
| 154 | + .withProtocolMetadata(protocolMetadata) |
137 | 155 | .withMarshaller(new APostOperationRequestMarshaller(protocolFactory)) |
138 | | - .withResponseHandler(responseHandler).withErrorResponseHandler(errorResponseHandler) |
139 | | - .withRequestConfiguration(clientConfiguration).withMetricCollector(apiCallMetricCollector) |
| 156 | + .withResponseHandler(responseHandler) |
| 157 | + .withErrorResponseHandler(errorResponseHandler) |
| 158 | + .withRequestConfiguration(clientConfiguration) |
| 159 | + .withMetricCollector(apiCallMetricCollector) |
| 160 | + .withAuthSchemeOptionsResolver( |
| 161 | + r -> resolveAuthSchemeOptions(r, "APostOperation", clientConfiguration)) |
| 162 | + .withEndpointResolver((r, a) -> resolveEndpoint(r, a, "APostOperation")) |
140 | 163 | .hostPrefixExpression(resolvedHostExpression).withInput(aPostOperationRequest)); |
141 | 164 | CompletableFuture<APostOperationResponse> whenCompleted = executeFuture.whenComplete((r, e) -> { |
142 | 165 | metricPublishers.forEach(p -> p.publish(apiCallMetricCollector.collect())); |
@@ -180,6 +203,50 @@ private static List<MetricPublisher> resolveMetricPublishers(SdkClientConfigurat |
180 | 203 | return publishers; |
181 | 204 | } |
182 | 205 |
|
| 206 | + private List<AuthSchemeOption> resolveAuthSchemeOptions(SdkRequest request, String operationName, |
| 207 | + SdkClientConfiguration clientConfiguration) { |
| 208 | + QueryToJsonCompatibleAuthSchemeProvider authSchemeProvider = Validate.isInstanceOf( |
| 209 | + QueryToJsonCompatibleAuthSchemeProvider.class, clientConfiguration.option(SdkClientOption.AUTH_SCHEME_PROVIDER), |
| 210 | + "Expected an instance of QueryToJsonCompatibleAuthSchemeProvider"); |
| 211 | + QueryToJsonCompatibleAuthSchemeParams.Builder paramsBuilder = QueryToJsonCompatibleAuthSchemeParams.builder().operation( |
| 212 | + operationName); |
| 213 | + paramsBuilder.region(clientConfiguration.option(AwsClientOption.AWS_REGION)); |
| 214 | + List<AuthSchemeOption> options = authSchemeProvider.resolveAuthScheme(paramsBuilder.build()); |
| 215 | + return options; |
| 216 | + } |
| 217 | + |
| 218 | + private Endpoint resolveEndpoint(SdkRequest request, ExecutionAttributes executionAttributes, String operationName) { |
| 219 | + QueryToJsonCompatibleEndpointProvider provider = (QueryToJsonCompatibleEndpointProvider) executionAttributes |
| 220 | + .getAttribute(SdkInternalExecutionAttribute.ENDPOINT_PROVIDER); |
| 221 | + try { |
| 222 | + QueryToJsonCompatibleEndpointParams endpointParams = QueryToJsonCompatibleEndpointResolverUtils.ruleParams(request, |
| 223 | + executionAttributes); |
| 224 | + Endpoint endpoint = provider.resolveEndpoint(endpointParams).join(); |
| 225 | + if (!AwsEndpointProviderUtils.disableHostPrefixInjection(executionAttributes)) { |
| 226 | + Optional<String> hostPrefix = QueryToJsonCompatibleEndpointResolverUtils.hostPrefix(operationName, request); |
| 227 | + if (hostPrefix.isPresent()) { |
| 228 | + endpoint = AwsEndpointProviderUtils.addHostPrefix(endpoint, hostPrefix.get()); |
| 229 | + } |
| 230 | + } |
| 231 | + List<EndpointAuthScheme> endpointAuthSchemes = endpoint.attribute(AwsEndpointAttribute.AUTH_SCHEMES); |
| 232 | + SelectedAuthScheme<?> selectedAuthScheme = executionAttributes |
| 233 | + .getAttribute(SdkInternalExecutionAttribute.SELECTED_AUTH_SCHEME); |
| 234 | + if (endpointAuthSchemes != null && selectedAuthScheme != null) { |
| 235 | + selectedAuthScheme = QueryToJsonCompatibleEndpointResolverUtils.authSchemeWithEndpointSignerProperties( |
| 236 | + endpointAuthSchemes, selectedAuthScheme); |
| 237 | + executionAttributes.putAttribute(SdkInternalExecutionAttribute.SELECTED_AUTH_SCHEME, selectedAuthScheme); |
| 238 | + } |
| 239 | + QueryToJsonCompatibleEndpointResolverUtils.setMetricValues(endpoint, executionAttributes); |
| 240 | + return endpoint; |
| 241 | + } catch (CompletionException e) { |
| 242 | + Throwable cause = e.getCause(); |
| 243 | + if (cause instanceof SdkClientException) { |
| 244 | + throw (SdkClientException) cause; |
| 245 | + } |
| 246 | + throw SdkClientException.create("Endpoint resolution failed: " + cause.getMessage(), cause); |
| 247 | + } |
| 248 | + } |
| 249 | + |
183 | 250 | private void updateRetryStrategyClientConfiguration(SdkClientConfiguration.Builder configuration) { |
184 | 251 | ClientOverrideConfiguration.Builder builder = configuration.asOverrideConfigurationBuilder(); |
185 | 252 | RetryMode retryMode = builder.retryMode(); |
|
0 commit comments