Skip to content

Commit 0b0126e

Browse files
committed
URI cache for dynamodb account-id based endpoints
1 parent 76590d4 commit 0b0126e

File tree

17 files changed

+476
-16
lines changed

17 files changed

+476
-16
lines changed

codegen/src/main/java/software/amazon/awssdk/codegen/model/config/customization/CustomizationConfig.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,11 @@ public class CustomizationConfig {
350350
*/
351351
private boolean enableFastUnmarshaller;
352352

353+
/**
354+
* A boolean flag to indicate if the code-generated endpoint providers class should cache the calls to URI constructors.
355+
*/
356+
private boolean enableEndpointProviderUriCaching;
357+
353358
private CustomizationConfig() {
354359
}
355360

@@ -924,4 +929,12 @@ public boolean getEnableFastUnmarshaller() {
924929
public void setEnableFastUnmarshaller(boolean enableFastUnmarshaller) {
925930
this.enableFastUnmarshaller = enableFastUnmarshaller;
926931
}
932+
933+
public boolean getEnableEndpointProviderUriCaching() {
934+
return enableEndpointProviderUriCaching;
935+
}
936+
937+
public void setEnableEndpointProviderUriCaching(boolean enableEndpointProviderUriCaching) {
938+
this.enableEndpointProviderUriCaching = enableEndpointProviderUriCaching;
939+
}
927940
}

codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/CodeGeneratorVisitor.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,21 +26,25 @@
2626
import software.amazon.awssdk.awscore.endpoints.authscheme.SigV4aAuthScheme;
2727
import software.amazon.awssdk.codegen.model.config.customization.KeyTypePair;
2828
import software.amazon.awssdk.endpoints.Endpoint;
29+
import software.amazon.awssdk.utils.uri.SdkURI;
2930

3031
public class CodeGeneratorVisitor extends WalkRuleExpressionVisitor {
3132
private final CodeBlock.Builder builder;
3233
private final RuleRuntimeTypeMirror typeMirror;
3334
private final SymbolTable symbolTable;
3435
private final Map<String, KeyTypePair> knownEndpointAttributes;
36+
private final boolean endpointCaching;
3537

3638
public CodeGeneratorVisitor(RuleRuntimeTypeMirror typeMirror,
3739
SymbolTable symbolTable,
3840
Map<String, KeyTypePair> knownEndpointAttributes,
39-
CodeBlock.Builder builder) {
41+
CodeBlock.Builder builder,
42+
boolean endpointCaching) {
4043
this.builder = builder;
4144
this.symbolTable = symbolTable;
4245
this.knownEndpointAttributes = knownEndpointAttributes;
4346
this.typeMirror = typeMirror;
47+
this.endpointCaching = endpointCaching;
4448
}
4549

4650
@Override
@@ -274,7 +278,11 @@ private void codegenTreeBody(RuleSetExpression expr) {
274278
@Override
275279
public Void visitEndpointExpression(EndpointExpression e) {
276280
builder.add("return $T.endpoint(", typeMirror.rulesResult().type());
277-
builder.add("$T.builder().url($T.create(", Endpoint.class, URI.class);
281+
if (endpointCaching) {
282+
builder.add("$T.builder().url($T.getInstance().create(", Endpoint.class, SdkURI.class);
283+
} else {
284+
builder.add("$T.builder().url($T.create(", Endpoint.class, URI.class);
285+
}
278286
e.url().accept(this);
279287
builder.add("))");
280288
e.headers().accept(this);

codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/EndpointProviderSpec2.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,10 +222,12 @@ private MethodSpec.Builder methodBuilderForRule(RuleSetExpression expr) {
222222
}
223223

224224
private void codegenExpr(RuleExpression expr, CodeBlock.Builder builder) {
225+
boolean useEndpointCaching = intermediateModel.getCustomizationConfig().getEnableEndpointProviderUriCaching();
225226
CodeGeneratorVisitor visitor = new CodeGeneratorVisitor(typeMirror,
226227
utils.symbolTable(),
227228
knownEndpointAttributes,
228-
builder);
229+
builder,
230+
useEndpointCaching);
229231
expr.accept(visitor);
230232
}
231233

core/auth-crt/src/main/java/software/amazon/awssdk/authcrt/signer/internal/CrtHttpRequestConverter.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import software.amazon.awssdk.http.SdkHttpFullRequest;
3737
import software.amazon.awssdk.utils.StringUtils;
3838
import software.amazon.awssdk.utils.http.SdkHttpUtils;
39+
import software.amazon.awssdk.utils.uri.SdkURI;
3940

4041
@SdkInternalApi
4142
public final class CrtHttpRequestConverter {
@@ -77,7 +78,7 @@ public SdkHttpFullRequest crtRequestToHttp(SdkHttpFullRequest inputRequest, Http
7778
String portString = SdkHttpUtils.isUsingStandardPort(builder.protocol(), builder.port()) ? "" : ":" + builder.port();
7879
String encodedPath = encodedPathFromCrtFormat(inputRequest.encodedPath(), signedCrtRequest.getEncodedPath());
7980
String fullUriString = builder.protocol() + "://" + builder.host() + portString + encodedPath;
80-
fullUri = new URI(fullUriString);
81+
fullUri = SdkURI.getInstance().newURI(fullUriString);
8182
} catch (URISyntaxException e) {
8283
return null;
8384
}

core/aws-core/src/main/java/software/amazon/awssdk/awscore/endpoint/AwsClientEndpointProvider.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import software.amazon.awssdk.utils.Lazy;
3939
import software.amazon.awssdk.utils.Logger;
4040
import software.amazon.awssdk.utils.OptionalUtils;
41+
import software.amazon.awssdk.utils.uri.SdkURI;
4142
import software.amazon.awssdk.utils.ToString;
4243
import software.amazon.awssdk.utils.Validate;
4344
import software.amazon.awssdk.utils.internal.SystemSettingUtils;
@@ -238,7 +239,7 @@ private Optional<ClientEndpoint> clientEndpointFromServiceMetadata(Builder build
238239
.region(builder.region)
239240
.tags(endpointTags)
240241
.build());
241-
URI endpoint = URI.create(builder.protocol + "://" + endpointWithoutProtocol);
242+
URI endpoint = SdkURI.getInstance().create(builder.protocol + "://" + endpointWithoutProtocol);
242243
if (endpoint.getHost() == null) {
243244
String error = "Configured region (" + builder.region + ") and tags (" + endpointTags + ") resulted in "
244245
+ "an invalid URI: " + endpoint + ". This is usually caused by an invalid region "
@@ -260,7 +261,7 @@ private Optional<ClientEndpoint> clientEndpointFromServiceMetadata(Builder build
260261
private Optional<URI> createUri(String source, Optional<String> uri) {
261262
return uri.map(u -> {
262263
try {
263-
URI parsedUri = new URI(uri.get());
264+
URI parsedUri = SdkURI.getInstance().newURI(uri.get());
264265
log.trace(() -> "Client endpoint was loaded from the " + source + ": " + parsedUri);
265266
return parsedUri;
266267
} catch (URISyntaxException e) {

core/http-auth-aws/src/main/java/software/amazon/awssdk/http/auth/aws/crt/internal/util/CrtHttpRequestConverter.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import software.amazon.awssdk.http.auth.aws.crt.internal.io.CrtInputStream;
3232
import software.amazon.awssdk.utils.StringUtils;
3333
import software.amazon.awssdk.utils.http.SdkHttpUtils;
34+
import software.amazon.awssdk.utils.uri.SdkURI;
3435

3536
@SdkInternalApi
3637
public final class CrtHttpRequestConverter {
@@ -73,7 +74,7 @@ public static SdkHttpRequest toRequest(SdkHttpRequest request, HttpRequest crtRe
7374
String portString = SdkHttpUtils.isUsingStandardPort(builder.protocol(), builder.port()) ? "" : ":" + builder.port();
7475
String encodedPath = encodedPathFromCrtFormat(request.encodedPath(), crtRequest.getEncodedPath());
7576
String fullUriString = builder.protocol() + "://" + builder.host() + portString + encodedPath;
76-
fullUri = new URI(fullUriString);
77+
fullUri = SdkURI.getInstance().newURI(fullUriString);
7778
} catch (URISyntaxException e) {
7879
throw new RuntimeException("Full URI could not be formed.", e);
7980
}

core/regions/src/main/java/software/amazon/awssdk/regions/internal/util/ServiceMetadataUtils.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import software.amazon.awssdk.regions.Region;
2424
import software.amazon.awssdk.regions.ServiceEndpointKey;
2525
import software.amazon.awssdk.utils.Pair;
26+
import software.amazon.awssdk.utils.uri.SdkURI;
2627
import software.amazon.awssdk.utils.StringUtils;
2728
import software.amazon.awssdk.utils.Validate;
2829

@@ -38,7 +39,7 @@ public static URI endpointFor(String hostname,
3839
String endpointPrefix,
3940
String region,
4041
String dnsSuffix) {
41-
return URI.create(StringUtils.replaceEach(hostname, SEARCH_LIST, new String[] { endpointPrefix, region, dnsSuffix }));
42+
return SdkURI.getInstance().create(StringUtils.replaceEach(hostname, SEARCH_LIST, new String[] {endpointPrefix, region, dnsSuffix }));
4243
}
4344

4445
public static Region signingRegion(ServiceEndpointKey key,

core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/util/MetricUtils.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import software.amazon.awssdk.metrics.NoOpMetricCollector;
3939
import software.amazon.awssdk.metrics.SdkMetric;
4040
import software.amazon.awssdk.utils.Pair;
41+
import software.amazon.awssdk.utils.uri.SdkURI;
4142

4243
/**
4344
* Utility methods for working with metrics.
@@ -112,7 +113,8 @@ public static void collectServiceEndpointMetrics(MetricCollector metricCollector
112113
// Only interested in the service endpoint so don't include any path, query, or fragment component
113114
URI requestUri = httpRequest.getUri();
114115
try {
115-
URI serviceEndpoint = new URI(requestUri.getScheme(), requestUri.getAuthority(), null, null, null);
116+
URI serviceEndpoint = SdkURI.getInstance().newURI(
117+
requestUri.getScheme(), requestUri.getAuthority(), null, null, null);
116118
metricCollector.reportMetric(CoreMetric.SERVICE_ENDPOINT, serviceEndpoint);
117119
} catch (URISyntaxException e) {
118120
// This should not happen since getUri() should return a valid URI

http-client-spi/src/main/java/software/amazon/awssdk/http/SdkHttpRequest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import java.util.function.BiConsumer;
2727
import software.amazon.awssdk.annotations.Immutable;
2828
import software.amazon.awssdk.annotations.SdkProtectedApi;
29+
import software.amazon.awssdk.utils.uri.SdkURI;
2930
import software.amazon.awssdk.utils.builder.CopyableBuilder;
3031
import software.amazon.awssdk.utils.builder.ToCopyableBuilder;
3132
import software.amazon.awssdk.utils.http.SdkHttpUtils;
@@ -154,7 +155,7 @@ default URI getUri() {
154155
// Do not include the port in the URI when using the default port for the protocol.
155156
String portString = SdkHttpUtils.isUsingStandardPort(protocol(), port()) ? "" : ":" + port();
156157

157-
return URI.create(protocol() + "://" + host() + portString + encodedPath() + encodedQueryString);
158+
return SdkURI.getInstance().create(protocol() + "://" + host() + portString + encodedPath() + encodedQueryString);
158159
}
159160

160161
/**

http-clients/apache-client/src/main/java/software/amazon/awssdk/http/apache/internal/impl/ApacheHttpRequestFactory.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import software.amazon.awssdk.http.apache.internal.ApacheHttpRequestConfig;
4141
import software.amazon.awssdk.http.apache.internal.RepeatableInputStreamRequestEntity;
4242
import software.amazon.awssdk.http.apache.internal.utils.ApacheUtils;
43+
import software.amazon.awssdk.utils.uri.SdkURI;
4344
import software.amazon.awssdk.utils.StringUtils;
4445
import software.amazon.awssdk.utils.http.SdkHttpUtils;
4546

@@ -80,7 +81,7 @@ private URI sanitizeUri(SdkHttpRequest request) {
8081
String portString = SdkHttpUtils.isUsingStandardPort(protocol, port) ?
8182
"" : ":" + port;
8283

83-
return URI.create(protocol + "://" + request.host() + portString + newPath + encodedQueryString);
84+
return SdkURI.getInstance().create(protocol + "://" + request.host() + portString + newPath + encodedQueryString);
8485
}
8586

8687
return request.getUri();

0 commit comments

Comments
 (0)