asyncProvider;
+
@Before
public void setup() {
provider = new ClasspathSdkHttpServiceProvider<>(serviceLoader,
- SdkSystemSetting.SYNC_HTTP_SERVICE_IMPL,
- SdkHttpService.class);
+ SdkHttpService.class,
+ SYNC_HTTP_SERVICES_PRIORITY);
+
+ asyncProvider = new ClasspathSdkHttpServiceProvider<>(serviceLoader,
+ SdkAsyncHttpService.class,
+ ASYNC_HTTP_SERVICES_PRIORITY);
}
@Test
@@ -60,11 +69,36 @@ public void oneImplementationsFound_ReturnsFulfilledOptional() {
assertThat(provider.loadService()).isPresent();
}
- @Test(expected = SdkClientException.class)
- public void multipleImplementationsFound_ThrowsException() {
+ @Test
+ public void multipleSyncImplementationsFound_ReturnHighestPriority() {
+ ApacheSdkHttpService apacheSdkHttpService = new ApacheSdkHttpService();
+ SdkHttpService mock = mock(SdkHttpService.class);
+
+ when(serviceLoader.loadServices(SdkHttpService.class))
+ .thenReturn(iteratorOf(mock, apacheSdkHttpService));
+ assertThat(provider.loadService()).contains(apacheSdkHttpService);
+
+ SdkHttpService mock1 = mock(SdkHttpService.class);
+ SdkHttpService mock2 = mock(SdkHttpService.class);
when(serviceLoader.loadServices(SdkHttpService.class))
- .thenReturn(iteratorOf(mock(SdkHttpService.class), mock(SdkHttpService.class)));
- provider.loadService();
+ .thenReturn(iteratorOf(mock1, mock2));
+ assertThat(provider.loadService()).contains(mock1);
+ }
+
+ @Test
+ public void multipleAsyncImplementationsFound_ReturnHighestPriority() {
+ NettySdkAsyncHttpService netty = new NettySdkAsyncHttpService();
+ SdkAsyncHttpService mock = mock(SdkAsyncHttpService.class);
+
+ when(serviceLoader.loadServices(SdkAsyncHttpService.class))
+ .thenReturn(iteratorOf(mock, netty));
+ assertThat(asyncProvider.loadService()).contains(netty);
+
+ SdkAsyncHttpService mock1 = mock(SdkAsyncHttpService.class);
+ SdkAsyncHttpService mock2 = mock(SdkAsyncHttpService.class);
+ when(serviceLoader.loadServices(SdkAsyncHttpService.class))
+ .thenReturn(iteratorOf(mock1, mock2));
+ assertThat(asyncProvider.loadService()).contains(mock1);
}
@SafeVarargs
diff --git a/http-client-spi/pom.xml b/http-client-spi/pom.xml
index e7231b850b53..04698936bf19 100644
--- a/http-client-spi/pom.xml
+++ b/http-client-spi/pom.xml
@@ -22,7 +22,7 @@
aws-sdk-java-pom
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
http-client-spi
AWS Java SDK :: HTTP Client Interface
diff --git a/http-client-spi/src/main/java/software/amazon/awssdk/http/HttpExecuteResponse.java b/http-client-spi/src/main/java/software/amazon/awssdk/http/HttpExecuteResponse.java
index f8db3f2cd250..8f183be3e408 100644
--- a/http-client-spi/src/main/java/software/amazon/awssdk/http/HttpExecuteResponse.java
+++ b/http-client-spi/src/main/java/software/amazon/awssdk/http/HttpExecuteResponse.java
@@ -38,7 +38,7 @@ public SdkHttpResponse httpResponse() {
}
/**
- * /** Get the {@link AbortableInputStream} associated with this response.
+ * Get the {@link AbortableInputStream} associated with this response.
*
* Always close the "responseBody" input stream to release the underlying HTTP connection.
* Even for error responses, the SDK creates an input stream for reading error data. It is essential to close the input stream
diff --git a/http-clients/apache-client/pom.xml b/http-clients/apache-client/pom.xml
index 3cc5fc7b46e9..a2be356b598e 100644
--- a/http-clients/apache-client/pom.xml
+++ b/http-clients/apache-client/pom.xml
@@ -21,7 +21,7 @@
http-clients
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
apache-client
diff --git a/http-clients/aws-crt-client/pom.xml b/http-clients/aws-crt-client/pom.xml
index 6aeb6b14045b..3dcab0d7e683 100644
--- a/http-clients/aws-crt-client/pom.xml
+++ b/http-clients/aws-crt-client/pom.xml
@@ -21,7 +21,7 @@
http-clients
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
4.0.0
@@ -151,12 +151,6 @@
${awsjavasdk.version}
test
-
- software.amazon.awssdk
- s3
- ${awsjavasdk.version}
- test
-
software.amazon.awssdk
auth
diff --git a/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/AwsCrtAsyncHttpClient.java b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/AwsCrtAsyncHttpClient.java
index ad13d787f17f..64ffd3dabb3a 100644
--- a/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/AwsCrtAsyncHttpClient.java
+++ b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/AwsCrtAsyncHttpClient.java
@@ -15,44 +15,21 @@
package software.amazon.awssdk.http.crt;
-import static software.amazon.awssdk.crtcore.CrtConfigurationUtils.resolveHttpMonitoringOptions;
-import static software.amazon.awssdk.crtcore.CrtConfigurationUtils.resolveProxy;
import static software.amazon.awssdk.http.HttpMetric.HTTP_CLIENT_NAME;
-import static software.amazon.awssdk.http.SdkHttpConfigurationOption.PROTOCOL;
-import static software.amazon.awssdk.http.crt.internal.AwsCrtConfigurationUtils.buildSocketOptions;
-import static software.amazon.awssdk.http.crt.internal.AwsCrtConfigurationUtils.resolveCipherPreference;
-import static software.amazon.awssdk.utils.FunctionalUtils.invokeSafely;
import static software.amazon.awssdk.utils.Validate.paramNotNull;
-import java.net.URI;
import java.time.Duration;
-import java.util.LinkedList;
-import java.util.Map;
import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Consumer;
import software.amazon.awssdk.annotations.SdkPublicApi;
-import software.amazon.awssdk.crt.CrtResource;
import software.amazon.awssdk.crt.http.HttpClientConnectionManager;
-import software.amazon.awssdk.crt.http.HttpClientConnectionManagerOptions;
-import software.amazon.awssdk.crt.http.HttpMonitoringOptions;
-import software.amazon.awssdk.crt.http.HttpProxyOptions;
-import software.amazon.awssdk.crt.io.ClientBootstrap;
-import software.amazon.awssdk.crt.io.SocketOptions;
-import software.amazon.awssdk.crt.io.TlsContext;
-import software.amazon.awssdk.crt.io.TlsContextOptions;
-import software.amazon.awssdk.http.Protocol;
import software.amazon.awssdk.http.SdkHttpConfigurationOption;
-import software.amazon.awssdk.http.SdkHttpRequest;
import software.amazon.awssdk.http.async.AsyncExecuteRequest;
import software.amazon.awssdk.http.async.SdkAsyncHttpClient;
-import software.amazon.awssdk.http.crt.internal.CrtRequestContext;
+import software.amazon.awssdk.http.crt.internal.AwsCrtClientBuilderBase;
+import software.amazon.awssdk.http.crt.internal.CrtAsyncRequestContext;
import software.amazon.awssdk.http.crt.internal.CrtRequestExecutor;
-import software.amazon.awssdk.metrics.NoOpMetricCollector;
import software.amazon.awssdk.utils.AttributeMap;
-import software.amazon.awssdk.utils.IoUtils;
-import software.amazon.awssdk.utils.Logger;
-import software.amazon.awssdk.utils.Validate;
/**
* An implementation of {@link SdkAsyncHttpClient} that uses the AWS Common Runtime (CRT) Http Client to communicate with
@@ -69,67 +46,14 @@
*
*/
@SdkPublicApi
-public final class AwsCrtAsyncHttpClient implements SdkAsyncHttpClient {
- private static final Logger log = Logger.loggerFor(AwsCrtAsyncHttpClient.class);
+public final class AwsCrtAsyncHttpClient extends AwsCrtHttpClientBase implements SdkAsyncHttpClient {
- private static final String AWS_COMMON_RUNTIME = "AwsCommonRuntime";
- private static final long DEFAULT_STREAM_WINDOW_SIZE = 16L * 1024L * 1024L; // 16 MB
-
- private final Map connectionPools = new ConcurrentHashMap<>();
- private final LinkedList ownedSubResources = new LinkedList<>();
- private final ClientBootstrap bootstrap;
- private final SocketOptions socketOptions;
- private final TlsContext tlsContext;
- private final HttpProxyOptions proxyOptions;
- private final HttpMonitoringOptions monitoringOptions;
- private final long maxConnectionIdleInMilliseconds;
- private final long readBufferSize;
- private final int maxConnectionsPerEndpoint;
- private boolean isClosed = false;
-
- private AwsCrtAsyncHttpClient(DefaultBuilder builder, AttributeMap config) {
- if (config.get(PROTOCOL) == Protocol.HTTP2) {
- throw new UnsupportedOperationException("HTTP/2 is not supported in AwsCrtAsyncHttpClient yet. Use "
- + "NettyNioAsyncHttpClient instead.");
- }
-
- try (ClientBootstrap clientBootstrap = new ClientBootstrap(null, null);
- SocketOptions clientSocketOptions = buildSocketOptions(builder.tcpKeepAliveConfiguration,
- config.get(SdkHttpConfigurationOption.CONNECTION_TIMEOUT));
- TlsContextOptions clientTlsContextOptions =
- TlsContextOptions.createDefaultClient()
- .withCipherPreference(resolveCipherPreference(builder.postQuantumTlsEnabled))
- .withVerifyPeer(!config.get(SdkHttpConfigurationOption.TRUST_ALL_CERTIFICATES));
- TlsContext clientTlsContext = new TlsContext(clientTlsContextOptions)) {
-
- this.bootstrap = registerOwnedResource(clientBootstrap);
- this.socketOptions = registerOwnedResource(clientSocketOptions);
- this.tlsContext = registerOwnedResource(clientTlsContext);
- this.readBufferSize = builder.readBufferSize == null ? DEFAULT_STREAM_WINDOW_SIZE : builder.readBufferSize;
- this.maxConnectionsPerEndpoint = config.get(SdkHttpConfigurationOption.MAX_CONNECTIONS);
- this.monitoringOptions = resolveHttpMonitoringOptions(builder.connectionHealthConfiguration).orElse(null);
- this.maxConnectionIdleInMilliseconds = config.get(SdkHttpConfigurationOption.CONNECTION_MAX_IDLE_TIMEOUT).toMillis();
- this.proxyOptions = resolveProxy(builder.proxyConfiguration, tlsContext).orElse(null);
- }
+ private AwsCrtAsyncHttpClient(DefaultAsyncBuilder builder, AttributeMap config) {
+ super(builder, config);
}
- /**
- * Marks a Native CrtResource as owned by the current Java Object.
- *
- * @param subresource The Resource to own.
- * @param The CrtResource Type
- * @return The CrtResource passed in
- */
- private T registerOwnedResource(T subresource) {
- if (subresource != null) {
- subresource.addRef();
- ownedSubResources.push(subresource);
- }
- return subresource;
- }
-
- public static Builder builder() {
- return new DefaultBuilder();
+ public static AwsCrtAsyncHttpClient.Builder builder() {
+ return new DefaultAsyncBuilder();
}
/**
@@ -138,57 +62,12 @@ public static Builder builder() {
* @return an {@link SdkAsyncHttpClient}
*/
public static SdkAsyncHttpClient create() {
- return new DefaultBuilder().build();
+ return new DefaultAsyncBuilder().build();
}
@Override
public String clientName() {
- return AWS_COMMON_RUNTIME;
- }
-
- private HttpClientConnectionManager createConnectionPool(URI uri) {
- log.debug(() -> "Creating ConnectionPool for: URI:" + uri + ", MaxConns: " + maxConnectionsPerEndpoint);
-
- HttpClientConnectionManagerOptions options = new HttpClientConnectionManagerOptions()
- .withClientBootstrap(bootstrap)
- .withSocketOptions(socketOptions)
- .withTlsContext(tlsContext)
- .withUri(uri)
- .withWindowSize(readBufferSize)
- .withMaxConnections(maxConnectionsPerEndpoint)
- .withManualWindowManagement(true)
- .withProxyOptions(proxyOptions)
- .withMonitoringOptions(monitoringOptions)
- .withMaxConnectionIdleInMilliseconds(maxConnectionIdleInMilliseconds);
-
- return HttpClientConnectionManager.create(options);
- }
-
- /*
- * Callers of this function MUST account for the addRef() on the pool before returning.
- * Every execution path consuming the return value must guarantee an associated close().
- * Currently this function is only used by execute(), which guarantees a matching close
- * via the try-with-resources block.
- *
- * This guarantees that a returned pool will not get closed (by closing the http client) during
- * the time it takes to submit a request to the pool. Acquisition requests submitted to the pool will
- * be properly failed if the http client is closed before the acquisition completes.
- *
- * This additional complexity means we only have to keep a lock for the scope of this function, as opposed to
- * the scope of calling execute(). This function will almost always just be a hash lookup and the return of an
- * existing pool. If we add all of execute() to the scope, we include, at minimum a JNI call to the native
- * pool implementation.
- */
- private HttpClientConnectionManager getOrCreateConnectionPool(URI uri) {
- synchronized (this) {
- if (isClosed) {
- throw new IllegalStateException("Client is closed. No more requests can be made with this client.");
- }
-
- HttpClientConnectionManager connPool = connectionPools.computeIfAbsent(uri, this::createConnectionPool);
- connPool.addRef();
- return connPool;
- }
+ return super.clientName();
}
@Override
@@ -200,7 +79,6 @@ public CompletableFuture execute(AsyncExecuteRequest asyncRequest) {
paramNotNull(asyncRequest.responseHandler(), "ResponseHandler");
asyncRequest.metricCollector()
- .filter(metricCollector -> !(metricCollector instanceof NoOpMetricCollector))
.ifPresent(metricCollector -> metricCollector.reportMetric(HTTP_CLIENT_NAME, clientName()));
/*
@@ -213,39 +91,17 @@ public CompletableFuture execute(AsyncExecuteRequest asyncRequest) {
* we have a pool and no one can destroy it underneath us until we've finished submitting the
* request)
*/
- try (HttpClientConnectionManager crtConnPool = getOrCreateConnectionPool(poolKey(asyncRequest))) {
- CrtRequestContext context = CrtRequestContext.builder()
- .crtConnPool(crtConnPool)
- .readBufferSize(readBufferSize)
- .request(asyncRequest)
- .build();
+ try (HttpClientConnectionManager crtConnPool = getOrCreateConnectionPool(poolKey(asyncRequest.request()))) {
+ CrtAsyncRequestContext context = CrtAsyncRequestContext.builder()
+ .crtConnPool(crtConnPool)
+ .readBufferSize(this.readBufferSize)
+ .request(asyncRequest)
+ .build();
return new CrtRequestExecutor().execute(context);
}
}
- private URI poolKey(AsyncExecuteRequest asyncRequest) {
- SdkHttpRequest sdkRequest = asyncRequest.request();
- return invokeSafely(() -> new URI(sdkRequest.protocol(), null, sdkRequest.host(),
- sdkRequest.port(), null, null, null));
- }
-
- @Override
- public void close() {
- synchronized (this) {
-
- if (isClosed) {
- return;
- }
-
- connectionPools.values().forEach(pool -> IoUtils.closeQuietly(pool, log.logger()));
- ownedSubResources.forEach(r -> IoUtils.closeQuietly(r, log.logger()));
- ownedSubResources.clear();
-
- isClosed = true;
- }
- }
-
/**
* Builder that allows configuration of the AWS CRT HTTP implementation.
*/
@@ -256,7 +112,7 @@ public interface Builder extends SdkAsyncHttpClient.Builder proxyConfigurationBuilderConsumer);
+ AwsCrtAsyncHttpClient.Builder proxyConfiguration(Consumer proxyConfigurationBuilderConsumer);
/**
* Configure the health checks for all connections established by this client.
@@ -299,7 +155,7 @@ public interface Builder extends SdkAsyncHttpClient.Builder
+ AwsCrtAsyncHttpClient.Builder connectionHealthConfiguration(Consumer
healthChecksConfigurationBuilder);
/**
@@ -317,14 +173,14 @@ Builder connectionHealthConfiguration(Consumer
+ AwsCrtAsyncHttpClient.Builder tcpKeepAliveConfiguration(Consumer
tcpKeepAliveConfigurationBuilder);
/**
@@ -369,110 +225,27 @@ Builder tcpKeepAliveConfiguration(Consumer
* @param postQuantumTlsEnabled whether to prefer Post Quantum TLS
* @return The builder of the method chaining.
*/
- Builder postQuantumTlsEnabled(Boolean postQuantumTlsEnabled);
+ AwsCrtAsyncHttpClient.Builder postQuantumTlsEnabled(Boolean postQuantumTlsEnabled);
}
/**
* Factory that allows more advanced configuration of the AWS CRT HTTP implementation. Use {@link #builder()} to
* configure and construct an immutable instance of the factory.
*/
- private static final class DefaultBuilder implements Builder {
- private final AttributeMap.Builder standardOptions = AttributeMap.builder();
- private Long readBufferSize;
- private ProxyConfiguration proxyConfiguration;
- private ConnectionHealthConfiguration connectionHealthConfiguration;
- private TcpKeepAliveConfiguration tcpKeepAliveConfiguration;
- private Boolean postQuantumTlsEnabled;
-
- private DefaultBuilder() {
- }
+ private static final class DefaultAsyncBuilder
+ extends AwsCrtClientBuilderBase implements Builder {
@Override
public SdkAsyncHttpClient build() {
- return new AwsCrtAsyncHttpClient(this, standardOptions.build()
- .merge(SdkHttpConfigurationOption.GLOBAL_HTTP_DEFAULTS));
+ return new AwsCrtAsyncHttpClient(this, getAttributeMap().build()
+ .merge(SdkHttpConfigurationOption.GLOBAL_HTTP_DEFAULTS));
}
@Override
public SdkAsyncHttpClient buildWithDefaults(AttributeMap serviceDefaults) {
- return new AwsCrtAsyncHttpClient(this, standardOptions.build()
- .merge(serviceDefaults)
- .merge(SdkHttpConfigurationOption.GLOBAL_HTTP_DEFAULTS));
- }
-
- @Override
- public Builder maxConcurrency(Integer maxConcurrency) {
- Validate.isPositiveOrNull(maxConcurrency, "maxConcurrency");
- standardOptions.put(SdkHttpConfigurationOption.MAX_CONNECTIONS, maxConcurrency);
- return this;
- }
-
- @Override
- public Builder readBufferSizeInBytes(Long readBufferSize) {
- Validate.isPositiveOrNull(readBufferSize, "readBufferSize");
- this.readBufferSize = readBufferSize;
- return this;
- }
-
- @Override
- public Builder proxyConfiguration(ProxyConfiguration proxyConfiguration) {
- this.proxyConfiguration = proxyConfiguration;
- return this;
- }
-
- @Override
- public Builder connectionHealthConfiguration(ConnectionHealthConfiguration monitoringOptions) {
- this.connectionHealthConfiguration = monitoringOptions;
- return this;
- }
-
- @Override
- public Builder connectionHealthConfiguration(Consumer
- configurationBuilder) {
- ConnectionHealthConfiguration.Builder builder = ConnectionHealthConfiguration.builder();
- configurationBuilder.accept(builder);
- return connectionHealthConfiguration(builder.build());
- }
-
- @Override
- public Builder connectionMaxIdleTime(Duration connectionMaxIdleTime) {
- Validate.isPositive(connectionMaxIdleTime, "connectionMaxIdleTime");
- standardOptions.put(SdkHttpConfigurationOption.CONNECTION_MAX_IDLE_TIMEOUT, connectionMaxIdleTime);
- return this;
- }
-
- @Override
- public Builder connectionTimeout(Duration connectionTimeout) {
- Validate.isPositive(connectionTimeout, "connectionTimeout");
- standardOptions.put(SdkHttpConfigurationOption.CONNECTION_TIMEOUT, connectionTimeout);
- return this;
- }
-
- @Override
- public Builder tcpKeepAliveConfiguration(TcpKeepAliveConfiguration tcpKeepAliveConfiguration) {
- this.tcpKeepAliveConfiguration = tcpKeepAliveConfiguration;
- return this;
- }
-
- @Override
- public Builder tcpKeepAliveConfiguration(Consumer
- tcpKeepAliveConfigurationBuilder) {
- TcpKeepAliveConfiguration.Builder builder = TcpKeepAliveConfiguration.builder();
- tcpKeepAliveConfigurationBuilder.accept(builder);
- return tcpKeepAliveConfiguration(builder.build());
- }
-
- @Override
- public Builder postQuantumTlsEnabled(Boolean postQuantumTlsEnabled) {
- this.postQuantumTlsEnabled = postQuantumTlsEnabled;
- return this;
- }
-
- @Override
- public Builder proxyConfiguration(Consumer proxyConfigurationBuilderConsumer) {
- ProxyConfiguration.Builder builder = ProxyConfiguration.builder();
- proxyConfigurationBuilderConsumer.accept(builder);
- return proxyConfiguration(builder.build());
+ return new AwsCrtAsyncHttpClient(this, getAttributeMap().build()
+ .merge(serviceDefaults)
+ .merge(SdkHttpConfigurationOption.GLOBAL_HTTP_DEFAULTS));
}
}
}
diff --git a/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/AwsCrtHttpClient.java b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/AwsCrtHttpClient.java
new file mode 100644
index 000000000000..3ee178abeb9a
--- /dev/null
+++ b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/AwsCrtHttpClient.java
@@ -0,0 +1,292 @@
+/*
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://aws.amazon.com/apache2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package software.amazon.awssdk.http.crt;
+
+import static software.amazon.awssdk.http.HttpMetric.HTTP_CLIENT_NAME;
+
+import java.io.IOException;
+import java.time.Duration;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.CompletionException;
+import java.util.function.Consumer;
+import software.amazon.awssdk.annotations.SdkPublicApi;
+import software.amazon.awssdk.crt.http.HttpClientConnectionManager;
+import software.amazon.awssdk.crt.http.HttpException;
+import software.amazon.awssdk.http.ExecutableHttpRequest;
+import software.amazon.awssdk.http.HttpExecuteRequest;
+import software.amazon.awssdk.http.HttpExecuteResponse;
+import software.amazon.awssdk.http.SdkHttpClient;
+import software.amazon.awssdk.http.SdkHttpConfigurationOption;
+import software.amazon.awssdk.http.SdkHttpFullResponse;
+import software.amazon.awssdk.http.crt.internal.AwsCrtClientBuilderBase;
+import software.amazon.awssdk.http.crt.internal.CrtRequestContext;
+import software.amazon.awssdk.http.crt.internal.CrtRequestExecutor;
+import software.amazon.awssdk.utils.AttributeMap;
+import software.amazon.awssdk.utils.CompletableFutureUtils;
+
+/**
+ * An implementation of {@link SdkHttpClient} that uses the AWS Common Runtime (CRT) Http Client to communicate with
+ * Http Web Services. This client has a synchronous interface, but uses non-blocking IO.
+ *
+ * This can be created via {@link #builder()}
+ * {@snippet :
+ * SdkHttpClient client = AwsCrtHttpClient.builder()
+ * .maxConcurrency(100)
+ * .connectionTimeout(Duration.ofSeconds(1))
+ * .connectionMaxIdleTime(Duration.ofSeconds(5))
+ * .build();
+ *}
+ *
+ */
+@SdkPublicApi
+public final class AwsCrtHttpClient extends AwsCrtHttpClientBase implements SdkHttpClient {
+
+ private AwsCrtHttpClient(DefaultBuilder builder, AttributeMap config) {
+ super(builder, config);
+ }
+
+ public static AwsCrtHttpClient.Builder builder() {
+ return new DefaultBuilder();
+ }
+
+ /**
+ * Create a {@link AwsCrtHttpClient} client with the default configuration
+ *
+ * @return an {@link SdkHttpClient}
+ */
+ public static SdkHttpClient create() {
+ return new DefaultBuilder().build();
+ }
+
+ @Override
+ public String clientName() {
+ return super.clientName();
+ }
+
+ @Override
+ public ExecutableHttpRequest prepareRequest(HttpExecuteRequest request) {
+ request.metricCollector()
+ .ifPresent(metricCollector -> metricCollector.reportMetric(HTTP_CLIENT_NAME, clientName()));
+
+ /*
+ * See the note on getOrCreateConnectionPool()
+ *
+ * In particular, this returns a ref-counted object and calling getOrCreateConnectionPool
+ * increments the ref count by one. We add a try-with-resources to release our ref
+ * once we have successfully submitted a request. In this way, we avoid a race condition
+ * when close/shutdown is called from another thread while this function is executing (i.e.
+ * we have a pool and no one can destroy it underneath us until we've finished submitting the
+ * request)
+ */
+ try (HttpClientConnectionManager crtConnPool = getOrCreateConnectionPool(poolKey(request.httpRequest()))) {
+ CrtRequestContext context = CrtRequestContext.builder()
+ .crtConnPool(crtConnPool)
+ .readBufferSize(this.readBufferSize)
+ .request(request)
+ .build();
+ return new CrtHttpRequest(context);
+ }
+ }
+
+ private static final class CrtHttpRequest implements ExecutableHttpRequest {
+ private final CrtRequestContext context;
+ private volatile CompletableFuture responseFuture;
+
+ private CrtHttpRequest(CrtRequestContext context) {
+ this.context = context;
+ }
+
+ @Override
+ public HttpExecuteResponse call() throws IOException {
+ HttpExecuteResponse.Builder builder = HttpExecuteResponse.builder();
+
+ try {
+ responseFuture = new CrtRequestExecutor().execute(context);
+ SdkHttpFullResponse response = CompletableFutureUtils.joinInterruptibly(responseFuture);
+ builder.response(response);
+ builder.responseBody(response.content().orElse(null));
+ return builder.build();
+ } catch (CompletionException e) {
+ Throwable cause = e.getCause();
+ if (cause instanceof IOException) {
+ throw (IOException) cause;
+ }
+
+ if (cause instanceof HttpException) {
+ throw (HttpException) cause;
+ }
+
+ throw new RuntimeException(e.getCause());
+ }
+ }
+
+ @Override
+ public void abort() {
+ if (responseFuture != null) {
+ responseFuture.cancel(true);
+ }
+ }
+ }
+
+ /**
+ * Builder that allows configuration of the AWS CRT HTTP implementation.
+ */
+ public interface Builder extends SdkHttpClient.Builder {
+
+ /**
+ * The Maximum number of allowed concurrent requests. For HTTP/1.1 this is the same as max connections.
+ * @param maxConcurrency maximum concurrency per endpoint
+ * @return The builder of the method chaining.
+ */
+ AwsCrtHttpClient.Builder maxConcurrency(Integer maxConcurrency);
+
+ /**
+ * Configures the number of unread bytes that can be buffered in the
+ * client before we stop reading from the underlying TCP socket and wait for the Subscriber
+ * to read more data.
+ *
+ * @param readBufferSize The number of bytes that can be buffered.
+ * @return The builder of the method chaining.
+ */
+ AwsCrtHttpClient.Builder readBufferSizeInBytes(Long readBufferSize);
+
+ /**
+ * Sets the http proxy configuration to use for this client.
+ * @param proxyConfiguration The http proxy configuration to use
+ * @return The builder of the method chaining.
+ */
+ AwsCrtHttpClient.Builder proxyConfiguration(ProxyConfiguration proxyConfiguration);
+
+ /**
+ * Sets the http proxy configuration to use for this client.
+ *
+ * @param proxyConfigurationBuilderConsumer The consumer of the proxy configuration builder object.
+ * @return the builder for method chaining.
+ */
+ AwsCrtHttpClient.Builder proxyConfiguration(Consumer proxyConfigurationBuilderConsumer);
+
+ /**
+ * Configure the health checks for all connections established by this client.
+ *
+ *
+ * You can set a throughput threshold for a connection to be considered healthy.
+ * If a connection falls below this threshold ({@link ConnectionHealthConfiguration#minimumThroughputInBps()
+ * }) for the configurable amount
+ * of time ({@link ConnectionHealthConfiguration#minimumThroughputTimeout()}),
+ * then the connection is considered unhealthy and will be shut down.
+ *
+ *
+ * By default, monitoring options are disabled. You can enable {@code healthChecks} by providing this configuration
+ * and specifying the options for monitoring for the connection manager.
+ * @param healthChecksConfiguration The health checks config to use
+ * @return The builder of the method chaining.
+ */
+ AwsCrtHttpClient.Builder connectionHealthConfiguration(ConnectionHealthConfiguration healthChecksConfiguration);
+
+ /**
+ * A convenience method that creates an instance of the {@link ConnectionHealthConfiguration} builder, avoiding the
+ * need to create one manually via {@link ConnectionHealthConfiguration#builder()}.
+ *
+ * @param healthChecksConfigurationBuilder The health checks config builder to use
+ * @return The builder of the method chaining.
+ * @see #connectionHealthConfiguration(ConnectionHealthConfiguration)
+ */
+ AwsCrtHttpClient.Builder connectionHealthConfiguration(Consumer
+ healthChecksConfigurationBuilder);
+
+ /**
+ * Configure the maximum amount of time that a connection should be allowed to remain open while idle.
+ * @param connectionMaxIdleTime the maximum amount of connection idle time
+ * @return The builder of the method chaining.
+ */
+ AwsCrtHttpClient.Builder connectionMaxIdleTime(Duration connectionMaxIdleTime);
+
+ /**
+ * The amount of time to wait when initially establishing a connection before giving up and timing out.
+ * @param connectionTimeout timeout
+ * @return The builder of the method chaining.
+ */
+ AwsCrtHttpClient.Builder connectionTimeout(Duration connectionTimeout);
+
+ /**
+ * Configure whether to enable {@code tcpKeepAlive} and relevant configuration for all connections established by this
+ * client.
+ *
+ *
+ * By default, tcpKeepAlive is disabled. You can enable {@code tcpKeepAlive} by providing this configuration
+ * and specifying periodic TCP keepalive packet intervals and timeouts. This may be required for certain connections for
+ * longer durations than default socket timeouts.
+ *
+ * @param tcpKeepAliveConfiguration The TCP keep-alive configuration to use
+ * @return The builder of the method chaining.
+ */
+ AwsCrtHttpClient.Builder tcpKeepAliveConfiguration(TcpKeepAliveConfiguration tcpKeepAliveConfiguration);
+
+ /**
+ * Configure whether to enable {@code tcpKeepAlive} and relevant configuration for all connections established by this
+ * client.
+ *
+ *
+ * A convenience method that creates an instance of the {@link TcpKeepAliveConfiguration} builder, avoiding the
+ * need to create one manually via {@link TcpKeepAliveConfiguration#builder()}.
+ *
+ * @param tcpKeepAliveConfigurationBuilder The TCP keep-alive configuration builder to use
+ * @return The builder of the method chaining.
+ * @see #tcpKeepAliveConfiguration(TcpKeepAliveConfiguration)
+ */
+ AwsCrtHttpClient.Builder tcpKeepAliveConfiguration(Consumer
+ tcpKeepAliveConfigurationBuilder);
+
+ /**
+ * Configure whether to enable a hybrid post-quantum key exchange option for the Transport Layer Security (TLS) network
+ * encryption protocol when communicating with services that support Post Quantum TLS. If Post Quantum cipher suites are
+ * not supported on the platform, the SDK will use the default TLS cipher suites.
+ *
+ *
+ * See Using hybrid post-quantum TLS with AWS KMS
+ *
+ *
+ * It's disabled by default.
+ *
+ * @param postQuantumTlsEnabled whether to prefer Post Quantum TLS
+ * @return The builder of the method chaining.
+ */
+ AwsCrtHttpClient.Builder postQuantumTlsEnabled(Boolean postQuantumTlsEnabled);
+ }
+
+ /**
+ * Factory that allows more advanced configuration of the AWS CRT HTTP implementation.
+ * Use {@link #builder()} to configure and construct an immutable instance of the factory.
+ */
+ private static final class DefaultBuilder
+ extends AwsCrtClientBuilderBase implements AwsCrtHttpClient.Builder {
+
+
+ @Override
+ public AwsCrtHttpClient build() {
+ return new AwsCrtHttpClient(this, getAttributeMap().build()
+ .merge(SdkHttpConfigurationOption.GLOBAL_HTTP_DEFAULTS));
+ }
+
+ @Override
+ public AwsCrtHttpClient buildWithDefaults(AttributeMap serviceDefaults) {
+ return new AwsCrtHttpClient(this, getAttributeMap().build()
+ .merge(serviceDefaults)
+ .merge(SdkHttpConfigurationOption.GLOBAL_HTTP_DEFAULTS));
+ }
+ }
+
+}
diff --git a/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/AwsCrtHttpClientBase.java b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/AwsCrtHttpClientBase.java
new file mode 100644
index 000000000000..4ae9f93c1955
--- /dev/null
+++ b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/AwsCrtHttpClientBase.java
@@ -0,0 +1,181 @@
+/*
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://aws.amazon.com/apache2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package software.amazon.awssdk.http.crt;
+
+import static software.amazon.awssdk.crtcore.CrtConfigurationUtils.resolveHttpMonitoringOptions;
+import static software.amazon.awssdk.crtcore.CrtConfigurationUtils.resolveProxy;
+import static software.amazon.awssdk.http.SdkHttpConfigurationOption.PROTOCOL;
+import static software.amazon.awssdk.http.crt.internal.AwsCrtConfigurationUtils.buildSocketOptions;
+import static software.amazon.awssdk.http.crt.internal.AwsCrtConfigurationUtils.resolveCipherPreference;
+import static software.amazon.awssdk.utils.FunctionalUtils.invokeSafely;
+
+import java.net.URI;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import software.amazon.awssdk.annotations.SdkProtectedApi;
+import software.amazon.awssdk.crt.CrtResource;
+import software.amazon.awssdk.crt.http.HttpClientConnectionManager;
+import software.amazon.awssdk.crt.http.HttpClientConnectionManagerOptions;
+import software.amazon.awssdk.crt.http.HttpMonitoringOptions;
+import software.amazon.awssdk.crt.http.HttpProxyOptions;
+import software.amazon.awssdk.crt.io.ClientBootstrap;
+import software.amazon.awssdk.crt.io.SocketOptions;
+import software.amazon.awssdk.crt.io.TlsContext;
+import software.amazon.awssdk.crt.io.TlsContextOptions;
+import software.amazon.awssdk.http.Protocol;
+import software.amazon.awssdk.http.SdkHttpConfigurationOption;
+import software.amazon.awssdk.http.SdkHttpRequest;
+import software.amazon.awssdk.http.crt.internal.AwsCrtClientBuilderBase;
+import software.amazon.awssdk.utils.AttributeMap;
+import software.amazon.awssdk.utils.IoUtils;
+import software.amazon.awssdk.utils.Logger;
+import software.amazon.awssdk.utils.SdkAutoCloseable;
+
+/**
+ * Common functionality and configuration for the CRT Http clients.
+ */
+@SdkProtectedApi
+abstract class AwsCrtHttpClientBase implements SdkAutoCloseable {
+ private static final Logger log = Logger.loggerFor(AwsCrtHttpClientBase.class);
+
+ private static final String AWS_COMMON_RUNTIME = "AwsCommonRuntime";
+ private static final long DEFAULT_STREAM_WINDOW_SIZE = 16L * 1024L * 1024L; // 16 MB
+
+ protected final long readBufferSize;
+ private final Map connectionPools = new ConcurrentHashMap<>();
+ private final LinkedList ownedSubResources = new LinkedList<>();
+ private final ClientBootstrap bootstrap;
+ private final SocketOptions socketOptions;
+ private final TlsContext tlsContext;
+ private final HttpProxyOptions proxyOptions;
+ private final HttpMonitoringOptions monitoringOptions;
+ private final long maxConnectionIdleInMilliseconds;
+ private final int maxConnectionsPerEndpoint;
+ private boolean isClosed = false;
+
+ AwsCrtHttpClientBase(AwsCrtClientBuilderBase builder, AttributeMap config) {
+ if (config.get(PROTOCOL) == Protocol.HTTP2) {
+ throw new UnsupportedOperationException("HTTP/2 is not supported in AwsCrtHttpClient yet. Use "
+ + "NettyNioAsyncHttpClient instead.");
+ }
+
+ try (ClientBootstrap clientBootstrap = new ClientBootstrap(null, null);
+ SocketOptions clientSocketOptions = buildSocketOptions(builder.getTcpKeepAliveConfiguration(),
+ config.get(SdkHttpConfigurationOption.CONNECTION_TIMEOUT));
+ TlsContextOptions clientTlsContextOptions =
+ TlsContextOptions.createDefaultClient()
+ .withCipherPreference(resolveCipherPreference(builder.getPostQuantumTlsEnabled()))
+ .withVerifyPeer(!config.get(SdkHttpConfigurationOption.TRUST_ALL_CERTIFICATES));
+ TlsContext clientTlsContext = new TlsContext(clientTlsContextOptions)) {
+
+ this.bootstrap = registerOwnedResource(clientBootstrap);
+ this.socketOptions = registerOwnedResource(clientSocketOptions);
+ this.tlsContext = registerOwnedResource(clientTlsContext);
+ this.readBufferSize = builder.getReadBufferSizeInBytes() == null ?
+ DEFAULT_STREAM_WINDOW_SIZE : builder.getReadBufferSizeInBytes();
+ this.maxConnectionsPerEndpoint = config.get(SdkHttpConfigurationOption.MAX_CONNECTIONS);
+ this.monitoringOptions = resolveHttpMonitoringOptions(builder.getConnectionHealthConfiguration()).orElse(null);
+ this.maxConnectionIdleInMilliseconds = config.get(SdkHttpConfigurationOption.CONNECTION_MAX_IDLE_TIMEOUT).toMillis();
+ this.proxyOptions = resolveProxy(builder.getProxyConfiguration(), tlsContext).orElse(null);
+ }
+ }
+
+ /**
+ * Marks a Native CrtResource as owned by the current Java Object.
+ *
+ * @param subresource The Resource to own.
+ * @param The CrtResource Type
+ * @return The CrtResource passed in
+ */
+ private T registerOwnedResource(T subresource) {
+ if (subresource != null) {
+ subresource.addRef();
+ ownedSubResources.push(subresource);
+ }
+ return subresource;
+ }
+
+ String clientName() {
+ return AWS_COMMON_RUNTIME;
+ }
+
+ private HttpClientConnectionManager createConnectionPool(URI uri) {
+ log.debug(() -> "Creating ConnectionPool for: URI:" + uri + ", MaxConns: " + maxConnectionsPerEndpoint);
+
+ HttpClientConnectionManagerOptions options = new HttpClientConnectionManagerOptions()
+ .withClientBootstrap(bootstrap)
+ .withSocketOptions(socketOptions)
+ .withTlsContext(tlsContext)
+ .withUri(uri)
+ .withWindowSize(readBufferSize)
+ .withMaxConnections(maxConnectionsPerEndpoint)
+ .withManualWindowManagement(true)
+ .withProxyOptions(proxyOptions)
+ .withMonitoringOptions(monitoringOptions)
+ .withMaxConnectionIdleInMilliseconds(maxConnectionIdleInMilliseconds);
+
+ return HttpClientConnectionManager.create(options);
+ }
+
+ /*
+ * Callers of this function MUST account for the addRef() on the pool before returning.
+ * Every execution path consuming the return value must guarantee an associated close().
+ * Currently, this function is only used by execute(), which guarantees a matching close
+ * via the try-with-resources block.
+ *
+ * This guarantees that a returned pool will not get closed (by closing the http client) during
+ * the time it takes to submit a request to the pool. Acquisition requests submitted to the pool will
+ * be properly failed if the http client is closed before the acquisition completes.
+ *
+ * This additional complexity means we only have to keep a lock for the scope of this function, as opposed to
+ * the scope of calling execute(). This function will almost always just be a hash lookup and the return of an
+ * existing pool. If we add all of execute() to the scope, we include, at minimum a JNI call to the native
+ * pool implementation.
+ */
+ HttpClientConnectionManager getOrCreateConnectionPool(URI uri) {
+ synchronized (this) {
+ if (isClosed) {
+ throw new IllegalStateException("Client is closed. No more requests can be made with this client.");
+ }
+
+ HttpClientConnectionManager connPool = connectionPools.computeIfAbsent(uri, this::createConnectionPool);
+ connPool.addRef();
+ return connPool;
+ }
+ }
+
+ URI poolKey(SdkHttpRequest sdkRequest) {
+ return invokeSafely(() -> new URI(sdkRequest.protocol(), null, sdkRequest.host(),
+ sdkRequest.port(), null, null, null));
+ }
+
+ @Override
+ public void close() {
+ synchronized (this) {
+
+ if (isClosed) {
+ return;
+ }
+
+ connectionPools.values().forEach(pool -> IoUtils.closeQuietly(pool, log.logger()));
+ ownedSubResources.forEach(r -> IoUtils.closeQuietly(r, log.logger()));
+ ownedSubResources.clear();
+
+ isClosed = true;
+ }
+ }
+}
diff --git a/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/AwsCrtSdkHttpService.java b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/AwsCrtSdkHttpService.java
index b94946e49de8..c38d1fe06deb 100644
--- a/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/AwsCrtSdkHttpService.java
+++ b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/AwsCrtSdkHttpService.java
@@ -16,7 +16,7 @@
package software.amazon.awssdk.http.crt;
import software.amazon.awssdk.annotations.SdkPublicApi;
-import software.amazon.awssdk.http.async.SdkAsyncHttpClient;
+import software.amazon.awssdk.http.SdkHttpService;
import software.amazon.awssdk.http.async.SdkAsyncHttpService;
/**
@@ -25,9 +25,14 @@
*
*/
@SdkPublicApi
-public class AwsCrtSdkHttpService implements SdkAsyncHttpService {
+public class AwsCrtSdkHttpService implements SdkAsyncHttpService, SdkHttpService {
@Override
- public SdkAsyncHttpClient.Builder createAsyncHttpClientFactory() {
+ public AwsCrtAsyncHttpClient.Builder createAsyncHttpClientFactory() {
return AwsCrtAsyncHttpClient.builder();
}
+
+ @Override
+ public AwsCrtHttpClient.Builder createHttpClientBuilder() {
+ return AwsCrtHttpClient.builder();
+ }
}
diff --git a/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/AwsCrtClientBuilderBase.java b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/AwsCrtClientBuilderBase.java
new file mode 100644
index 000000000000..5fb70b7e2512
--- /dev/null
+++ b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/AwsCrtClientBuilderBase.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://aws.amazon.com/apache2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package software.amazon.awssdk.http.crt.internal;
+
+import java.time.Duration;
+import java.util.function.Consumer;
+import software.amazon.awssdk.annotations.SdkInternalApi;
+import software.amazon.awssdk.http.SdkHttpConfigurationOption;
+import software.amazon.awssdk.http.crt.ConnectionHealthConfiguration;
+import software.amazon.awssdk.http.crt.ProxyConfiguration;
+import software.amazon.awssdk.http.crt.TcpKeepAliveConfiguration;
+import software.amazon.awssdk.utils.AttributeMap;
+import software.amazon.awssdk.utils.Validate;
+
+@SdkInternalApi
+public class AwsCrtClientBuilderBase {
+ private final AttributeMap.Builder standardOptions = AttributeMap.builder();
+ private Long readBufferSize;
+ private ProxyConfiguration proxyConfiguration;
+ private ConnectionHealthConfiguration connectionHealthConfiguration;
+ private TcpKeepAliveConfiguration tcpKeepAliveConfiguration;
+ private Boolean postQuantumTlsEnabled;
+
+ protected AwsCrtClientBuilderBase() {
+ }
+
+ protected AttributeMap.Builder getAttributeMap() {
+ return standardOptions;
+ }
+
+ private BuilderT thisBuilder() {
+ return (BuilderT) this;
+ }
+
+ public BuilderT maxConcurrency(Integer maxConcurrency) {
+ Validate.isPositiveOrNull(maxConcurrency, "maxConcurrency");
+ standardOptions.put(SdkHttpConfigurationOption.MAX_CONNECTIONS, maxConcurrency);
+ return thisBuilder();
+ }
+
+ public BuilderT readBufferSizeInBytes(Long readBufferSize) {
+ Validate.isPositiveOrNull(readBufferSize, "readBufferSize");
+ this.readBufferSize = readBufferSize;
+ return thisBuilder();
+ }
+
+ public Long getReadBufferSizeInBytes() {
+ return this.readBufferSize;
+ }
+
+
+ public BuilderT proxyConfiguration(ProxyConfiguration proxyConfiguration) {
+ this.proxyConfiguration = proxyConfiguration;
+ return thisBuilder();
+ }
+
+ public ProxyConfiguration getProxyConfiguration() {
+ return this.proxyConfiguration;
+ }
+
+ public BuilderT connectionHealthConfiguration(ConnectionHealthConfiguration monitoringOptions) {
+ this.connectionHealthConfiguration = monitoringOptions;
+ return thisBuilder();
+ }
+
+ public ConnectionHealthConfiguration getConnectionHealthConfiguration() {
+ return this.connectionHealthConfiguration;
+ }
+
+ public BuilderT connectionHealthConfiguration(Consumer
+ configurationBuilder) {
+ ConnectionHealthConfiguration.Builder builder = ConnectionHealthConfiguration.builder();
+ configurationBuilder.accept(builder);
+ connectionHealthConfiguration(builder.build());
+ return thisBuilder();
+ }
+
+ public BuilderT connectionMaxIdleTime(Duration connectionMaxIdleTime) {
+ Validate.isPositive(connectionMaxIdleTime, "connectionMaxIdleTime");
+ standardOptions.put(SdkHttpConfigurationOption.CONNECTION_MAX_IDLE_TIMEOUT, connectionMaxIdleTime);
+ return thisBuilder();
+ }
+
+ public BuilderT connectionTimeout(Duration connectionTimeout) {
+ Validate.isPositive(connectionTimeout, "connectionTimeout");
+ standardOptions.put(SdkHttpConfigurationOption.CONNECTION_TIMEOUT, connectionTimeout);
+ return thisBuilder();
+ }
+
+ public BuilderT tcpKeepAliveConfiguration(TcpKeepAliveConfiguration tcpKeepAliveConfiguration) {
+ this.tcpKeepAliveConfiguration = tcpKeepAliveConfiguration;
+ return thisBuilder();
+ }
+
+ public TcpKeepAliveConfiguration getTcpKeepAliveConfiguration() {
+ return this.tcpKeepAliveConfiguration;
+ }
+
+ public BuilderT tcpKeepAliveConfiguration(Consumer
+ tcpKeepAliveConfigurationBuilder) {
+ TcpKeepAliveConfiguration.Builder builder = TcpKeepAliveConfiguration.builder();
+ tcpKeepAliveConfigurationBuilder.accept(builder);
+ tcpKeepAliveConfiguration(builder.build());
+ return thisBuilder();
+ }
+
+ public BuilderT postQuantumTlsEnabled(Boolean postQuantumTlsEnabled) {
+ this.postQuantumTlsEnabled = postQuantumTlsEnabled;
+ return thisBuilder();
+ }
+
+ public Boolean getPostQuantumTlsEnabled() {
+ return this.postQuantumTlsEnabled;
+ }
+
+ public BuilderT proxyConfiguration(Consumer proxyConfigurationBuilderConsumer) {
+ ProxyConfiguration.Builder builder = ProxyConfiguration.builder();
+ proxyConfigurationBuilderConsumer.accept(builder);
+ proxyConfiguration(builder.build());
+ return thisBuilder();
+ }
+}
\ No newline at end of file
diff --git a/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/CrtAsyncRequestContext.java b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/CrtAsyncRequestContext.java
new file mode 100644
index 000000000000..69db7cb3c5b9
--- /dev/null
+++ b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/CrtAsyncRequestContext.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://aws.amazon.com/apache2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package software.amazon.awssdk.http.crt.internal;
+
+import software.amazon.awssdk.annotations.SdkInternalApi;
+import software.amazon.awssdk.crt.http.HttpClientConnectionManager;
+import software.amazon.awssdk.http.async.AsyncExecuteRequest;
+import software.amazon.awssdk.metrics.MetricCollector;
+
+@SdkInternalApi
+public final class CrtAsyncRequestContext {
+ private final AsyncExecuteRequest request;
+ private final long readBufferSize;
+ private final HttpClientConnectionManager crtConnPool;
+ private final MetricCollector metricCollector;
+
+ private CrtAsyncRequestContext(Builder builder) {
+ this.request = builder.request;
+ this.readBufferSize = builder.readBufferSize;
+ this.crtConnPool = builder.crtConnPool;
+ this.metricCollector = request.metricCollector().orElse(null);
+ }
+
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ public AsyncExecuteRequest sdkRequest() {
+ return request;
+ }
+
+ public long readBufferSize() {
+ return readBufferSize;
+ }
+
+ public HttpClientConnectionManager crtConnPool() {
+ return crtConnPool;
+ }
+
+ public MetricCollector metricCollector() {
+ return metricCollector;
+ }
+
+ public static final class Builder {
+ private AsyncExecuteRequest request;
+ private long readBufferSize;
+ private HttpClientConnectionManager crtConnPool;
+
+ private Builder() {
+ }
+
+ public Builder request(AsyncExecuteRequest request) {
+ this.request = request;
+ return this;
+ }
+
+ public Builder readBufferSize(long readBufferSize) {
+ this.readBufferSize = readBufferSize;
+ return this;
+ }
+
+ public Builder crtConnPool(HttpClientConnectionManager crtConnPool) {
+ this.crtConnPool = crtConnPool;
+ return this;
+ }
+
+ public CrtAsyncRequestContext build() {
+ return new CrtAsyncRequestContext(this);
+ }
+ }
+}
diff --git a/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/CrtRequestContext.java b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/CrtRequestContext.java
index 26e6d3556e4c..420f12e31f44 100644
--- a/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/CrtRequestContext.java
+++ b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/CrtRequestContext.java
@@ -17,12 +17,12 @@
import software.amazon.awssdk.annotations.SdkInternalApi;
import software.amazon.awssdk.crt.http.HttpClientConnectionManager;
-import software.amazon.awssdk.http.async.AsyncExecuteRequest;
+import software.amazon.awssdk.http.HttpExecuteRequest;
import software.amazon.awssdk.metrics.MetricCollector;
@SdkInternalApi
public final class CrtRequestContext {
- private final AsyncExecuteRequest request;
+ private final HttpExecuteRequest request;
private final long readBufferSize;
private final HttpClientConnectionManager crtConnPool;
private final MetricCollector metricCollector;
@@ -38,7 +38,7 @@ public static Builder builder() {
return new Builder();
}
- public AsyncExecuteRequest sdkRequest() {
+ public HttpExecuteRequest sdkRequest() {
return request;
}
@@ -54,15 +54,15 @@ public MetricCollector metricCollector() {
return metricCollector;
}
- public static class Builder {
- private AsyncExecuteRequest request;
+ public static final class Builder {
+ private HttpExecuteRequest request;
private long readBufferSize;
private HttpClientConnectionManager crtConnPool;
private Builder() {
}
- public Builder request(AsyncExecuteRequest request) {
+ public Builder request(HttpExecuteRequest request) {
this.request = request;
return this;
}
diff --git a/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/CrtRequestExecutor.java b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/CrtRequestExecutor.java
index ad4e09bbfe9f..146233beb189 100644
--- a/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/CrtRequestExecutor.java
+++ b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/CrtRequestExecutor.java
@@ -20,11 +20,13 @@
import static software.amazon.awssdk.http.HttpMetric.LEASED_CONCURRENCY;
import static software.amazon.awssdk.http.HttpMetric.MAX_CONCURRENCY;
import static software.amazon.awssdk.http.HttpMetric.PENDING_CONCURRENCY_ACQUIRES;
+import static software.amazon.awssdk.http.crt.internal.CrtUtils.wrapWithIoExceptionIfRetryable;
import static software.amazon.awssdk.utils.NumericUtils.saturatedCast;
import java.io.IOException;
import java.time.Duration;
import java.util.concurrent.CompletableFuture;
+import javax.net.ssl.SSLHandshakeException;
import software.amazon.awssdk.annotations.SdkInternalApi;
import software.amazon.awssdk.crt.CrtRuntimeException;
import software.amazon.awssdk.crt.http.HttpClientConnection;
@@ -34,19 +36,75 @@
import software.amazon.awssdk.crt.http.HttpRequest;
import software.amazon.awssdk.crt.http.HttpStreamResponseHandler;
import software.amazon.awssdk.http.SdkCancellationException;
+import software.amazon.awssdk.http.SdkHttpFullResponse;
import software.amazon.awssdk.http.async.AsyncExecuteRequest;
import software.amazon.awssdk.http.async.SdkAsyncHttpResponseHandler;
import software.amazon.awssdk.http.crt.internal.request.CrtRequestAdapter;
import software.amazon.awssdk.http.crt.internal.response.CrtResponseAdapter;
+import software.amazon.awssdk.http.crt.internal.response.InputStreamAdaptingHttpStreamResponseHandler;
import software.amazon.awssdk.metrics.MetricCollector;
import software.amazon.awssdk.metrics.NoOpMetricCollector;
import software.amazon.awssdk.utils.Logger;
@SdkInternalApi
public final class CrtRequestExecutor {
+ public static final int CRT_TLS_NEGOTIATION_ERROR_CODE = 1029;
+
private static final Logger log = Logger.loggerFor(CrtRequestExecutor.class);
- public CompletableFuture execute(CrtRequestContext executionContext) {
+ public CompletableFuture execute(CrtRequestContext executionContext) {
+ // go ahead and get a reference to the metricCollector since multiple futures will
+ // need it regardless.
+ MetricCollector metricCollector = executionContext.metricCollector();
+ boolean shouldPublishMetrics = metricCollector != null && !(metricCollector instanceof NoOpMetricCollector);
+
+ long acquireStartTime = 0;
+
+ if (shouldPublishMetrics) {
+ // go ahead and get acquireStartTime for the concurrency timer as early as possible,
+ // so it's as accurate as possible, but only do it in a branch since clock_gettime()
+ // results in a full sys call barrier (multiple mutexes and a hw interrupt).
+ acquireStartTime = System.nanoTime();
+ }
+
+ CompletableFuture requestFuture = new CompletableFuture<>();
+
+ // When a Connection is ready from the Connection Pool, schedule the Request on the connection
+ CompletableFuture httpClientConnectionCompletableFuture =
+ executionContext.crtConnPool().acquireConnection();
+
+ long finalAcquireStartTime = acquireStartTime;
+
+ httpClientConnectionCompletableFuture.whenComplete((crtConn, throwable) -> {
+ if (shouldPublishMetrics) {
+ reportMetrics(executionContext.crtConnPool(), metricCollector, finalAcquireStartTime);
+ }
+
+ // If we didn't get a connection for some reason, fail the request
+ if (throwable != null) {
+ Throwable toThrow;
+ if (throwable instanceof HttpException) {
+ HttpException httpException = (HttpException) throwable;
+
+ if (httpException.getErrorCode() == CRT_TLS_NEGOTIATION_ERROR_CODE) {
+ toThrow = new SSLHandshakeException(httpException.getMessage());
+ } else {
+ toThrow = new IOException(httpException.getMessage(), httpException);
+ }
+ } else {
+ toThrow = new IOException("An exception occurred when acquiring a connection", throwable);
+ }
+ requestFuture.completeExceptionally(toThrow);
+ return;
+ }
+
+ executeRequest(executionContext, requestFuture, crtConn);
+ });
+
+ return requestFuture;
+ }
+
+ public CompletableFuture execute(CrtAsyncRequestContext executionContext) {
// go ahead and get a reference to the metricCollector since multiple futures will
// need it regardless.
MetricCollector metricCollector = executionContext.metricCollector();
@@ -61,7 +119,7 @@ public CompletableFuture execute(CrtRequestContext executionContext) {
acquireStartTime = System.nanoTime();
}
- CompletableFuture requestFuture = createExecutionFuture(executionContext.sdkRequest());
+ CompletableFuture requestFuture = createAsyncExecutionFuture(executionContext.sdkRequest());
// When a Connection is ready from the Connection Pool, schedule the Request on the connection
CompletableFuture httpClientConnectionCompletableFuture =
@@ -73,15 +131,21 @@ public CompletableFuture execute(CrtRequestContext executionContext) {
AsyncExecuteRequest asyncRequest = executionContext.sdkRequest();
if (shouldPublishMetrics) {
- reportMetrics(executionContext, metricCollector, finalAcquireStartTime);
+ reportMetrics(executionContext.crtConnPool(), metricCollector, finalAcquireStartTime);
}
// If we didn't get a connection for some reason, fail the request
if (throwable != null) {
- reportFailure(crtConn,
- new IOException("An exception occurred when acquiring a connection", throwable),
- requestFuture,
- asyncRequest.responseHandler());
+ Throwable toThrow = new IOException("An exception occurred when acquiring a connection", throwable);
+ if (throwable instanceof HttpException) {
+ HttpException httpException = (HttpException) throwable;
+
+ if (httpException.getErrorCode() == CRT_TLS_NEGOTIATION_ERROR_CODE) {
+ toThrow = new SSLHandshakeException(httpException.getMessage());
+ }
+ }
+
+ reportAsyncFailure(crtConn, toThrow, requestFuture, asyncRequest.responseHandler());
return;
}
@@ -91,12 +155,11 @@ public CompletableFuture execute(CrtRequestContext executionContext) {
return requestFuture;
}
- private static void reportMetrics(CrtRequestContext executionContext, MetricCollector metricCollector,
- long acquireStartTime) {
+ private static void reportMetrics(HttpClientConnectionManager connManager, MetricCollector metricCollector,
+ long acquireStartTime) {
long acquireCompletionTime = System.nanoTime();
Duration acquireTimeTaken = Duration.ofNanos(acquireCompletionTime - acquireStartTime);
metricCollector.reportMetric(CONCURRENCY_ACQUIRE_DURATION, acquireTimeTaken);
- HttpClientConnectionManager connManager = executionContext.crtConnPool();
HttpManagerMetrics managerMetrics = connManager.getManagerMetrics();
// currently this executor only handles HTTP 1.1. Until H2 is added, the max concurrency settings are 1:1 with TCP
// connections. When H2 is added, this code needs to be updated to handle stream multiplexing
@@ -106,11 +169,11 @@ private static void reportMetrics(CrtRequestContext executionContext, MetricColl
metricCollector.reportMetric(PENDING_CONCURRENCY_ACQUIRES, saturatedCast(managerMetrics.getPendingConcurrencyAcquires()));
}
- private void executeRequest(CrtRequestContext executionContext,
+ private void executeRequest(CrtAsyncRequestContext executionContext,
CompletableFuture requestFuture,
HttpClientConnection crtConn,
AsyncExecuteRequest asyncRequest) {
- HttpRequest crtRequest = CrtRequestAdapter.toCrtRequest(executionContext);
+ HttpRequest crtRequest = CrtRequestAdapter.toAsyncCrtRequest(executionContext);
HttpStreamResponseHandler crtResponseHandler =
CrtResponseAdapter.toCrtResponseHandler(crtConn, requestFuture, asyncRequest.responseHandler());
@@ -118,29 +181,46 @@ private void executeRequest(CrtRequestContext executionContext,
try {
crtConn.makeRequest(crtRequest, crtResponseHandler).activate();
} catch (HttpException e) {
- Throwable toThrow = e;
- if (HttpClientConnection.isErrorRetryable(e)) {
- // IOExceptions get retried, and if the CRT says this error is retryable,
- // it's semantically an IOException anyway.
- toThrow = new IOException(e);
- }
- reportFailure(crtConn,
+ Throwable toThrow = wrapWithIoExceptionIfRetryable(e);
+ reportAsyncFailure(crtConn,
toThrow,
requestFuture,
asyncRequest.responseHandler());
} catch (IllegalStateException | CrtRuntimeException e) {
// CRT throws IllegalStateException if the connection is closed
- reportFailure(crtConn, new IOException("An exception occurred when making the request", e),
+ reportAsyncFailure(crtConn, new IOException("An exception occurred when making the request", e),
requestFuture,
asyncRequest.responseHandler());
}
}
+ private void executeRequest(CrtRequestContext executionContext,
+ CompletableFuture requestFuture,
+ HttpClientConnection crtConn) {
+ HttpRequest crtRequest = CrtRequestAdapter.toCrtRequest(executionContext);
+
+ try {
+ HttpStreamResponseHandler crtResponseHandler = new InputStreamAdaptingHttpStreamResponseHandler(crtConn,
+ requestFuture);
+
+ // Submit the request on the connection
+ crtConn.makeRequest(crtRequest, crtResponseHandler).activate();
+ } catch (HttpException e) {
+ crtConn.close();
+
+ Throwable toThrow = wrapWithIoExceptionIfRetryable(e);
+ requestFuture.completeExceptionally(toThrow);
+ } catch (IllegalStateException | CrtRuntimeException e) {
+ crtConn.close();
+ requestFuture.completeExceptionally(e);
+ }
+ }
+
/**
* Create the execution future and set up the cancellation logic.
* @return The created execution future.
*/
- private CompletableFuture createExecutionFuture(AsyncExecuteRequest request) {
+ private CompletableFuture createAsyncExecutionFuture(AsyncExecuteRequest request) {
CompletableFuture future = new CompletableFuture<>();
future.whenComplete((r, t) -> {
@@ -160,7 +240,7 @@ private CompletableFuture createExecutionFuture(AsyncExecuteRequest reques
/**
* Notify the provided response handler and future of the failure.
*/
- private void reportFailure(HttpClientConnection crtConn,
+ private void reportAsyncFailure(HttpClientConnection crtConn,
Throwable cause,
CompletableFuture executeFuture,
SdkAsyncHttpResponseHandler responseHandler) {
diff --git a/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/CrtUtils.java b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/CrtUtils.java
new file mode 100644
index 000000000000..48405ac682aa
--- /dev/null
+++ b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/CrtUtils.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://aws.amazon.com/apache2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package software.amazon.awssdk.http.crt.internal;
+
+import java.io.IOException;
+import software.amazon.awssdk.annotations.SdkInternalApi;
+import software.amazon.awssdk.crt.http.HttpClientConnection;
+import software.amazon.awssdk.crt.http.HttpException;
+
+@SdkInternalApi
+public final class CrtUtils {
+
+ private CrtUtils() {
+ }
+
+ public static Throwable wrapWithIoExceptionIfRetryable(HttpException httpException) {
+ Throwable toThrow = httpException;
+ if (HttpClientConnection.isErrorRetryable(httpException)) {
+ // IOExceptions get retried, and if the CRT says this error is retryable,
+ // it's semantically an IOException anyway.
+ toThrow = new IOException(httpException);
+ }
+ return toThrow;
+ }
+}
diff --git a/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/request/CrtRequestAdapter.java b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/request/CrtRequestAdapter.java
index f2a221ba6997..10b658a835df 100644
--- a/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/request/CrtRequestAdapter.java
+++ b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/request/CrtRequestAdapter.java
@@ -23,8 +23,10 @@
import software.amazon.awssdk.crt.http.HttpHeader;
import software.amazon.awssdk.crt.http.HttpRequest;
import software.amazon.awssdk.http.Header;
+import software.amazon.awssdk.http.HttpExecuteRequest;
import software.amazon.awssdk.http.SdkHttpRequest;
import software.amazon.awssdk.http.async.AsyncExecuteRequest;
+import software.amazon.awssdk.http.crt.internal.CrtAsyncRequestContext;
import software.amazon.awssdk.http.crt.internal.CrtRequestContext;
@SdkInternalApi
@@ -32,7 +34,7 @@ public final class CrtRequestAdapter {
private CrtRequestAdapter() {
}
- public static HttpRequest toCrtRequest(CrtRequestContext request) {
+ public static HttpRequest toAsyncCrtRequest(CrtAsyncRequestContext request) {
AsyncExecuteRequest sdkExecuteRequest = request.sdkRequest();
SdkHttpRequest sdkRequest = sdkExecuteRequest.request();
@@ -46,7 +48,7 @@ public static HttpRequest toCrtRequest(CrtRequestContext request) {
.map(value -> "?" + value)
.orElse("");
- HttpHeader[] crtHeaderArray = asArray(createHttpHeaderList(sdkRequest.getUri(), sdkExecuteRequest));
+ HttpHeader[] crtHeaderArray = asArray(createAsyncHttpHeaderList(sdkRequest.getUri(), sdkExecuteRequest));
return new HttpRequest(method,
encodedPath + encodedQueryString,
@@ -55,11 +57,39 @@ public static HttpRequest toCrtRequest(CrtRequestContext request) {
request.readBufferSize()));
}
+ public static HttpRequest toCrtRequest(CrtRequestContext request) {
+
+ HttpExecuteRequest sdkExecuteRequest = request.sdkRequest();
+ SdkHttpRequest sdkRequest = sdkExecuteRequest.httpRequest();
+
+ String method = sdkRequest.method().name();
+ String encodedPath = sdkRequest.encodedPath();
+ if (encodedPath == null || encodedPath.isEmpty()) {
+ encodedPath = "/";
+ }
+
+ String encodedQueryString = sdkRequest.encodedQueryParameters()
+ .map(value -> "?" + value)
+ .orElse("");
+
+ HttpHeader[] crtHeaderArray = asArray(createHttpHeaderList(sdkRequest.getUri(), sdkExecuteRequest));
+
+ String finalEncodedPath = encodedPath + encodedQueryString;
+ return sdkExecuteRequest.contentStreamProvider()
+ .map(provider -> new HttpRequest(method,
+ finalEncodedPath,
+ crtHeaderArray,
+ new CrtRequestInputStreamAdapter(provider)))
+ .orElse(new HttpRequest(method,
+ finalEncodedPath,
+ crtHeaderArray, null));
+ }
+
private static HttpHeader[] asArray(List crtHeaderList) {
return crtHeaderList.toArray(new HttpHeader[0]);
}
- private static List createHttpHeaderList(URI uri, AsyncExecuteRequest sdkExecuteRequest) {
+ private static List createAsyncHttpHeaderList(URI uri, AsyncExecuteRequest sdkExecuteRequest) {
SdkHttpRequest sdkRequest = sdkExecuteRequest.request();
// worst case we may add 3 more headers here
List crtHeaderList = new ArrayList<>(sdkRequest.numHeaders() + 3);
@@ -81,9 +111,30 @@ private static List createHttpHeaderList(URI uri, AsyncExecuteReques
}
// Add the rest of the Headers
- sdkRequest.forEachHeader((key, value) -> {
- value.stream().map(val -> new HttpHeader(key, val)).forEach(crtHeaderList::add);
- });
+ sdkRequest.forEachHeader((key, value) -> value.stream().map(val -> new HttpHeader(key, val)).forEach(crtHeaderList::add));
+
+ return crtHeaderList;
+ }
+
+ private static List createHttpHeaderList(URI uri, HttpExecuteRequest sdkExecuteRequest) {
+ SdkHttpRequest sdkRequest = sdkExecuteRequest.httpRequest();
+ // worst case we may add 3 more headers here
+ List crtHeaderList = new ArrayList<>(sdkRequest.numHeaders() + 3);
+
+ // Set Host Header if needed
+ if (!sdkRequest.firstMatchingHeader(Header.HOST).isPresent()) {
+ crtHeaderList.add(new HttpHeader(Header.HOST, uri.getHost()));
+ }
+
+ // Add Connection Keep Alive Header to reuse this Http Connection as long as possible
+ if (!sdkRequest.firstMatchingHeader(Header.CONNECTION).isPresent()) {
+ crtHeaderList.add(new HttpHeader(Header.CONNECTION, Header.KEEP_ALIVE_VALUE));
+ }
+
+ // We assume content length was set by the caller if a stream was present, so don't set it here.
+
+ // Add the rest of the Headers
+ sdkRequest.forEachHeader((key, value) -> value.stream().map(val -> new HttpHeader(key, val)).forEach(crtHeaderList::add));
return crtHeaderList;
}
diff --git a/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/request/CrtRequestInputStreamAdapter.java b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/request/CrtRequestInputStreamAdapter.java
new file mode 100644
index 000000000000..68f418b9e1df
--- /dev/null
+++ b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/request/CrtRequestInputStreamAdapter.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://aws.amazon.com/apache2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package software.amazon.awssdk.http.crt.internal.request;
+
+import static java.lang.Math.min;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.ByteBuffer;
+import software.amazon.awssdk.annotations.SdkInternalApi;
+import software.amazon.awssdk.crt.http.HttpRequestBodyStream;
+import software.amazon.awssdk.http.ContentStreamProvider;
+
+@SdkInternalApi
+final class CrtRequestInputStreamAdapter implements HttpRequestBodyStream {
+ private static final int READ_BUFFER_SIZE = 16 * 1024;
+
+ private final ContentStreamProvider provider;
+ private volatile InputStream providerStream;
+ private final byte[] readBuffer = new byte[READ_BUFFER_SIZE];
+
+ CrtRequestInputStreamAdapter(ContentStreamProvider provider) {
+ this.provider = provider;
+ }
+
+ @Override
+ public boolean sendRequestBody(ByteBuffer bodyBytesOut) {
+ int read;
+
+ try {
+ if (providerStream == null) {
+ createNewStream();
+ }
+
+ int toRead = min(READ_BUFFER_SIZE, bodyBytesOut.remaining());
+ read = providerStream.read(readBuffer, 0, toRead);
+
+ if (read > 0) {
+ bodyBytesOut.put(readBuffer, 0, read);
+ }
+ } catch (IOException ioe) {
+ throw new RuntimeException(ioe);
+ }
+
+ return read < 0;
+ }
+
+ @Override
+ public boolean resetPosition() {
+ try {
+ createNewStream();
+ } catch (IOException ioe) {
+ throw new RuntimeException(ioe);
+ }
+
+ return true;
+ }
+
+ private void createNewStream() throws IOException {
+ if (providerStream != null) {
+ providerStream.close();
+ }
+ providerStream = provider.newStream();
+ }
+}
diff --git a/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/response/CrtResponseAdapter.java b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/response/CrtResponseAdapter.java
index 081b002fff07..b2865ac49531 100644
--- a/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/response/CrtResponseAdapter.java
+++ b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/response/CrtResponseAdapter.java
@@ -15,7 +15,8 @@
package software.amazon.awssdk.http.crt.internal.response;
-import java.io.IOException;
+import static software.amazon.awssdk.http.crt.internal.CrtUtils.wrapWithIoExceptionIfRetryable;
+
import java.nio.ByteBuffer;
import java.util.concurrent.CompletableFuture;
import software.amazon.awssdk.annotations.SdkInternalApi;
@@ -29,11 +30,14 @@
import software.amazon.awssdk.http.HttpStatusFamily;
import software.amazon.awssdk.http.SdkHttpResponse;
import software.amazon.awssdk.http.async.SdkAsyncHttpResponseHandler;
+import software.amazon.awssdk.http.crt.AwsCrtAsyncHttpClient;
import software.amazon.awssdk.utils.Logger;
import software.amazon.awssdk.utils.Validate;
import software.amazon.awssdk.utils.async.SimplePublisher;
/**
+ * Response handler adaptor for {@link AwsCrtAsyncHttpClient}.
+ *
* Implements the CrtHttpStreamHandler API and converts CRT callbacks into calls to SDK AsyncExecuteRequest methods
*/
@SdkInternalApi
@@ -129,14 +133,7 @@ private void onSuccessfulResponseComplete(HttpStream stream) {
private void onFailedResponseComplete(HttpStream stream, HttpException error) {
log.debug(() -> "HTTP response encountered an error.", error);
- Throwable toThrow = error;
-
- if (HttpClientConnection.isErrorRetryable(error)) {
- // IOExceptions get retried, and if the CRT says this error is retryable,
- // it's semantically an IOException anyway.
- toThrow = new IOException(error);
- }
-
+ Throwable toThrow = wrapWithIoExceptionIfRetryable(error);;
responsePublisher.error(toThrow);
failResponseHandlerAndFuture(stream, toThrow);
}
diff --git a/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/response/InputStreamAdaptingHttpStreamResponseHandler.java b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/response/InputStreamAdaptingHttpStreamResponseHandler.java
new file mode 100644
index 000000000000..b1bf4462be89
--- /dev/null
+++ b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/response/InputStreamAdaptingHttpStreamResponseHandler.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://aws.amazon.com/apache2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package software.amazon.awssdk.http.crt.internal.response;
+
+import static software.amazon.awssdk.http.crt.internal.CrtUtils.wrapWithIoExceptionIfRetryable;
+
+import java.nio.ByteBuffer;
+import java.util.concurrent.CompletableFuture;
+import software.amazon.awssdk.annotations.SdkInternalApi;
+import software.amazon.awssdk.crt.CRT;
+import software.amazon.awssdk.crt.http.HttpClientConnection;
+import software.amazon.awssdk.crt.http.HttpException;
+import software.amazon.awssdk.crt.http.HttpHeader;
+import software.amazon.awssdk.crt.http.HttpHeaderBlock;
+import software.amazon.awssdk.crt.http.HttpStream;
+import software.amazon.awssdk.crt.http.HttpStreamResponseHandler;
+import software.amazon.awssdk.http.AbortableInputStream;
+import software.amazon.awssdk.http.HttpStatusFamily;
+import software.amazon.awssdk.http.SdkHttpFullResponse;
+import software.amazon.awssdk.http.crt.AwsCrtHttpClient;
+import software.amazon.awssdk.utils.async.InputStreamSubscriber;
+import software.amazon.awssdk.utils.async.SimplePublisher;
+
+/**
+ * Response handler adaptor for {@link AwsCrtHttpClient}.
+ */
+@SdkInternalApi
+public final class InputStreamAdaptingHttpStreamResponseHandler implements HttpStreamResponseHandler {
+ private final SdkHttpFullResponse.Builder responseBuilder = SdkHttpFullResponse.builder();
+ private volatile InputStreamSubscriber inputStreamSubscriber;
+ private final SimplePublisher simplePublisher = new SimplePublisher<>();
+
+ private final CompletableFuture requestCompletionFuture;
+ private final HttpClientConnection crtConn;
+
+ public InputStreamAdaptingHttpStreamResponseHandler(HttpClientConnection crtConn,
+ CompletableFuture requestCompletionFuture) {
+ this.crtConn = crtConn;
+ this.requestCompletionFuture = requestCompletionFuture;
+ }
+
+ @Override
+ public void onResponseHeaders(HttpStream stream, int responseStatusCode, int blockType,
+ HttpHeader[] nextHeaders) {
+ if (blockType == HttpHeaderBlock.MAIN.getValue()) {
+ for (HttpHeader h : nextHeaders) {
+ responseBuilder.appendHeader(h.getName(), h.getValue());
+ }
+ }
+
+ responseBuilder.statusCode(responseStatusCode);
+ }
+
+ @Override
+ public int onResponseBody(HttpStream stream, byte[] bodyBytesIn) {
+ if (inputStreamSubscriber == null) {
+ inputStreamSubscriber = new InputStreamSubscriber();
+ simplePublisher.subscribe(inputStreamSubscriber);
+ // For response with a payload, we need to complete the future here to allow downstream to retrieve the data from
+ // the stream directly.
+ responseBuilder.content(AbortableInputStream.create(inputStreamSubscriber));
+ requestCompletionFuture.complete(responseBuilder.build());
+ }
+
+ CompletableFuture writeFuture = simplePublisher.send(ByteBuffer.wrap(bodyBytesIn));
+
+ if (writeFuture.isDone() && !writeFuture.isCompletedExceptionally()) {
+ // Optimization: If write succeeded immediately, return non-zero to avoid the extra call back into the CRT.
+ return bodyBytesIn.length;
+ }
+
+ writeFuture.whenComplete((result, failure) -> {
+ if (failure != null) {
+ failFutureAndCloseConnection(stream, failure);
+ return;
+ }
+
+ // increment the window upon buffer consumption.
+ stream.incrementWindow(bodyBytesIn.length);
+ });
+
+ // the bodyBytesIn have not cleared the queues yet, so do let backpressure do its thing.
+ return 0;
+ }
+
+ @Override
+ public void onResponseComplete(HttpStream stream, int errorCode) {
+ if (errorCode == CRT.AWS_CRT_SUCCESS) {
+ onSuccessfulResponseComplete(stream);
+ } else {
+ onFailedResponseComplete(stream, errorCode);
+ }
+ }
+
+ private void failFutureAndCloseConnection(HttpStream stream, Throwable failure) {
+ requestCompletionFuture.completeExceptionally(failure);
+ crtConn.shutdown();
+ crtConn.close();
+ stream.close();
+ }
+
+ private void onFailedResponseComplete(HttpStream stream, int errorCode) {
+ Throwable toThrow =
+ wrapWithIoExceptionIfRetryable(new HttpException(errorCode));
+
+ simplePublisher.error(toThrow);
+ failFutureAndCloseConnection(stream, toThrow);
+ }
+
+ private void onSuccessfulResponseComplete(HttpStream stream) {
+ // always close the connection on a 5XX response code.
+ if (HttpStatusFamily.of(responseBuilder.statusCode()) == HttpStatusFamily.SERVER_ERROR) {
+ crtConn.shutdown();
+ }
+
+ // For response without a payload, for example, S3 PutObjectResponse, we need to complete the future
+ // in onResponseComplete callback since onResponseBody will never be invoked.
+ requestCompletionFuture.complete(responseBuilder.build());
+ simplePublisher.complete();
+ crtConn.close();
+ stream.close();
+ }
+}
diff --git a/http-clients/aws-crt-client/src/main/resources/META-INF/services/software.amazon.awssdk.http.SdkHttpService b/http-clients/aws-crt-client/src/main/resources/META-INF/services/software.amazon.awssdk.http.SdkHttpService
new file mode 100644
index 000000000000..f0312a3b901d
--- /dev/null
+++ b/http-clients/aws-crt-client/src/main/resources/META-INF/services/software.amazon.awssdk.http.SdkHttpService
@@ -0,0 +1,16 @@
+#
+# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License").
+# You may not use this file except in compliance with the License.
+# A copy of the License is located at
+#
+# http://aws.amazon.com/apache2.0
+#
+# or in the "license" file accompanying this file. This file is distributed
+# on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+# express or implied. See the License for the specific language governing
+# permissions and limitations under the License.
+#
+
+software.amazon.awssdk.http.crt.AwsCrtSdkHttpService
diff --git a/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/AwsCrtAsyncHttpClientSpiVerificationTest.java b/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/AwsCrtAsyncHttpClientSpiVerificationTest.java
new file mode 100644
index 000000000000..45de4ba201f0
--- /dev/null
+++ b/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/AwsCrtAsyncHttpClientSpiVerificationTest.java
@@ -0,0 +1,318 @@
+/*
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://aws.amazon.com/apache2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package software.amazon.awssdk.http.crt;
+
+import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
+import static com.github.tomakehurst.wiremock.client.WireMock.any;
+import static com.github.tomakehurst.wiremock.client.WireMock.binaryEqualTo;
+import static com.github.tomakehurst.wiremock.client.WireMock.stubFor;
+import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
+import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo;
+import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;
+import static java.util.Collections.emptyMap;
+import static org.apache.commons.codec.digest.DigestUtils.sha256Hex;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static software.amazon.awssdk.http.HttpTestUtils.createProvider;
+import static software.amazon.awssdk.http.crt.CrtHttpClientTestUtils.createRequest;
+
+import com.github.tomakehurst.wiremock.http.Fault;
+import com.github.tomakehurst.wiremock.junit.WireMockRule;
+import java.io.IOException;
+import java.net.URI;
+import java.nio.ByteBuffer;
+import java.time.Duration;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Rule;
+import org.junit.Test;
+import org.reactivestreams.Publisher;
+import org.reactivestreams.Subscriber;
+import org.reactivestreams.Subscription;
+import software.amazon.awssdk.crt.CrtResource;
+import software.amazon.awssdk.crt.Log;
+import software.amazon.awssdk.crt.http.HttpException;
+import software.amazon.awssdk.http.RecordingResponseHandler;
+import software.amazon.awssdk.http.SdkHttpMethod;
+import software.amazon.awssdk.http.SdkHttpRequest;
+import software.amazon.awssdk.http.SdkHttpResponse;
+import software.amazon.awssdk.http.async.AsyncExecuteRequest;
+import software.amazon.awssdk.http.async.SdkAsyncHttpClient;
+import software.amazon.awssdk.http.async.SdkAsyncHttpResponseHandler;
+
+public class AwsCrtAsyncHttpClientSpiVerificationTest {
+ private static final int TEST_BODY_LEN = 1024;
+
+ @Rule
+ public WireMockRule mockServer = new WireMockRule(wireMockConfig()
+ .dynamicPort()
+ .dynamicHttpsPort());
+
+ private static SdkAsyncHttpClient client;
+
+ @BeforeClass
+ public static void setup() throws Exception {
+ System.setProperty("aws.crt.debugnative", "true");
+ Log.initLoggingToStdout(Log.LogLevel.Warn);
+ client = AwsCrtAsyncHttpClient.builder()
+ .connectionHealthConfiguration(b -> b.minimumThroughputInBps(4068L)
+ .minimumThroughputTimeout(Duration.ofSeconds(3)))
+ .build();
+ }
+
+ @AfterClass
+ public static void tearDown() {
+ client.close();
+ CrtResource.waitForNoResources();
+ }
+
+ private byte[] generateRandomBody(int size) {
+ byte[] randomData = new byte[size];
+ new Random().nextBytes(randomData);
+ return randomData;
+ }
+
+ @Test
+ public void signalsErrorViaOnErrorAndFuture() throws Exception {
+ stubFor(any(urlEqualTo("/")).willReturn(aResponse().withFault(Fault.RANDOM_DATA_THEN_CLOSE)));
+
+ CompletableFuture errorSignaled = new CompletableFuture<>();
+
+ SdkAsyncHttpResponseHandler handler = new TestResponseHandler() {
+ @Override
+ public void onError(Throwable error) {
+ errorSignaled.complete(true);
+ }
+ };
+
+ SdkHttpRequest request = createRequest(URI.create("http://localhost:" + mockServer.port()));
+
+ CompletableFuture executeFuture = client.execute(AsyncExecuteRequest.builder()
+ .request(request)
+ .responseHandler(handler)
+ .requestContentPublisher(new EmptyPublisher())
+ .build());
+
+ assertThat(errorSignaled.get(1, TimeUnit.SECONDS)).isTrue();
+ assertThatThrownBy(executeFuture::join).hasCauseInstanceOf(IOException.class).hasRootCauseInstanceOf(HttpException.class);
+ }
+
+ @Test
+ public void requestFailed_connectionTimeout_shouldWrapException() {
+ try (SdkAsyncHttpClient client = AwsCrtAsyncHttpClient.builder().connectionTimeout(Duration.ofNanos(1)).build()) {
+ URI uri = URI.create("http://localhost:" + mockServer.port());
+ stubFor(any(urlPathEqualTo("/")).willReturn(aResponse().withFault(Fault.RANDOM_DATA_THEN_CLOSE)));
+ SdkHttpRequest request = createRequest(uri);
+ RecordingResponseHandler recorder = new RecordingResponseHandler();
+ client.execute(AsyncExecuteRequest.builder().request(request).requestContentPublisher(createProvider("")).responseHandler(recorder).build());
+ assertThatThrownBy(() -> recorder.completeFuture().get(5, TimeUnit.SECONDS)).hasCauseInstanceOf(IOException.class)
+ .hasRootCauseInstanceOf(HttpException.class);
+ }
+ }
+
+ @Test
+ public void requestFailed_notRetryable_shouldNotWrapException() {
+ try (SdkAsyncHttpClient client = AwsCrtAsyncHttpClient.builder().build()) {
+ URI uri = URI.create("http://localhost:" + mockServer.port());
+ // make it invalid by doing a non-zero content length with no request body...
+ Map> headers = new HashMap<>();
+ headers.put("host", Collections.singletonList(uri.getHost()));
+
+ List contentLengthValues = new LinkedList<>();
+ contentLengthValues.add("1");
+ headers.put("content-length", contentLengthValues);
+
+ SdkHttpRequest request = createRequest(uri).toBuilder().headers(headers).build();
+
+ RecordingResponseHandler recorder = new RecordingResponseHandler();
+ client.execute(AsyncExecuteRequest.builder().request(request).requestContentPublisher(new EmptyPublisher()).responseHandler(recorder).build());
+ // invalid request should have returned an HttpException and not an IOException.
+ assertThatThrownBy(() -> recorder.completeFuture().get(5, TimeUnit.SECONDS))
+ .hasCauseInstanceOf(HttpException.class).hasMessageContaining("does not match the previously declared length");
+ }
+ }
+
+ @Test
+ public void callsOnStreamForEmptyResponseContent() throws Exception {
+ stubFor(any(urlEqualTo("/")).willReturn(aResponse().withStatus(204).withHeader("foo", "bar")));
+
+ CompletableFuture streamReceived = new CompletableFuture<>();
+ AtomicReference response = new AtomicReference<>(null);
+
+ SdkAsyncHttpResponseHandler handler = new TestResponseHandler() {
+ @Override
+ public void onHeaders(SdkHttpResponse headers) {
+ response.compareAndSet(null, headers);
+ }
+ @Override
+ public void onStream(Publisher stream) {
+ super.onStream(stream);
+ streamReceived.complete(true);
+ }
+ };
+
+ SdkHttpRequest request = createRequest(URI.create("http://localhost:" + mockServer.port()));
+
+ CompletableFuture future = client.execute(AsyncExecuteRequest.builder()
+ .request(request)
+ .responseHandler(handler)
+ .requestContentPublisher(new EmptyPublisher())
+ .build());
+
+ future.get(60, TimeUnit.SECONDS);
+ assertThat(streamReceived.get(1, TimeUnit.SECONDS)).isTrue();
+ assertThat(response.get() != null).isTrue();
+ assertThat(response.get().statusCode() == 204).isTrue();
+ assertThat(response.get().headers().get("foo").isEmpty()).isFalse();
+ }
+
+ @Test
+ public void testGetRequest() throws Exception {
+ String path = "/testGetRequest";
+ byte[] body = generateRandomBody(TEST_BODY_LEN);
+ String expectedBodyHash = sha256Hex(body).toUpperCase();
+ stubFor(any(urlEqualTo(path)).willReturn(aResponse().withStatus(200)
+ .withHeader("Content-Length", Integer.toString(TEST_BODY_LEN))
+ .withHeader("foo", "bar")
+ .withBody(body)));
+
+ CompletableFuture streamReceived = new CompletableFuture<>();
+ AtomicReference response = new AtomicReference<>(null);
+ Sha256BodySubscriber bodySha256Subscriber = new Sha256BodySubscriber();
+ AtomicReference error = new AtomicReference<>(null);
+
+ SdkAsyncHttpResponseHandler handler = new SdkAsyncHttpResponseHandler() {
+ @Override
+ public void onHeaders(SdkHttpResponse headers) {
+ response.compareAndSet(null, headers);
+ }
+ @Override
+ public void onStream(Publisher stream) {
+ stream.subscribe(bodySha256Subscriber);
+ streamReceived.complete(true);
+ }
+
+ @Override
+ public void onError(Throwable t) {
+ error.compareAndSet(null, t);
+ }
+ };
+
+ URI uri = URI.create("http://localhost:" + mockServer.port());
+ SdkHttpRequest request = createRequest(uri, path, null, SdkHttpMethod.GET, emptyMap());
+
+ CompletableFuture future = client.execute(AsyncExecuteRequest.builder()
+ .request(request)
+ .responseHandler(handler)
+ .requestContentPublisher(new EmptyPublisher())
+ .build());
+
+ future.get(60, TimeUnit.SECONDS);
+ assertThat(error.get()).isNull();
+ assertThat(streamReceived.get(1, TimeUnit.SECONDS)).isTrue();
+ assertThat(bodySha256Subscriber.getFuture().get(60, TimeUnit.SECONDS)).isEqualTo(expectedBodyHash);
+ assertThat(response.get().statusCode()).isEqualTo(200);
+ assertThat(response.get().headers().get("foo").isEmpty()).isFalse();
+ }
+
+
+ private void makePutRequest(String path, byte[] reqBody, int expectedStatus) throws Exception {
+ CompletableFuture streamReceived = new CompletableFuture<>();
+ AtomicReference response = new AtomicReference<>(null);
+ AtomicReference error = new AtomicReference<>(null);
+
+ Subscriber subscriber = CrtHttpClientTestUtils.createDummySubscriber();
+
+ SdkAsyncHttpResponseHandler handler = CrtHttpClientTestUtils.createTestResponseHandler(response,
+ streamReceived, error, subscriber);
+
+ URI uri = URI.create("http://localhost:" + mockServer.port());
+ SdkHttpRequest request = createRequest(uri, path, reqBody, SdkHttpMethod.PUT, emptyMap());
+
+ CompletableFuture future = client.execute(AsyncExecuteRequest.builder()
+ .request(request)
+ .responseHandler(handler)
+ .requestContentPublisher(new SdkTestHttpContentPublisher(reqBody))
+ .build());
+ future.get(60, TimeUnit.SECONDS);
+ assertThat(error.get()).isNull();
+ assertThat(streamReceived.get(60, TimeUnit.SECONDS)).isTrue();
+ assertThat(response.get().statusCode()).isEqualTo(expectedStatus);
+ }
+
+
+ @Test
+ public void testPutRequest() throws Exception {
+ String pathExpect200 = "/testPutRequest/return_200_on_exact_match";
+ byte[] expectedBody = generateRandomBody(TEST_BODY_LEN);
+ stubFor(any(urlEqualTo(pathExpect200)).withRequestBody(binaryEqualTo(expectedBody)).willReturn(aResponse().withStatus(200)));
+ makePutRequest(pathExpect200, expectedBody, 200);
+
+ String pathExpect404 = "/testPutRequest/return_404_always";
+ byte[] randomBody = generateRandomBody(TEST_BODY_LEN);
+ stubFor(any(urlEqualTo(pathExpect404)).willReturn(aResponse().withStatus(404)));
+ makePutRequest(pathExpect404, randomBody, 404);
+ }
+
+
+
+ private static class TestResponseHandler implements SdkAsyncHttpResponseHandler {
+ @Override
+ public void onHeaders(SdkHttpResponse headers) {
+ }
+
+ @Override
+ public void onStream(Publisher stream) {
+ stream.subscribe(new DrainingSubscriber<>());
+ }
+
+ @Override
+ public void onError(Throwable error) {
+ }
+ }
+
+ private static class DrainingSubscriber implements Subscriber {
+ private Subscription subscription;
+
+ @Override
+ public void onSubscribe(Subscription subscription) {
+ this.subscription = subscription;
+ this.subscription.request(Long.MAX_VALUE);
+ }
+
+ @Override
+ public void onNext(T t) {
+ this.subscription.request(1);
+ }
+
+ @Override
+ public void onError(Throwable throwable) {
+ }
+
+ @Override
+ public void onComplete() {
+ }
+ }
+}
diff --git a/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/AwsCrtAsyncHttpClientWireMockTest.java b/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/AwsCrtAsyncHttpClientWireMockTest.java
new file mode 100644
index 000000000000..eecfb533ec0c
--- /dev/null
+++ b/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/AwsCrtAsyncHttpClientWireMockTest.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://aws.amazon.com/apache2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package software.amazon.awssdk.http.crt;
+
+import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
+import static com.github.tomakehurst.wiremock.client.WireMock.any;
+import static com.github.tomakehurst.wiremock.client.WireMock.stubFor;
+import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo;
+import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;
+import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static software.amazon.awssdk.http.HttpTestUtils.createProvider;
+import static software.amazon.awssdk.http.SdkHttpConfigurationOption.PROTOCOL;
+import static software.amazon.awssdk.http.crt.CrtHttpClientTestUtils.createRequest;
+
+import com.github.tomakehurst.wiremock.junit.WireMockRule;
+import java.net.URI;
+import java.util.concurrent.TimeUnit;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Rule;
+import org.junit.Test;
+import software.amazon.awssdk.crt.CrtResource;
+import software.amazon.awssdk.crt.Log;
+import software.amazon.awssdk.http.HttpMetric;
+import software.amazon.awssdk.http.Protocol;
+import software.amazon.awssdk.http.RecordingResponseHandler;
+import software.amazon.awssdk.http.SdkHttpRequest;
+import software.amazon.awssdk.http.async.AsyncExecuteRequest;
+import software.amazon.awssdk.http.async.SdkAsyncHttpClient;
+import software.amazon.awssdk.metrics.MetricCollection;
+import software.amazon.awssdk.utils.AttributeMap;
+
+public class AwsCrtAsyncHttpClientWireMockTest {
+ @Rule
+ public WireMockRule mockServer = new WireMockRule(wireMockConfig()
+ .dynamicPort());
+
+ @BeforeClass
+ public static void setup() {
+ System.setProperty("aws.crt.debugnative", "true");
+ Log.initLoggingToStdout(Log.LogLevel.Warn);
+ }
+
+ @AfterClass
+ public static void tearDown() {
+ // Verify there is no resource leak.
+ CrtResource.waitForNoResources();
+ }
+
+ @Test
+ public void closeClient_reuse_throwException() {
+ SdkAsyncHttpClient client = AwsCrtAsyncHttpClient.create();
+
+ client.close();
+ assertThatThrownBy(() -> makeSimpleRequest(client)).hasMessageContaining("is closed");
+ }
+
+ @Test
+ public void invalidProtocol_shouldThrowException() {
+ AttributeMap attributeMap = AttributeMap.builder()
+ .put(PROTOCOL, Protocol.HTTP2)
+ .build();
+ assertThatThrownBy(() -> AwsCrtAsyncHttpClient.builder().buildWithDefaults(attributeMap))
+ .isInstanceOf(UnsupportedOperationException.class);
+ }
+
+ @Test
+ public void sendRequest_withCollector_shouldCollectMetrics() throws Exception {
+
+ try (SdkAsyncHttpClient client = AwsCrtAsyncHttpClient.builder().maxConcurrency(10).build()) {
+ RecordingResponseHandler recorder = makeSimpleRequest(client);
+ MetricCollection metrics = recorder.collector().collect();
+
+ assertThat(metrics.metricValues(HttpMetric.HTTP_CLIENT_NAME)).containsExactly("AwsCommonRuntime");
+ assertThat(metrics.metricValues(HttpMetric.MAX_CONCURRENCY)).containsExactly(10);
+ assertThat(metrics.metricValues(HttpMetric.PENDING_CONCURRENCY_ACQUIRES)).containsExactly(0);
+ assertThat(metrics.metricValues(HttpMetric.LEASED_CONCURRENCY)).containsExactly(1);
+ assertThat(metrics.metricValues(HttpMetric.AVAILABLE_CONCURRENCY)).containsExactly(0);
+ }
+ }
+
+ @Test
+ public void sharedEventLoopGroup_closeOneClient_shouldNotAffectOtherClients() throws Exception {
+ try (SdkAsyncHttpClient client = AwsCrtAsyncHttpClient.create()) {
+ makeSimpleRequest(client);
+ }
+
+ try (SdkAsyncHttpClient anotherClient = AwsCrtAsyncHttpClient.create()) {
+ makeSimpleRequest(anotherClient);
+ }
+ }
+
+ /**
+ * Make a simple async request and wait for it to finish.
+ *
+ * @param client Client to make request with.
+ */
+ private RecordingResponseHandler makeSimpleRequest(SdkAsyncHttpClient client) throws Exception {
+ String body = randomAlphabetic(10);
+ URI uri = URI.create("http://localhost:" + mockServer.port());
+ stubFor(any(urlPathEqualTo("/")).willReturn(aResponse().withBody(body)));
+ SdkHttpRequest request = createRequest(uri);
+ RecordingResponseHandler recorder = new RecordingResponseHandler();
+ client.execute(AsyncExecuteRequest.builder()
+ .request(request)
+ .requestContentPublisher(createProvider(""))
+ .responseHandler(recorder)
+ .metricCollector(recorder.collector())
+ .build());
+ recorder.completeFuture().get(5, TimeUnit.SECONDS);
+ return recorder;
+ }
+}
diff --git a/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/AwsCrtHttpClientSpiVerificationTest.java b/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/AwsCrtHttpClientSpiVerificationTest.java
index 3d0ccab3fd7c..0777525c83ca 100644
--- a/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/AwsCrtHttpClientSpiVerificationTest.java
+++ b/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/AwsCrtHttpClientSpiVerificationTest.java
@@ -23,17 +23,14 @@
import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo;
import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;
import static java.util.Collections.emptyMap;
-import static org.apache.commons.codec.digest.DigestUtils.sha256Hex;
import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatThrownBy;
-import static software.amazon.awssdk.http.HttpTestUtils.createProvider;
import static software.amazon.awssdk.http.crt.CrtHttpClientTestUtils.createRequest;
import com.github.tomakehurst.wiremock.http.Fault;
import com.github.tomakehurst.wiremock.junit.WireMockRule;
+import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.net.URI;
-import java.nio.ByteBuffer;
import java.time.Duration;
import java.util.Collections;
import java.util.HashMap;
@@ -41,29 +38,21 @@
import java.util.List;
import java.util.Map;
import java.util.Random;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicReference;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Rule;
import org.junit.Test;
-import org.reactivestreams.Publisher;
-import org.reactivestreams.Subscriber;
-import org.reactivestreams.Subscription;
import software.amazon.awssdk.crt.CrtResource;
+import software.amazon.awssdk.crt.Log;
import software.amazon.awssdk.crt.http.HttpException;
-import software.amazon.awssdk.http.RecordingResponseHandler;
+import software.amazon.awssdk.http.ExecutableHttpRequest;
+import software.amazon.awssdk.http.HttpExecuteRequest;
+import software.amazon.awssdk.http.HttpExecuteResponse;
+import software.amazon.awssdk.http.SdkHttpClient;
import software.amazon.awssdk.http.SdkHttpMethod;
import software.amazon.awssdk.http.SdkHttpRequest;
-import software.amazon.awssdk.http.SdkHttpResponse;
-import software.amazon.awssdk.http.async.AsyncExecuteRequest;
-import software.amazon.awssdk.http.async.SdkAsyncHttpClient;
-import software.amazon.awssdk.http.async.SdkAsyncHttpResponseHandler;
-import software.amazon.awssdk.utils.Logger;
public class AwsCrtHttpClientSpiVerificationTest {
- private static final Logger log = Logger.loggerFor(AwsCrtHttpClientSpiVerificationTest.class);
private static final int TEST_BODY_LEN = 1024;
@Rule
@@ -71,14 +60,16 @@ public class AwsCrtHttpClientSpiVerificationTest {
.dynamicPort()
.dynamicHttpsPort());
- private static SdkAsyncHttpClient client;
+ private static SdkHttpClient client;
@BeforeClass
public static void setup() throws Exception {
- client = AwsCrtAsyncHttpClient.builder()
- .connectionHealthConfiguration(b -> b.minimumThroughputInBps(4068L)
+ System.setProperty("aws.crt.debugnative", "true");
+ Log.initLoggingToStdout(Log.LogLevel.Warn);
+ client = AwsCrtHttpClient.builder()
+ .connectionHealthConfiguration(b -> b.minimumThroughputInBps(4068L)
.minimumThroughputTimeout(Duration.ofSeconds(3)))
- .build();
+ .build();
}
@AfterClass
@@ -93,47 +84,25 @@ private byte[] generateRandomBody(int size) {
return randomData;
}
- @Test
- public void signalsErrorViaOnErrorAndFuture() throws Exception {
- stubFor(any(urlEqualTo("/")).willReturn(aResponse().withFault(Fault.RANDOM_DATA_THEN_CLOSE)));
-
- CompletableFuture errorSignaled = new CompletableFuture<>();
-
- SdkAsyncHttpResponseHandler handler = new TestResponseHandler() {
- @Override
- public void onError(Throwable error) {
- errorSignaled.complete(true);
- }
- };
-
- SdkHttpRequest request = CrtHttpClientTestUtils.createRequest(URI.create("http://localhost:" + mockServer.port()));
-
- CompletableFuture executeFuture = client.execute(AsyncExecuteRequest.builder()
- .request(request)
- .responseHandler(handler)
- .requestContentPublisher(new EmptyPublisher())
- .build());
-
- assertThat(errorSignaled.get(1, TimeUnit.SECONDS)).isTrue();
- assertThatThrownBy(executeFuture::join).hasCauseInstanceOf(IOException.class).hasRootCauseInstanceOf(HttpException.class);
- }
- @Test
- public void requestFailed_connectionTimeout_shouldWrapException() {
- try (SdkAsyncHttpClient client = AwsCrtAsyncHttpClient.builder().connectionTimeout(Duration.ofNanos(1)).build()) {
+ @Test(expected = IOException.class)
+ public void requestFailed_connectionTimeout_shouldWrapException() throws IOException {
+ try (SdkHttpClient client = AwsCrtHttpClient.builder().connectionTimeout(Duration.ofNanos(1)).build()) {
URI uri = URI.create("http://localhost:" + mockServer.port());
stubFor(any(urlPathEqualTo("/")).willReturn(aResponse().withFault(Fault.RANDOM_DATA_THEN_CLOSE)));
SdkHttpRequest request = createRequest(uri);
- RecordingResponseHandler recorder = new RecordingResponseHandler();
- client.execute(AsyncExecuteRequest.builder().request(request).requestContentPublisher(createProvider("")).responseHandler(recorder).build());
- assertThatThrownBy(() -> recorder.completeFuture().get(5, TimeUnit.SECONDS)).hasCauseInstanceOf(IOException.class)
- .hasRootCauseInstanceOf(HttpException.class);
+ HttpExecuteRequest.Builder executeRequestBuilder = HttpExecuteRequest.builder();
+ executeRequestBuilder.request(request);
+ ExecutableHttpRequest executableRequest = client.prepareRequest(executeRequestBuilder.build());
+
+ executableRequest.call();
}
}
- @Test
- public void requestFailed_notRetryable_shouldNotWrapException() {
- try (SdkAsyncHttpClient client = AwsCrtAsyncHttpClient.builder().build()) {
+
+ @Test(expected = HttpException.class)
+ public void requestFailed_notRetryable_shouldNotWrapException() throws IOException {
+ try (SdkHttpClient client = AwsCrtHttpClient.builder().build()) {
URI uri = URI.create("http://localhost:" + mockServer.port());
// make it invalid by doing a non-zero content length with no request body...
Map> headers = new HashMap<>();
@@ -145,123 +114,62 @@ public void requestFailed_notRetryable_shouldNotWrapException() {
SdkHttpRequest request = createRequest(uri).toBuilder().headers(headers).build();
- RecordingResponseHandler recorder = new RecordingResponseHandler();
- client.execute(AsyncExecuteRequest.builder().request(request).requestContentPublisher(new EmptyPublisher()).responseHandler(recorder).build());
- // invalid request should have returned an HttpException and not an IOException.
- assertThatThrownBy(() -> recorder.completeFuture().get(5, TimeUnit.SECONDS))
- .hasCauseInstanceOf(HttpException.class).hasMessageContaining("does not match the previously declared length");
+ HttpExecuteRequest.Builder executeRequestBuilder = HttpExecuteRequest.builder();
+ executeRequestBuilder.request(request);
+ executeRequestBuilder.contentStreamProvider(() -> new ByteArrayInputStream(new byte[0]));
+ ExecutableHttpRequest executableRequest = client.prepareRequest(executeRequestBuilder.build());
+ executableRequest.call();
}
}
- @Test
- public void callsOnStreamForEmptyResponseContent() throws Exception {
- stubFor(any(urlEqualTo("/")).willReturn(aResponse().withStatus(204).withHeader("foo", "bar")));
-
- CompletableFuture streamReceived = new CompletableFuture<>();
- AtomicReference response = new AtomicReference<>(null);
-
- SdkAsyncHttpResponseHandler handler = new TestResponseHandler() {
- @Override
- public void onHeaders(SdkHttpResponse headers) {
- response.compareAndSet(null, headers);
- }
- @Override
- public void onStream(Publisher stream) {
- super.onStream(stream);
- streamReceived.complete(true);
- }
- };
-
- SdkHttpRequest request = CrtHttpClientTestUtils.createRequest(URI.create("http://localhost:" + mockServer.port()));
-
- CompletableFuture future = client.execute(AsyncExecuteRequest.builder()
- .request(request)
- .responseHandler(handler)
- .requestContentPublisher(new EmptyPublisher())
- .build());
-
- future.get(60, TimeUnit.SECONDS);
- assertThat(streamReceived.get(1, TimeUnit.SECONDS)).isTrue();
- assertThat(response.get() != null).isTrue();
- assertThat(response.get().statusCode() == 204).isTrue();
- assertThat(response.get().headers().get("foo").isEmpty()).isFalse();
- }
+ // the following test is commented out but here because I want anyone coming to this file to find out why I removed this test
+ // to know why. The SdkHttpClient interface has a different invariant regarding when a response stream is present than does
+ // the async subscriber model. SdkHttpClientTestSuite.validateResponse() asserts that the response stream is null
+ // on head requests. To meet that contract, we'd have to be null here as well. However, this test is supposed to
+ // check the exact opposite of that invariant. Since this test was ported from the async tests, we're going to assume
+ // this is an oversight between the sync and async APIs. However. that is why this test is removed.
+ //
+ //public void callsOnStreamForEmptyResponseContent();
@Test
public void testGetRequest() throws Exception {
String path = "/testGetRequest";
byte[] body = generateRandomBody(TEST_BODY_LEN);
- String expectedBodyHash = sha256Hex(body).toUpperCase();
stubFor(any(urlEqualTo(path)).willReturn(aResponse().withStatus(200)
.withHeader("Content-Length", Integer.toString(TEST_BODY_LEN))
.withHeader("foo", "bar")
.withBody(body)));
- CompletableFuture streamReceived = new CompletableFuture<>();
- AtomicReference response = new AtomicReference<>(null);
- Sha256BodySubscriber bodySha256Subscriber = new Sha256BodySubscriber();
- AtomicReference error = new AtomicReference<>(null);
-
- SdkAsyncHttpResponseHandler handler = new SdkAsyncHttpResponseHandler() {
- @Override
- public void onHeaders(SdkHttpResponse headers) {
- response.compareAndSet(null, headers);
- }
- @Override
- public void onStream(Publisher stream) {
- stream.subscribe(bodySha256Subscriber);
- streamReceived.complete(true);
- }
-
- @Override
- public void onError(Throwable t) {
- error.compareAndSet(null, t);
- }
- };
-
URI uri = URI.create("http://localhost:" + mockServer.port());
SdkHttpRequest request = CrtHttpClientTestUtils.createRequest(uri, path, null, SdkHttpMethod.GET, emptyMap());
- CompletableFuture future = client.execute(AsyncExecuteRequest.builder()
- .request(request)
- .responseHandler(handler)
- .requestContentPublisher(new EmptyPublisher())
- .build());
-
- future.get(60, TimeUnit.SECONDS);
- assertThat(error.get()).isNull();
- assertThat(streamReceived.get(1, TimeUnit.SECONDS)).isTrue();
- assertThat(bodySha256Subscriber.getFuture().get(60, TimeUnit.SECONDS)).isEqualTo(expectedBodyHash);
- assertThat(response.get().statusCode()).isEqualTo(200);
- assertThat(response.get().headers().get("foo").isEmpty()).isFalse();
+ HttpExecuteRequest.Builder executeRequestBuilder = HttpExecuteRequest.builder();
+ executeRequestBuilder.request(request);
+ ExecutableHttpRequest executableRequest = client.prepareRequest(executeRequestBuilder.build());
+ HttpExecuteResponse response = executableRequest.call();
+
+ assertThat(response.responseBody().isPresent()).isTrue();
+ byte[] readBody = new byte[TEST_BODY_LEN];
+ assertThat(response.responseBody().get().read(readBody)).isEqualTo(TEST_BODY_LEN);
+ assertThat(readBody).isEqualTo(body);
+ assertThat(response.httpResponse().statusCode()).isEqualTo(200);
+ assertThat(response.httpResponse().headers().get("foo").isEmpty()).isFalse();
}
private void makePutRequest(String path, byte[] reqBody, int expectedStatus) throws Exception {
- CompletableFuture streamReceived = new CompletableFuture<>();
- AtomicReference response = new AtomicReference<>(null);
- AtomicReference error = new AtomicReference<>(null);
-
- Subscriber subscriber = CrtHttpClientTestUtils.createDummySubscriber();
-
- SdkAsyncHttpResponseHandler handler = CrtHttpClientTestUtils.createTestResponseHandler(response,
- streamReceived, error, subscriber);
-
URI uri = URI.create("http://localhost:" + mockServer.port());
SdkHttpRequest request = CrtHttpClientTestUtils.createRequest(uri, path, reqBody, SdkHttpMethod.PUT, emptyMap());
-
- CompletableFuture future = client.execute(AsyncExecuteRequest.builder()
- .request(request)
- .responseHandler(handler)
- .requestContentPublisher(new SdkTestHttpContentPublisher(reqBody))
- .build());
- future.get(60, TimeUnit.SECONDS);
- assertThat(error.get()).isNull();
- assertThat(streamReceived.get(60, TimeUnit.SECONDS)).isTrue();
- assertThat(response.get().statusCode()).isEqualTo(expectedStatus);
+ HttpExecuteRequest.Builder executeRequestBuilder = HttpExecuteRequest.builder();
+ executeRequestBuilder.request(request);
+ executeRequestBuilder.contentStreamProvider(() -> new ByteArrayInputStream(reqBody));
+ ExecutableHttpRequest executableRequest = client.prepareRequest(executeRequestBuilder.build());
+ HttpExecuteResponse response = executableRequest.call();
+
+ assertThat(response.responseBody().isPresent()).isFalse();
+ assertThat(response.httpResponse().statusCode()).isEqualTo(expectedStatus);
}
-
@Test
public void testPutRequest() throws Exception {
String pathExpect200 = "/testPutRequest/return_200_on_exact_match";
@@ -274,44 +182,4 @@ public void testPutRequest() throws Exception {
stubFor(any(urlEqualTo(pathExpect404)).willReturn(aResponse().withStatus(404)));
makePutRequest(pathExpect404, randomBody, 404);
}
-
-
-
- private static class TestResponseHandler implements SdkAsyncHttpResponseHandler {
- @Override
- public void onHeaders(SdkHttpResponse headers) {
- }
-
- @Override
- public void onStream(Publisher stream) {
- stream.subscribe(new DrainingSubscriber<>());
- }
-
- @Override
- public void onError(Throwable error) {
- }
- }
-
- private static class DrainingSubscriber implements Subscriber {
- private Subscription subscription;
-
- @Override
- public void onSubscribe(Subscription subscription) {
- this.subscription = subscription;
- this.subscription.request(Long.MAX_VALUE);
- }
-
- @Override
- public void onNext(T t) {
- this.subscription.request(1);
- }
-
- @Override
- public void onError(Throwable throwable) {
- }
-
- @Override
- public void onComplete() {
- }
- }
}
diff --git a/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/AwsCrtHttpClientTest.java b/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/AwsCrtHttpClientTest.java
new file mode 100644
index 000000000000..b77a7f1acdb2
--- /dev/null
+++ b/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/AwsCrtHttpClientTest.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://aws.amazon.com/apache2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package software.amazon.awssdk.http.crt;
+
+import static software.amazon.awssdk.http.SdkHttpConfigurationOption.TRUST_ALL_CERTIFICATES;
+
+
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import software.amazon.awssdk.crt.CrtResource;
+import software.amazon.awssdk.crt.Log;
+import software.amazon.awssdk.http.SdkHttpClient;
+import software.amazon.awssdk.http.SdkHttpClientTestSuite;
+import software.amazon.awssdk.utils.AttributeMap;
+
+/**
+ * Testing the scenario where h1 server sends 5xx errors.
+ */
+public class AwsCrtHttpClientTest extends SdkHttpClientTestSuite {
+
+ @BeforeAll
+ public static void beforeAll() {
+ System.setProperty("aws.crt.debugnative", "true");
+ Log.initLoggingToStdout(Log.LogLevel.Warn);
+ }
+
+ @AfterAll
+ public static void afterAll() {
+ CrtResource.waitForNoResources();
+ }
+
+ @Override
+ protected SdkHttpClient createSdkHttpClient(SdkHttpClientOptions options) {
+ boolean trustAllCerts = options.trustAll();
+ return AwsCrtHttpClient.builder()
+ .buildWithDefaults(AttributeMap.builder().put(TRUST_ALL_CERTIFICATES, trustAllCerts).build());
+ }
+
+ // Empty test; behavior not supported when using custom factory
+ @Override
+ public void testCustomTlsTrustManagerAndTrustAllFails() {
+ }
+
+ // Empty test; behavior not supported when using custom factory
+ @Override
+ public void testCustomTlsTrustManager() {
+ }
+}
diff --git a/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/AwsCrtHttpClientWireMockTest.java b/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/AwsCrtHttpClientWireMockTest.java
index e43e8d4b0721..e052f225a4c9 100644
--- a/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/AwsCrtHttpClientWireMockTest.java
+++ b/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/AwsCrtHttpClientWireMockTest.java
@@ -23,26 +23,27 @@
import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
-import static software.amazon.awssdk.http.HttpTestUtils.createProvider;
import static software.amazon.awssdk.http.SdkHttpConfigurationOption.PROTOCOL;
import static software.amazon.awssdk.http.crt.CrtHttpClientTestUtils.createRequest;
import com.github.tomakehurst.wiremock.junit.WireMockRule;
+import java.io.ByteArrayInputStream;
import java.net.URI;
-import java.util.concurrent.TimeUnit;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Rule;
import org.junit.Test;
import software.amazon.awssdk.crt.CrtResource;
import software.amazon.awssdk.crt.Log;
+import software.amazon.awssdk.http.ExecutableHttpRequest;
+import software.amazon.awssdk.http.HttpExecuteRequest;
+import software.amazon.awssdk.http.HttpExecuteResponse;
import software.amazon.awssdk.http.HttpMetric;
import software.amazon.awssdk.http.Protocol;
-import software.amazon.awssdk.http.RecordingResponseHandler;
+import software.amazon.awssdk.http.SdkHttpClient;
import software.amazon.awssdk.http.SdkHttpRequest;
-import software.amazon.awssdk.http.async.AsyncExecuteRequest;
-import software.amazon.awssdk.http.async.SdkAsyncHttpClient;
import software.amazon.awssdk.metrics.MetricCollection;
+import software.amazon.awssdk.metrics.MetricCollector;
import software.amazon.awssdk.utils.AttributeMap;
public class AwsCrtHttpClientWireMockTest {
@@ -63,11 +64,11 @@ public static void tearDown() {
}
@Test
- public void closeClient_reuse_throwException() throws Exception {
- SdkAsyncHttpClient client = AwsCrtAsyncHttpClient.create();
+ public void closeClient_reuse_throwException() {
+ SdkHttpClient client = AwsCrtHttpClient.create();
client.close();
- assertThatThrownBy(() -> makeSimpleRequest(client)).hasMessageContaining("is closed");
+ assertThatThrownBy(() -> makeSimpleRequest(client, null)).hasMessageContaining("is closed");
}
@Test
@@ -75,16 +76,17 @@ public void invalidProtocol_shouldThrowException() {
AttributeMap attributeMap = AttributeMap.builder()
.put(PROTOCOL, Protocol.HTTP2)
.build();
- assertThatThrownBy(() -> AwsCrtAsyncHttpClient.builder().buildWithDefaults(attributeMap))
+ assertThatThrownBy(() -> AwsCrtHttpClient.builder().buildWithDefaults(attributeMap))
.isInstanceOf(UnsupportedOperationException.class);
}
@Test
public void sendRequest_withCollector_shouldCollectMetrics() throws Exception {
- try (SdkAsyncHttpClient client = AwsCrtAsyncHttpClient.builder().maxConcurrency(10).build()) {
- RecordingResponseHandler recorder = makeSimpleRequest(client);
- MetricCollection metrics = recorder.collector().collect();
+ try (SdkHttpClient client = AwsCrtHttpClient.builder().maxConcurrency(10).build()) {
+ MetricCollector collector = MetricCollector.create("test");
+ makeSimpleRequest(client, collector);
+ MetricCollection metrics = collector.collect();
assertThat(metrics.metricValues(HttpMetric.HTTP_CLIENT_NAME)).containsExactly("AwsCommonRuntime");
assertThat(metrics.metricValues(HttpMetric.MAX_CONCURRENCY)).containsExactly(10);
@@ -96,33 +98,31 @@ public void sendRequest_withCollector_shouldCollectMetrics() throws Exception {
@Test
public void sharedEventLoopGroup_closeOneClient_shouldNotAffectOtherClients() throws Exception {
- try (SdkAsyncHttpClient client = AwsCrtAsyncHttpClient.create()) {
- makeSimpleRequest(client);
+ try (SdkHttpClient client = AwsCrtHttpClient.create()) {
+ makeSimpleRequest(client, null);
}
- try (SdkAsyncHttpClient anotherClient = AwsCrtAsyncHttpClient.create()) {
- makeSimpleRequest(anotherClient);
+ try (SdkHttpClient anotherClient = AwsCrtHttpClient.create()) {
+ makeSimpleRequest(anotherClient, null);
}
}
/**
- * Make a simple async request and wait for it to finish.
+ * Make a simple request and wait for it to finish.
*
* @param client Client to make request with.
*/
- private RecordingResponseHandler makeSimpleRequest(SdkAsyncHttpClient client) throws Exception {
+ private HttpExecuteResponse makeSimpleRequest(SdkHttpClient client, MetricCollector metricCollector) throws Exception {
String body = randomAlphabetic(10);
URI uri = URI.create("http://localhost:" + mockServer.port());
stubFor(any(urlPathEqualTo("/")).willReturn(aResponse().withBody(body)));
SdkHttpRequest request = createRequest(uri);
- RecordingResponseHandler recorder = new RecordingResponseHandler();
- client.execute(AsyncExecuteRequest.builder()
- .request(request)
- .requestContentPublisher(createProvider(""))
- .responseHandler(recorder)
- .metricCollector(recorder.collector())
- .build());
- recorder.completeFuture().get(5, TimeUnit.SECONDS);
- return recorder;
+
+ HttpExecuteRequest.Builder executeRequestBuilder = HttpExecuteRequest.builder();
+ executeRequestBuilder.request(request)
+ .contentStreamProvider(() -> new ByteArrayInputStream(new byte[0]))
+ .metricCollector(metricCollector);
+ ExecutableHttpRequest executableRequest = client.prepareRequest(executeRequestBuilder.build());
+ return executableRequest.call();
}
}
diff --git a/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/H1ServerBehaviorTest.java b/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/H1SAsyncServerBehaviorTest.java
similarity index 95%
rename from http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/H1ServerBehaviorTest.java
rename to http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/H1SAsyncServerBehaviorTest.java
index 072983d96ca9..a9cda00dccf1 100644
--- a/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/H1ServerBehaviorTest.java
+++ b/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/H1SAsyncServerBehaviorTest.java
@@ -28,7 +28,7 @@
/**
* Testing the scenario where h1 server sends 5xx errors.
*/
-public class H1ServerBehaviorTest extends SdkAsyncHttpClientH1TestSuite {
+public class H1SAsyncServerBehaviorTest extends SdkAsyncHttpClientH1TestSuite {
@BeforeAll
public static void beforeAll() {
diff --git a/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/internal/CrtRequestExecutorTest.java b/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/internal/CrtRequestExecutorTest.java
index 5ef7cacda5e7..47379bfc35f3 100644
--- a/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/internal/CrtRequestExecutorTest.java
+++ b/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/internal/CrtRequestExecutorTest.java
@@ -69,12 +69,12 @@ public void teardown() {
@Test
public void acquireConnectionThrowException_shouldInvokeOnError() {
RuntimeException exception = new RuntimeException("error");
- CrtRequestContext context = CrtRequestContext.builder()
- .crtConnPool(connectionManager)
- .request(AsyncExecuteRequest.builder()
+ CrtAsyncRequestContext context = CrtAsyncRequestContext.builder()
+ .crtConnPool(connectionManager)
+ .request(AsyncExecuteRequest.builder()
.responseHandler(responseHandler)
.build())
- .build();
+ .build();
CompletableFuture completableFuture = new CompletableFuture<>();
Mockito.when(connectionManager.acquireConnection()).thenReturn(completableFuture);
@@ -94,7 +94,7 @@ public void acquireConnectionThrowException_shouldInvokeOnError() {
@Test
public void makeRequestThrowException_shouldInvokeOnError() {
CrtRuntimeException exception = new CrtRuntimeException("");
- CrtRequestContext context = crtRequestContext();
+ CrtAsyncRequestContext context = crtRequestContext();
CompletableFuture completableFuture = new CompletableFuture<>();
Mockito.when(connectionManager.acquireConnection()).thenReturn(completableFuture);
@@ -116,7 +116,7 @@ public void makeRequestThrowException_shouldInvokeOnError() {
@Test
public void makeRequest_success() {
- CrtRequestContext context = crtRequestContext();
+ CrtAsyncRequestContext context = crtRequestContext();
CompletableFuture completableFuture = new CompletableFuture<>();
Mockito.when(connectionManager.acquireConnection()).thenReturn(completableFuture);
completableFuture.complete(httpClientConnection);
@@ -127,12 +127,12 @@ public void makeRequest_success() {
@Test
public void cancelRequest_shouldInvokeOnError() {
- CrtRequestContext context = CrtRequestContext.builder()
- .crtConnPool(connectionManager)
- .request(AsyncExecuteRequest.builder()
+ CrtAsyncRequestContext context = CrtAsyncRequestContext.builder()
+ .crtConnPool(connectionManager)
+ .request(AsyncExecuteRequest.builder()
.responseHandler(responseHandler)
.build())
- .build();
+ .build();
CompletableFuture completableFuture = new CompletableFuture<>();
Mockito.when(connectionManager.acquireConnection()).thenReturn(completableFuture);
@@ -150,7 +150,7 @@ public void cancelRequest_shouldInvokeOnError() {
@Test
public void execute_AcquireConnectionFailure_shouldAlwaysWrapIOException() {
- CrtRequestContext context = crtRequestContext();
+ CrtAsyncRequestContext context = crtRequestContext();
RuntimeException exception = new RuntimeException("some failure");
CompletableFuture completableFuture = CompletableFutureUtils.failedFuture(exception);
@@ -163,7 +163,7 @@ public void execute_AcquireConnectionFailure_shouldAlwaysWrapIOException() {
@Test
public void executeRequest_failedOfIllegalStateException_shouldWrapIOException() {
IllegalStateException exception = new IllegalStateException("connection closed");
- CrtRequestContext context = crtRequestContext();
+ CrtAsyncRequestContext context = crtRequestContext();
CompletableFuture completableFuture = new CompletableFuture<>();
Mockito.when(connectionManager.acquireConnection()).thenReturn(completableFuture);
@@ -185,7 +185,7 @@ public void executeRequest_failedOfIllegalStateException_shouldWrapIOException()
@Test
public void executeRequest_failedOfRetryableHttpException_shouldWrapIOException() {
HttpException exception = new HttpException(0x080a); // AWS_ERROR_HTTP_CONNECTION_CLOSED
- CrtRequestContext context = crtRequestContext();
+ CrtAsyncRequestContext context = crtRequestContext();
CompletableFuture completableFuture = new CompletableFuture<>();
Mockito.when(connectionManager.acquireConnection()).thenReturn(completableFuture);
@@ -208,7 +208,7 @@ public void executeRequest_failedOfRetryableHttpException_shouldWrapIOException(
@Test
public void executeRequest_failedOfNonRetryableHttpException_shouldNotWrapIOException() {
HttpException exception = new HttpException(0x0801); // AWS_ERROR_HTTP_HEADER_NOT_FOUND
- CrtRequestContext context = crtRequestContext();
+ CrtAsyncRequestContext context = crtRequestContext();
CompletableFuture completableFuture = new CompletableFuture<>();
Mockito.when(connectionManager.acquireConnection()).thenReturn(completableFuture);
@@ -227,17 +227,17 @@ public void executeRequest_failedOfNonRetryableHttpException_shouldNotWrapIOExce
assertThatThrownBy(executeFuture::join).hasCause(exception);
}
- private CrtRequestContext crtRequestContext() {
+ private CrtAsyncRequestContext crtRequestContext() {
SdkHttpFullRequest request = createRequest(URI.create("http://localhost"));
- return CrtRequestContext.builder()
- .readBufferSize(2000)
- .crtConnPool(connectionManager)
- .request(AsyncExecuteRequest.builder()
+ return CrtAsyncRequestContext.builder()
+ .readBufferSize(2000)
+ .crtConnPool(connectionManager)
+ .request(AsyncExecuteRequest.builder()
.request(request)
.requestContentPublisher(createProvider(""))
.responseHandler(responseHandler)
.build())
- .build();
+ .build();
}
}
diff --git a/http-clients/netty-nio-client/pom.xml b/http-clients/netty-nio-client/pom.xml
index 2e09825e3c5a..a69a9b84be7f 100644
--- a/http-clients/netty-nio-client/pom.xml
+++ b/http-clients/netty-nio-client/pom.xml
@@ -20,7 +20,7 @@
http-clients
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
4.0.0
diff --git a/http-clients/pom.xml b/http-clients/pom.xml
index 161eaadbbc8c..626fc26c5540 100644
--- a/http-clients/pom.xml
+++ b/http-clients/pom.xml
@@ -21,7 +21,7 @@
aws-sdk-java-pom
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
4.0.0
diff --git a/http-clients/url-connection-client/pom.xml b/http-clients/url-connection-client/pom.xml
index 677795879887..84af550e10d7 100644
--- a/http-clients/url-connection-client/pom.xml
+++ b/http-clients/url-connection-client/pom.xml
@@ -20,7 +20,7 @@
http-clients
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
4.0.0
diff --git a/http-clients/url-connection-client/src/test/java/software/amazon/awssdk/http/urlconnection/UrlConnectionHttpClientWireMockTest.java b/http-clients/url-connection-client/src/test/java/software/amazon/awssdk/http/urlconnection/UrlConnectionHttpClientWireMockTest.java
index d6c18616c6b4..05fdd709b28d 100644
--- a/http-clients/url-connection-client/src/test/java/software/amazon/awssdk/http/urlconnection/UrlConnectionHttpClientWireMockTest.java
+++ b/http-clients/url-connection-client/src/test/java/software/amazon/awssdk/http/urlconnection/UrlConnectionHttpClientWireMockTest.java
@@ -100,7 +100,7 @@ public void hasTransferEncodingHeader_shouldBeSet() throws IOException {
stubForMockRequest(200);
- SdkHttpFullRequest req = mockSdkRequest("http://localhost:" + mockServer.port(), SdkHttpMethod.POST);
+ SdkHttpFullRequest req = mockSdkRequest("http://localhost:" + mockServer.port(), SdkHttpMethod.POST, true);
req = req.toBuilder().putHeader(TRANSFER_ENCODING, CHUNKED).build();
HttpExecuteResponse rsp = client.prepareRequest(HttpExecuteRequest.builder()
.request(req)
diff --git a/http-clients/url-connection-client/src/test/resources/jetty-logging.properties b/http-clients/url-connection-client/src/test/resources/jetty-logging.properties
new file mode 100644
index 000000000000..4ee410e7fa92
--- /dev/null
+++ b/http-clients/url-connection-client/src/test/resources/jetty-logging.properties
@@ -0,0 +1,18 @@
+#
+# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License").
+# You may not use this file except in compliance with the License.
+# A copy of the License is located at
+#
+# http://aws.amazon.com/apache2.0
+#
+# or in the "license" file accompanying this file. This file is distributed
+# on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+# express or implied. See the License for the specific language governing
+# permissions and limitations under the License.
+#
+
+# Set up logging implementation
+org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
+org.eclipse.jetty.LEVEL=OFF
diff --git a/http-clients/url-connection-client/src/test/resources/log4j2.properties b/http-clients/url-connection-client/src/test/resources/log4j2.properties
new file mode 100644
index 000000000000..340e7c449d54
--- /dev/null
+++ b/http-clients/url-connection-client/src/test/resources/log4j2.properties
@@ -0,0 +1,38 @@
+#
+# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License").
+# You may not use this file except in compliance with the License.
+# A copy of the License is located at
+#
+# http://aws.amazon.com/apache2.0
+#
+# or in the "license" file accompanying this file. This file is distributed
+# on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+# express or implied. See the License for the specific language governing
+# permissions and limitations under the License.
+#
+
+status = warn
+
+appender.console.type = Console
+appender.console.name = ConsoleAppender
+appender.console.layout.type = PatternLayout
+appender.console.layout.pattern = %d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n%throwable
+
+rootLogger.level = debug
+rootLogger.appenderRef.stdout.ref = ConsoleAppender
+
+# Uncomment below to enable more specific logging
+#
+#logger.sdk.name = software.amazon.awssdk
+#logger.sdk.level = debug
+#
+#logger.request.name = software.amazon.awssdk.request
+#logger.request.level = debug
+#
+#logger.apache.name = org.apache.http.wire
+#logger.apache.level = debug
+#
+#logger.netty.name = io.netty.handler.logging
+#logger.netty.level = debug
diff --git a/metric-publishers/cloudwatch-metric-publisher/pom.xml b/metric-publishers/cloudwatch-metric-publisher/pom.xml
index 8c3e60bbec7a..8cc8359608bb 100644
--- a/metric-publishers/cloudwatch-metric-publisher/pom.xml
+++ b/metric-publishers/cloudwatch-metric-publisher/pom.xml
@@ -17,7 +17,7 @@
software.amazon.awssdk
metric-publishers
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
cloudwatch-metric-publisher
diff --git a/metric-publishers/pom.xml b/metric-publishers/pom.xml
index faa332f7c009..e37be54dad49 100644
--- a/metric-publishers/pom.xml
+++ b/metric-publishers/pom.xml
@@ -17,7 +17,7 @@
software.amazon.awssdk
aws-sdk-java-pom
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
metric-publishers
diff --git a/pom.xml b/pom.xml
index f0781b37ca30..1fd253b5a96a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -20,7 +20,7 @@
4.0.0
software.amazon.awssdk
aws-sdk-java-pom
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
pom
AWS Java SDK :: Parent
The Amazon Web Services SDK for Java provides Java APIs
diff --git a/release-scripts/pom.xml b/release-scripts/pom.xml
index 87534bb2f9a8..4f7653f542d9 100644
--- a/release-scripts/pom.xml
+++ b/release-scripts/pom.xml
@@ -22,7 +22,7 @@
software.amazon.awssdk
aws-sdk-java-pom
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
../pom.xml
release-scripts
diff --git a/services-custom/dynamodb-enhanced/pom.xml b/services-custom/dynamodb-enhanced/pom.xml
index 61cf7e345806..8cdc2b58adf2 100644
--- a/services-custom/dynamodb-enhanced/pom.xml
+++ b/services-custom/dynamodb-enhanced/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services-custom
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
dynamodb-enhanced
AWS Java SDK :: DynamoDB :: Enhanced Client
diff --git a/services-custom/iam-policy-builder/pom.xml b/services-custom/iam-policy-builder/pom.xml
index 537576e970db..7d3abdc348d6 100644
--- a/services-custom/iam-policy-builder/pom.xml
+++ b/services-custom/iam-policy-builder/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
aws-sdk-java-pom
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
../../pom.xml
iam-policy-builder
diff --git a/services-custom/pom.xml b/services-custom/pom.xml
index ba6fbc75c571..efccb46d8013 100644
--- a/services-custom/pom.xml
+++ b/services-custom/pom.xml
@@ -19,7 +19,7 @@
software.amazon.awssdk
aws-sdk-java-pom
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
services-custom
AWS Java SDK :: Custom Services
diff --git a/services-custom/s3-transfer-manager/pom.xml b/services-custom/s3-transfer-manager/pom.xml
index 49fcbf8238c3..a6572d62c289 100644
--- a/services-custom/s3-transfer-manager/pom.xml
+++ b/services-custom/s3-transfer-manager/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
aws-sdk-java-pom
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
../../pom.xml
s3-transfer-manager
diff --git a/services/accessanalyzer/pom.xml b/services/accessanalyzer/pom.xml
index d996235284f5..3faab589501d 100644
--- a/services/accessanalyzer/pom.xml
+++ b/services/accessanalyzer/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
accessanalyzer
AWS Java SDK :: Services :: AccessAnalyzer
diff --git a/services/account/pom.xml b/services/account/pom.xml
index a40c13117eda..88f4f93bd7f3 100644
--- a/services/account/pom.xml
+++ b/services/account/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
account
AWS Java SDK :: Services :: Account
diff --git a/services/acm/pom.xml b/services/acm/pom.xml
index d921fb9abe6d..e6df0761d193 100644
--- a/services/acm/pom.xml
+++ b/services/acm/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
acm
AWS Java SDK :: Services :: AWS Certificate Manager
diff --git a/services/acmpca/pom.xml b/services/acmpca/pom.xml
index 128d9c8e0517..4fce1342ac5c 100644
--- a/services/acmpca/pom.xml
+++ b/services/acmpca/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
acmpca
AWS Java SDK :: Services :: ACM PCA
diff --git a/services/alexaforbusiness/pom.xml b/services/alexaforbusiness/pom.xml
index 5c5deb1ca369..274d8fde52da 100644
--- a/services/alexaforbusiness/pom.xml
+++ b/services/alexaforbusiness/pom.xml
@@ -20,7 +20,7 @@
services
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
4.0.0
alexaforbusiness
diff --git a/services/amp/pom.xml b/services/amp/pom.xml
index fb5d30c777a5..3996aa8c0a06 100644
--- a/services/amp/pom.xml
+++ b/services/amp/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
amp
AWS Java SDK :: Services :: Amp
diff --git a/services/amplify/pom.xml b/services/amplify/pom.xml
index 72f5290991aa..0fe728e63d82 100644
--- a/services/amplify/pom.xml
+++ b/services/amplify/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
amplify
AWS Java SDK :: Services :: Amplify
diff --git a/services/amplifybackend/pom.xml b/services/amplifybackend/pom.xml
index 93291f1f5b51..00ed07333bbd 100644
--- a/services/amplifybackend/pom.xml
+++ b/services/amplifybackend/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
amplifybackend
AWS Java SDK :: Services :: Amplify Backend
diff --git a/services/amplifyuibuilder/pom.xml b/services/amplifyuibuilder/pom.xml
index e288cf7373d0..b3df2a57b81a 100644
--- a/services/amplifyuibuilder/pom.xml
+++ b/services/amplifyuibuilder/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
amplifyuibuilder
AWS Java SDK :: Services :: Amplify UI Builder
diff --git a/services/apigateway/pom.xml b/services/apigateway/pom.xml
index 11c3f0cb2e8b..9f721a5b0411 100644
--- a/services/apigateway/pom.xml
+++ b/services/apigateway/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
apigateway
AWS Java SDK :: Services :: Amazon API Gateway
diff --git a/services/apigatewaymanagementapi/pom.xml b/services/apigatewaymanagementapi/pom.xml
index 6e353eba5d7e..cf6c60135ebc 100644
--- a/services/apigatewaymanagementapi/pom.xml
+++ b/services/apigatewaymanagementapi/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
apigatewaymanagementapi
AWS Java SDK :: Services :: ApiGatewayManagementApi
diff --git a/services/apigatewayv2/pom.xml b/services/apigatewayv2/pom.xml
index d1b9dd78f139..78f3daf144ae 100644
--- a/services/apigatewayv2/pom.xml
+++ b/services/apigatewayv2/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
apigatewayv2
AWS Java SDK :: Services :: ApiGatewayV2
diff --git a/services/appconfig/pom.xml b/services/appconfig/pom.xml
index 2618a02e4dc8..0c57802b92e7 100644
--- a/services/appconfig/pom.xml
+++ b/services/appconfig/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
appconfig
AWS Java SDK :: Services :: AppConfig
diff --git a/services/appconfigdata/pom.xml b/services/appconfigdata/pom.xml
index c45134454e55..f85bbcd89403 100644
--- a/services/appconfigdata/pom.xml
+++ b/services/appconfigdata/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
appconfigdata
AWS Java SDK :: Services :: App Config Data
diff --git a/services/appfabric/pom.xml b/services/appfabric/pom.xml
index 3fe43ce1e34e..5ca84fa1c154 100644
--- a/services/appfabric/pom.xml
+++ b/services/appfabric/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
appfabric
AWS Java SDK :: Services :: App Fabric
diff --git a/services/appflow/pom.xml b/services/appflow/pom.xml
index 321d020a3b96..7f3f795758ab 100644
--- a/services/appflow/pom.xml
+++ b/services/appflow/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
appflow
AWS Java SDK :: Services :: Appflow
diff --git a/services/appintegrations/pom.xml b/services/appintegrations/pom.xml
index 59b5fa44e50a..6308471c0855 100644
--- a/services/appintegrations/pom.xml
+++ b/services/appintegrations/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
appintegrations
AWS Java SDK :: Services :: App Integrations
diff --git a/services/applicationautoscaling/pom.xml b/services/applicationautoscaling/pom.xml
index a47220aacfe2..8c4f349cf48b 100644
--- a/services/applicationautoscaling/pom.xml
+++ b/services/applicationautoscaling/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
applicationautoscaling
AWS Java SDK :: Services :: AWS Application Auto Scaling
diff --git a/services/applicationcostprofiler/pom.xml b/services/applicationcostprofiler/pom.xml
index f1c17eb69b08..a6b8e3aaa49b 100644
--- a/services/applicationcostprofiler/pom.xml
+++ b/services/applicationcostprofiler/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
applicationcostprofiler
AWS Java SDK :: Services :: Application Cost Profiler
diff --git a/services/applicationdiscovery/pom.xml b/services/applicationdiscovery/pom.xml
index 71539930cbab..f9faf4d6e157 100644
--- a/services/applicationdiscovery/pom.xml
+++ b/services/applicationdiscovery/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
applicationdiscovery
AWS Java SDK :: Services :: AWS Application Discovery Service
diff --git a/services/applicationinsights/pom.xml b/services/applicationinsights/pom.xml
index 29c93df742ed..698fc8b14ae3 100644
--- a/services/applicationinsights/pom.xml
+++ b/services/applicationinsights/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
applicationinsights
AWS Java SDK :: Services :: Application Insights
diff --git a/services/appmesh/pom.xml b/services/appmesh/pom.xml
index 2713601a44c0..f2d5481920c6 100644
--- a/services/appmesh/pom.xml
+++ b/services/appmesh/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
appmesh
AWS Java SDK :: Services :: App Mesh
diff --git a/services/apprunner/pom.xml b/services/apprunner/pom.xml
index 08086a6cb179..3d7ff6afe495 100644
--- a/services/apprunner/pom.xml
+++ b/services/apprunner/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
apprunner
AWS Java SDK :: Services :: App Runner
diff --git a/services/appstream/pom.xml b/services/appstream/pom.xml
index 3c8aac2f2f07..41eabde2af49 100644
--- a/services/appstream/pom.xml
+++ b/services/appstream/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
appstream
AWS Java SDK :: Services :: Amazon AppStream
diff --git a/services/appsync/pom.xml b/services/appsync/pom.xml
index 242099154e5e..235a3ed8fdba 100644
--- a/services/appsync/pom.xml
+++ b/services/appsync/pom.xml
@@ -21,7 +21,7 @@
services
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
appsync
diff --git a/services/arczonalshift/pom.xml b/services/arczonalshift/pom.xml
index 2bdb613eeaa6..1dfe46506b58 100644
--- a/services/arczonalshift/pom.xml
+++ b/services/arczonalshift/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
arczonalshift
AWS Java SDK :: Services :: ARC Zonal Shift
diff --git a/services/athena/pom.xml b/services/athena/pom.xml
index b7cef4acb720..edf0a883d87c 100644
--- a/services/athena/pom.xml
+++ b/services/athena/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
athena
AWS Java SDK :: Services :: Amazon Athena
diff --git a/services/auditmanager/pom.xml b/services/auditmanager/pom.xml
index a6537a5e2ee8..7d73b7367aa6 100644
--- a/services/auditmanager/pom.xml
+++ b/services/auditmanager/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
auditmanager
AWS Java SDK :: Services :: Audit Manager
diff --git a/services/autoscaling/pom.xml b/services/autoscaling/pom.xml
index 61cbeef801f7..40017fe99833 100644
--- a/services/autoscaling/pom.xml
+++ b/services/autoscaling/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
autoscaling
AWS Java SDK :: Services :: Auto Scaling
diff --git a/services/autoscalingplans/pom.xml b/services/autoscalingplans/pom.xml
index cbc5aa8c7aba..13239a228fc8 100644
--- a/services/autoscalingplans/pom.xml
+++ b/services/autoscalingplans/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
autoscalingplans
AWS Java SDK :: Services :: Auto Scaling Plans
diff --git a/services/b2bi/pom.xml b/services/b2bi/pom.xml
index d52008a1336a..5752e92580b2 100644
--- a/services/b2bi/pom.xml
+++ b/services/b2bi/pom.xml
@@ -17,7 +17,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
b2bi
AWS Java SDK :: Services :: B2 Bi
diff --git a/services/backup/pom.xml b/services/backup/pom.xml
index 26fbe5545700..8bb04c3e61e9 100644
--- a/services/backup/pom.xml
+++ b/services/backup/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
backup
AWS Java SDK :: Services :: Backup
diff --git a/services/backupgateway/pom.xml b/services/backupgateway/pom.xml
index 5569d6e7b9b0..d940cb6f66ff 100644
--- a/services/backupgateway/pom.xml
+++ b/services/backupgateway/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
backupgateway
AWS Java SDK :: Services :: Backup Gateway
diff --git a/services/backupstorage/pom.xml b/services/backupstorage/pom.xml
index 0baf4d95aa80..113a675c2a10 100644
--- a/services/backupstorage/pom.xml
+++ b/services/backupstorage/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
backupstorage
AWS Java SDK :: Services :: Backup Storage
diff --git a/services/batch/pom.xml b/services/batch/pom.xml
index b5991a502a73..f2f0a9fae857 100644
--- a/services/batch/pom.xml
+++ b/services/batch/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
batch
AWS Java SDK :: Services :: AWS Batch
diff --git a/services/bcmdataexports/pom.xml b/services/bcmdataexports/pom.xml
index c4036850f5d9..85f995c12698 100644
--- a/services/bcmdataexports/pom.xml
+++ b/services/bcmdataexports/pom.xml
@@ -17,7 +17,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
bcmdataexports
AWS Java SDK :: Services :: BCM Data Exports
diff --git a/services/bedrock/pom.xml b/services/bedrock/pom.xml
index 2fec07928987..c60e50565285 100644
--- a/services/bedrock/pom.xml
+++ b/services/bedrock/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
bedrock
AWS Java SDK :: Services :: Bedrock
diff --git a/services/bedrockagent/pom.xml b/services/bedrockagent/pom.xml
index 53bb084c6993..d447675c0391 100644
--- a/services/bedrockagent/pom.xml
+++ b/services/bedrockagent/pom.xml
@@ -17,7 +17,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
bedrockagent
AWS Java SDK :: Services :: Bedrock Agent
diff --git a/services/bedrockagentruntime/pom.xml b/services/bedrockagentruntime/pom.xml
index 86a7b747d2c6..c86531ed9576 100644
--- a/services/bedrockagentruntime/pom.xml
+++ b/services/bedrockagentruntime/pom.xml
@@ -17,7 +17,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
bedrockagentruntime
AWS Java SDK :: Services :: Bedrock Agent Runtime
diff --git a/services/bedrockruntime/pom.xml b/services/bedrockruntime/pom.xml
index 248da9ef7b60..ef884d6186d9 100644
--- a/services/bedrockruntime/pom.xml
+++ b/services/bedrockruntime/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
bedrockruntime
AWS Java SDK :: Services :: Bedrock Runtime
diff --git a/services/billingconductor/pom.xml b/services/billingconductor/pom.xml
index 40b5cb5b4bb6..25de7e2a6ec6 100644
--- a/services/billingconductor/pom.xml
+++ b/services/billingconductor/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
billingconductor
AWS Java SDK :: Services :: Billingconductor
diff --git a/services/braket/pom.xml b/services/braket/pom.xml
index ad5aef4a6b09..5efa282d8e9c 100644
--- a/services/braket/pom.xml
+++ b/services/braket/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
braket
AWS Java SDK :: Services :: Braket
diff --git a/services/budgets/pom.xml b/services/budgets/pom.xml
index ef18ae34072c..2d5e1cb3347a 100644
--- a/services/budgets/pom.xml
+++ b/services/budgets/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
budgets
AWS Java SDK :: Services :: AWS Budgets
diff --git a/services/chime/pom.xml b/services/chime/pom.xml
index 338c3c3af859..013227f1515d 100644
--- a/services/chime/pom.xml
+++ b/services/chime/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
chime
AWS Java SDK :: Services :: Chime
diff --git a/services/chimesdkidentity/pom.xml b/services/chimesdkidentity/pom.xml
index 39cbe187d39c..1d28de3729bb 100644
--- a/services/chimesdkidentity/pom.xml
+++ b/services/chimesdkidentity/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
chimesdkidentity
AWS Java SDK :: Services :: Chime SDK Identity
diff --git a/services/chimesdkmediapipelines/pom.xml b/services/chimesdkmediapipelines/pom.xml
index a2fd811a6742..0da7af5a0458 100644
--- a/services/chimesdkmediapipelines/pom.xml
+++ b/services/chimesdkmediapipelines/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
chimesdkmediapipelines
AWS Java SDK :: Services :: Chime SDK Media Pipelines
diff --git a/services/chimesdkmeetings/pom.xml b/services/chimesdkmeetings/pom.xml
index 532a6d77ed54..be51dc90a64d 100644
--- a/services/chimesdkmeetings/pom.xml
+++ b/services/chimesdkmeetings/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
chimesdkmeetings
AWS Java SDK :: Services :: Chime SDK Meetings
diff --git a/services/chimesdkmessaging/pom.xml b/services/chimesdkmessaging/pom.xml
index ccf491819572..ef91e4cb15ee 100644
--- a/services/chimesdkmessaging/pom.xml
+++ b/services/chimesdkmessaging/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
chimesdkmessaging
AWS Java SDK :: Services :: Chime SDK Messaging
diff --git a/services/chimesdkvoice/pom.xml b/services/chimesdkvoice/pom.xml
index 84d1add94eb1..7ed619b7e3ad 100644
--- a/services/chimesdkvoice/pom.xml
+++ b/services/chimesdkvoice/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
chimesdkvoice
AWS Java SDK :: Services :: Chime SDK Voice
diff --git a/services/cleanrooms/pom.xml b/services/cleanrooms/pom.xml
index fe6643d5a395..55c86a3dd231 100644
--- a/services/cleanrooms/pom.xml
+++ b/services/cleanrooms/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
cleanrooms
AWS Java SDK :: Services :: Clean Rooms
diff --git a/services/cleanroomsml/pom.xml b/services/cleanroomsml/pom.xml
index 15abed25d0b3..c1916efe558c 100644
--- a/services/cleanroomsml/pom.xml
+++ b/services/cleanroomsml/pom.xml
@@ -17,7 +17,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
cleanroomsml
AWS Java SDK :: Services :: Clean Rooms ML
diff --git a/services/cloud9/pom.xml b/services/cloud9/pom.xml
index 35e85e9a93d2..40e3a9abef3f 100644
--- a/services/cloud9/pom.xml
+++ b/services/cloud9/pom.xml
@@ -20,7 +20,7 @@
services
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
4.0.0
cloud9
diff --git a/services/cloudcontrol/pom.xml b/services/cloudcontrol/pom.xml
index f798194a169f..698a78d9273a 100644
--- a/services/cloudcontrol/pom.xml
+++ b/services/cloudcontrol/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
cloudcontrol
AWS Java SDK :: Services :: Cloud Control
diff --git a/services/clouddirectory/pom.xml b/services/clouddirectory/pom.xml
index 15c09261cce1..4e2fc868a774 100644
--- a/services/clouddirectory/pom.xml
+++ b/services/clouddirectory/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
clouddirectory
AWS Java SDK :: Services :: Amazon CloudDirectory
diff --git a/services/cloudformation/pom.xml b/services/cloudformation/pom.xml
index 7c60164b0362..50ba63dfbae9 100644
--- a/services/cloudformation/pom.xml
+++ b/services/cloudformation/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
cloudformation
AWS Java SDK :: Services :: AWS CloudFormation
diff --git a/services/cloudfront/pom.xml b/services/cloudfront/pom.xml
index bfc17b1df555..38307560929c 100644
--- a/services/cloudfront/pom.xml
+++ b/services/cloudfront/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
cloudfront
AWS Java SDK :: Services :: Amazon CloudFront
diff --git a/services/cloudfrontkeyvaluestore/pom.xml b/services/cloudfrontkeyvaluestore/pom.xml
index ce0f7ee550f6..70cf4b907566 100644
--- a/services/cloudfrontkeyvaluestore/pom.xml
+++ b/services/cloudfrontkeyvaluestore/pom.xml
@@ -17,7 +17,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
cloudfrontkeyvaluestore
AWS Java SDK :: Services :: Cloud Front Key Value Store
diff --git a/services/cloudhsm/pom.xml b/services/cloudhsm/pom.xml
index b3364188ae49..07c1268b58f2 100644
--- a/services/cloudhsm/pom.xml
+++ b/services/cloudhsm/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
cloudhsm
AWS Java SDK :: Services :: AWS CloudHSM
diff --git a/services/cloudhsmv2/pom.xml b/services/cloudhsmv2/pom.xml
index 33888c8c693f..6e2a5bac5288 100644
--- a/services/cloudhsmv2/pom.xml
+++ b/services/cloudhsmv2/pom.xml
@@ -20,7 +20,7 @@
services
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
4.0.0
cloudhsmv2
diff --git a/services/cloudsearch/pom.xml b/services/cloudsearch/pom.xml
index f77f7a204da6..737c5e59f5c6 100644
--- a/services/cloudsearch/pom.xml
+++ b/services/cloudsearch/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
cloudsearch
AWS Java SDK :: Services :: Amazon CloudSearch
diff --git a/services/cloudsearchdomain/pom.xml b/services/cloudsearchdomain/pom.xml
index f07f41618dda..edb4353c1bec 100644
--- a/services/cloudsearchdomain/pom.xml
+++ b/services/cloudsearchdomain/pom.xml
@@ -22,7 +22,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
cloudsearchdomain
AWS Java SDK :: Services :: Amazon CloudSearch Domain
diff --git a/services/cloudtrail/pom.xml b/services/cloudtrail/pom.xml
index df6c9d8c0b35..34c8981ed8c8 100644
--- a/services/cloudtrail/pom.xml
+++ b/services/cloudtrail/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
cloudtrail
AWS Java SDK :: Services :: AWS CloudTrail
diff --git a/services/cloudtraildata/pom.xml b/services/cloudtraildata/pom.xml
index a6d5ad84949a..63e64dec08a1 100644
--- a/services/cloudtraildata/pom.xml
+++ b/services/cloudtraildata/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
cloudtraildata
AWS Java SDK :: Services :: Cloud Trail Data
diff --git a/services/cloudwatch/pom.xml b/services/cloudwatch/pom.xml
index ece7b54aa1b9..c195c8d1b036 100644
--- a/services/cloudwatch/pom.xml
+++ b/services/cloudwatch/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
cloudwatch
AWS Java SDK :: Services :: Amazon CloudWatch
diff --git a/services/cloudwatchevents/pom.xml b/services/cloudwatchevents/pom.xml
index c70b78b714f9..a9c7781d18ad 100644
--- a/services/cloudwatchevents/pom.xml
+++ b/services/cloudwatchevents/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
cloudwatchevents
AWS Java SDK :: Services :: Amazon CloudWatch Events
diff --git a/services/cloudwatchlogs/pom.xml b/services/cloudwatchlogs/pom.xml
index bbac2837211c..50767762d4b8 100644
--- a/services/cloudwatchlogs/pom.xml
+++ b/services/cloudwatchlogs/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
cloudwatchlogs
AWS Java SDK :: Services :: Amazon CloudWatch Logs
diff --git a/services/codeartifact/pom.xml b/services/codeartifact/pom.xml
index 2d64dfe3fcfc..4f7f3c50c5a4 100644
--- a/services/codeartifact/pom.xml
+++ b/services/codeartifact/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
codeartifact
AWS Java SDK :: Services :: Codeartifact
diff --git a/services/codebuild/pom.xml b/services/codebuild/pom.xml
index 488e5c857462..b37424782571 100644
--- a/services/codebuild/pom.xml
+++ b/services/codebuild/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
codebuild
AWS Java SDK :: Services :: AWS Code Build
diff --git a/services/codecatalyst/pom.xml b/services/codecatalyst/pom.xml
index 62b2eeca3d8c..82e4778821f4 100644
--- a/services/codecatalyst/pom.xml
+++ b/services/codecatalyst/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
codecatalyst
AWS Java SDK :: Services :: Code Catalyst
diff --git a/services/codecommit/pom.xml b/services/codecommit/pom.xml
index 7ef391e88cda..b2fbc246b8dd 100644
--- a/services/codecommit/pom.xml
+++ b/services/codecommit/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
codecommit
AWS Java SDK :: Services :: AWS CodeCommit
diff --git a/services/codedeploy/pom.xml b/services/codedeploy/pom.xml
index 1f9ac05a429b..5a66ace6a000 100644
--- a/services/codedeploy/pom.xml
+++ b/services/codedeploy/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
codedeploy
AWS Java SDK :: Services :: AWS CodeDeploy
diff --git a/services/codeguruprofiler/pom.xml b/services/codeguruprofiler/pom.xml
index 0e1f1efc7a21..548106ea617a 100644
--- a/services/codeguruprofiler/pom.xml
+++ b/services/codeguruprofiler/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
codeguruprofiler
AWS Java SDK :: Services :: CodeGuruProfiler
diff --git a/services/codegurureviewer/pom.xml b/services/codegurureviewer/pom.xml
index 36e3cc579d82..9629aa8a0ad4 100644
--- a/services/codegurureviewer/pom.xml
+++ b/services/codegurureviewer/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
codegurureviewer
AWS Java SDK :: Services :: CodeGuru Reviewer
diff --git a/services/codegurusecurity/pom.xml b/services/codegurusecurity/pom.xml
index 1243bb9ed9e1..4c2c2b07793d 100644
--- a/services/codegurusecurity/pom.xml
+++ b/services/codegurusecurity/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
codegurusecurity
AWS Java SDK :: Services :: Code Guru Security
diff --git a/services/codepipeline/pom.xml b/services/codepipeline/pom.xml
index 7c1bda61fe29..3230ecfd5df7 100644
--- a/services/codepipeline/pom.xml
+++ b/services/codepipeline/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
codepipeline
AWS Java SDK :: Services :: AWS CodePipeline
diff --git a/services/codestar/pom.xml b/services/codestar/pom.xml
index 9a0d7bba91c8..a6d28657dd86 100644
--- a/services/codestar/pom.xml
+++ b/services/codestar/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
codestar
AWS Java SDK :: Services :: AWS CodeStar
diff --git a/services/codestarconnections/pom.xml b/services/codestarconnections/pom.xml
index f73084fec682..c2faf0d946b1 100644
--- a/services/codestarconnections/pom.xml
+++ b/services/codestarconnections/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
codestarconnections
AWS Java SDK :: Services :: CodeStar connections
diff --git a/services/codestarnotifications/pom.xml b/services/codestarnotifications/pom.xml
index 2613eece8b0b..8b208631069e 100644
--- a/services/codestarnotifications/pom.xml
+++ b/services/codestarnotifications/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
codestarnotifications
AWS Java SDK :: Services :: Codestar Notifications
diff --git a/services/cognitoidentity/pom.xml b/services/cognitoidentity/pom.xml
index a0aa5e43b460..c1d8b6c82abb 100644
--- a/services/cognitoidentity/pom.xml
+++ b/services/cognitoidentity/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
cognitoidentity
AWS Java SDK :: Services :: Amazon Cognito Identity
diff --git a/services/cognitoidentityprovider/pom.xml b/services/cognitoidentityprovider/pom.xml
index 3e6174d09843..8842c9d449c3 100644
--- a/services/cognitoidentityprovider/pom.xml
+++ b/services/cognitoidentityprovider/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
cognitoidentityprovider
AWS Java SDK :: Services :: Amazon Cognito Identity Provider Service
diff --git a/services/cognitosync/pom.xml b/services/cognitosync/pom.xml
index 0798682a53e2..c7c48040f9c4 100644
--- a/services/cognitosync/pom.xml
+++ b/services/cognitosync/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
cognitosync
AWS Java SDK :: Services :: Amazon Cognito Sync
diff --git a/services/comprehend/pom.xml b/services/comprehend/pom.xml
index 2745969910bc..a84362f57937 100644
--- a/services/comprehend/pom.xml
+++ b/services/comprehend/pom.xml
@@ -20,7 +20,7 @@
services
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
4.0.0
comprehend
diff --git a/services/comprehendmedical/pom.xml b/services/comprehendmedical/pom.xml
index d2c65c4fc877..81cf3b5e57bc 100644
--- a/services/comprehendmedical/pom.xml
+++ b/services/comprehendmedical/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
comprehendmedical
AWS Java SDK :: Services :: ComprehendMedical
diff --git a/services/computeoptimizer/pom.xml b/services/computeoptimizer/pom.xml
index 0aa9ed6a7fa9..f6dfbd2ea7f9 100644
--- a/services/computeoptimizer/pom.xml
+++ b/services/computeoptimizer/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
computeoptimizer
AWS Java SDK :: Services :: Compute Optimizer
diff --git a/services/config/pom.xml b/services/config/pom.xml
index ef4e8f0124e7..18c8712138f6 100644
--- a/services/config/pom.xml
+++ b/services/config/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
config
AWS Java SDK :: Services :: AWS Config
diff --git a/services/connect/pom.xml b/services/connect/pom.xml
index 503244b1fe5c..57299c01f72e 100644
--- a/services/connect/pom.xml
+++ b/services/connect/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
connect
AWS Java SDK :: Services :: Connect
diff --git a/services/connectcampaigns/pom.xml b/services/connectcampaigns/pom.xml
index 88de73347ff4..a610e097930d 100644
--- a/services/connectcampaigns/pom.xml
+++ b/services/connectcampaigns/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
connectcampaigns
AWS Java SDK :: Services :: Connect Campaigns
diff --git a/services/connectcases/pom.xml b/services/connectcases/pom.xml
index 33967d521fd2..11fd3e7b3a37 100644
--- a/services/connectcases/pom.xml
+++ b/services/connectcases/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
connectcases
AWS Java SDK :: Services :: Connect Cases
diff --git a/services/connectcontactlens/pom.xml b/services/connectcontactlens/pom.xml
index 7395e23aede0..4747756a0e4d 100644
--- a/services/connectcontactlens/pom.xml
+++ b/services/connectcontactlens/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
connectcontactlens
AWS Java SDK :: Services :: Connect Contact Lens
diff --git a/services/connectparticipant/pom.xml b/services/connectparticipant/pom.xml
index 484258a00ff6..134dcffff814 100644
--- a/services/connectparticipant/pom.xml
+++ b/services/connectparticipant/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
connectparticipant
AWS Java SDK :: Services :: ConnectParticipant
diff --git a/services/controltower/pom.xml b/services/controltower/pom.xml
index c26f19a21205..71b966bccf19 100644
--- a/services/controltower/pom.xml
+++ b/services/controltower/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
controltower
AWS Java SDK :: Services :: Control Tower
diff --git a/services/costandusagereport/pom.xml b/services/costandusagereport/pom.xml
index c0ece2f22752..69ceaa302a90 100644
--- a/services/costandusagereport/pom.xml
+++ b/services/costandusagereport/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
costandusagereport
AWS Java SDK :: Services :: AWS Cost and Usage Report
diff --git a/services/costexplorer/pom.xml b/services/costexplorer/pom.xml
index e9209956fd52..35d48054a893 100644
--- a/services/costexplorer/pom.xml
+++ b/services/costexplorer/pom.xml
@@ -20,7 +20,7 @@
services
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
4.0.0
costexplorer
diff --git a/services/costoptimizationhub/pom.xml b/services/costoptimizationhub/pom.xml
index 422155720f80..4761fa0bd334 100644
--- a/services/costoptimizationhub/pom.xml
+++ b/services/costoptimizationhub/pom.xml
@@ -17,7 +17,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
costoptimizationhub
AWS Java SDK :: Services :: Cost Optimization Hub
diff --git a/services/customerprofiles/pom.xml b/services/customerprofiles/pom.xml
index ee9cb9a8b9d9..cb265457172e 100644
--- a/services/customerprofiles/pom.xml
+++ b/services/customerprofiles/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
customerprofiles
AWS Java SDK :: Services :: Customer Profiles
diff --git a/services/databasemigration/pom.xml b/services/databasemigration/pom.xml
index a62e06ccebcc..fed60a0a4b65 100644
--- a/services/databasemigration/pom.xml
+++ b/services/databasemigration/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
databasemigration
AWS Java SDK :: Services :: AWS Database Migration Service
diff --git a/services/databrew/pom.xml b/services/databrew/pom.xml
index 1308e34a2100..1a2c52f95064 100644
--- a/services/databrew/pom.xml
+++ b/services/databrew/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
databrew
AWS Java SDK :: Services :: Data Brew
diff --git a/services/dataexchange/pom.xml b/services/dataexchange/pom.xml
index 54061f5223f3..de2a8acc1a67 100644
--- a/services/dataexchange/pom.xml
+++ b/services/dataexchange/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
dataexchange
AWS Java SDK :: Services :: DataExchange
diff --git a/services/datapipeline/pom.xml b/services/datapipeline/pom.xml
index 3df691bd28e6..fe150ef0930b 100644
--- a/services/datapipeline/pom.xml
+++ b/services/datapipeline/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
datapipeline
AWS Java SDK :: Services :: AWS Data Pipeline
diff --git a/services/datasync/pom.xml b/services/datasync/pom.xml
index a572a54c8bfa..32fc9b3f9918 100644
--- a/services/datasync/pom.xml
+++ b/services/datasync/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
datasync
AWS Java SDK :: Services :: DataSync
diff --git a/services/datazone/pom.xml b/services/datazone/pom.xml
index 48c7043dea43..1261df2e6b05 100644
--- a/services/datazone/pom.xml
+++ b/services/datazone/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
datazone
AWS Java SDK :: Services :: Data Zone
diff --git a/services/dax/pom.xml b/services/dax/pom.xml
index 5dd3218f7385..4bee2f6bf6be 100644
--- a/services/dax/pom.xml
+++ b/services/dax/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
dax
AWS Java SDK :: Services :: Amazon DynamoDB Accelerator (DAX)
diff --git a/services/detective/pom.xml b/services/detective/pom.xml
index a3e39d94a1a9..d6bb565f8072 100644
--- a/services/detective/pom.xml
+++ b/services/detective/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
detective
AWS Java SDK :: Services :: Detective
diff --git a/services/devicefarm/pom.xml b/services/devicefarm/pom.xml
index 5ac2f767ed43..57a996396c88 100644
--- a/services/devicefarm/pom.xml
+++ b/services/devicefarm/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
devicefarm
AWS Java SDK :: Services :: AWS Device Farm
diff --git a/services/devopsguru/pom.xml b/services/devopsguru/pom.xml
index 0d05d4afce2f..b20bdb74b31c 100644
--- a/services/devopsguru/pom.xml
+++ b/services/devopsguru/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
devopsguru
AWS Java SDK :: Services :: Dev Ops Guru
diff --git a/services/directconnect/pom.xml b/services/directconnect/pom.xml
index bc8d900862f4..1adc2501f533 100644
--- a/services/directconnect/pom.xml
+++ b/services/directconnect/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
directconnect
AWS Java SDK :: Services :: AWS Direct Connect
diff --git a/services/directory/pom.xml b/services/directory/pom.xml
index 61cd0fbcfcfb..59edb099b9f2 100644
--- a/services/directory/pom.xml
+++ b/services/directory/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
directory
AWS Java SDK :: Services :: AWS Directory Service
diff --git a/services/dlm/pom.xml b/services/dlm/pom.xml
index 9f4727e90a3d..2c7477ba32b2 100644
--- a/services/dlm/pom.xml
+++ b/services/dlm/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
dlm
AWS Java SDK :: Services :: DLM
diff --git a/services/docdb/pom.xml b/services/docdb/pom.xml
index 9b555732773e..356d5612bf99 100644
--- a/services/docdb/pom.xml
+++ b/services/docdb/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
docdb
AWS Java SDK :: Services :: DocDB
diff --git a/services/docdbelastic/pom.xml b/services/docdbelastic/pom.xml
index 5ab66484f678..5db3693da2b6 100644
--- a/services/docdbelastic/pom.xml
+++ b/services/docdbelastic/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
docdbelastic
AWS Java SDK :: Services :: Doc DB Elastic
diff --git a/services/drs/pom.xml b/services/drs/pom.xml
index ed670ea27d94..fee3dc06bc5d 100644
--- a/services/drs/pom.xml
+++ b/services/drs/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
drs
AWS Java SDK :: Services :: Drs
diff --git a/services/dynamodb/pom.xml b/services/dynamodb/pom.xml
index ba900e448d8c..b307a69bd69f 100644
--- a/services/dynamodb/pom.xml
+++ b/services/dynamodb/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
dynamodb
AWS Java SDK :: Services :: Amazon DynamoDB
diff --git a/services/ebs/pom.xml b/services/ebs/pom.xml
index 98f74bf02908..7cf675801987 100644
--- a/services/ebs/pom.xml
+++ b/services/ebs/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
ebs
AWS Java SDK :: Services :: EBS
diff --git a/services/ec2/pom.xml b/services/ec2/pom.xml
index 0faeae5a3f4b..018a70e692f9 100644
--- a/services/ec2/pom.xml
+++ b/services/ec2/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
ec2
AWS Java SDK :: Services :: Amazon EC2
diff --git a/services/ec2instanceconnect/pom.xml b/services/ec2instanceconnect/pom.xml
index a9253b0cbb1b..6e5dfe87d880 100644
--- a/services/ec2instanceconnect/pom.xml
+++ b/services/ec2instanceconnect/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
ec2instanceconnect
AWS Java SDK :: Services :: EC2 Instance Connect
diff --git a/services/ecr/pom.xml b/services/ecr/pom.xml
index 07a27860f91e..5b6bda485917 100644
--- a/services/ecr/pom.xml
+++ b/services/ecr/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
ecr
AWS Java SDK :: Services :: Amazon EC2 Container Registry
diff --git a/services/ecrpublic/pom.xml b/services/ecrpublic/pom.xml
index 31ff2612e28a..96cf0c71403b 100644
--- a/services/ecrpublic/pom.xml
+++ b/services/ecrpublic/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
ecrpublic
AWS Java SDK :: Services :: ECR PUBLIC
diff --git a/services/ecs/pom.xml b/services/ecs/pom.xml
index 981ff1d698cc..8d84702883ab 100644
--- a/services/ecs/pom.xml
+++ b/services/ecs/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
ecs
AWS Java SDK :: Services :: Amazon EC2 Container Service
diff --git a/services/efs/pom.xml b/services/efs/pom.xml
index 01c073bc9c8d..71db4145531e 100644
--- a/services/efs/pom.xml
+++ b/services/efs/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
efs
AWS Java SDK :: Services :: Amazon Elastic File System
diff --git a/services/eks/pom.xml b/services/eks/pom.xml
index 6883ce17133e..a78fda5c40f9 100644
--- a/services/eks/pom.xml
+++ b/services/eks/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
eks
AWS Java SDK :: Services :: EKS
diff --git a/services/eksauth/pom.xml b/services/eksauth/pom.xml
index ac1cda43a9ac..39017903bd85 100644
--- a/services/eksauth/pom.xml
+++ b/services/eksauth/pom.xml
@@ -17,7 +17,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
eksauth
AWS Java SDK :: Services :: EKS Auth
diff --git a/services/elasticache/pom.xml b/services/elasticache/pom.xml
index ba290a749d39..2302fe447805 100644
--- a/services/elasticache/pom.xml
+++ b/services/elasticache/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
elasticache
AWS Java SDK :: Services :: Amazon ElastiCache
diff --git a/services/elasticbeanstalk/pom.xml b/services/elasticbeanstalk/pom.xml
index d5fc7be0b4a3..bdf19ef303fa 100644
--- a/services/elasticbeanstalk/pom.xml
+++ b/services/elasticbeanstalk/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
elasticbeanstalk
AWS Java SDK :: Services :: AWS Elastic Beanstalk
diff --git a/services/elasticinference/pom.xml b/services/elasticinference/pom.xml
index 079efb76f80d..8742a9ce3d84 100644
--- a/services/elasticinference/pom.xml
+++ b/services/elasticinference/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
elasticinference
AWS Java SDK :: Services :: Elastic Inference
diff --git a/services/elasticloadbalancing/pom.xml b/services/elasticloadbalancing/pom.xml
index bf139fb043cc..466e63e2b359 100644
--- a/services/elasticloadbalancing/pom.xml
+++ b/services/elasticloadbalancing/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
elasticloadbalancing
AWS Java SDK :: Services :: Elastic Load Balancing
diff --git a/services/elasticloadbalancingv2/pom.xml b/services/elasticloadbalancingv2/pom.xml
index 4742567cc488..55c007961fc6 100644
--- a/services/elasticloadbalancingv2/pom.xml
+++ b/services/elasticloadbalancingv2/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
elasticloadbalancingv2
AWS Java SDK :: Services :: Elastic Load Balancing V2
diff --git a/services/elasticsearch/pom.xml b/services/elasticsearch/pom.xml
index e9a9b2cdfecf..b58e5240f74e 100644
--- a/services/elasticsearch/pom.xml
+++ b/services/elasticsearch/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
elasticsearch
AWS Java SDK :: Services :: Amazon Elasticsearch Service
diff --git a/services/elastictranscoder/pom.xml b/services/elastictranscoder/pom.xml
index 4d1709809b49..9d010c58f3db 100644
--- a/services/elastictranscoder/pom.xml
+++ b/services/elastictranscoder/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
elastictranscoder
AWS Java SDK :: Services :: Amazon Elastic Transcoder
diff --git a/services/emr/pom.xml b/services/emr/pom.xml
index 772e4bb27dc5..5fe86bcc7a57 100644
--- a/services/emr/pom.xml
+++ b/services/emr/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
emr
AWS Java SDK :: Services :: Amazon EMR
diff --git a/services/emrcontainers/pom.xml b/services/emrcontainers/pom.xml
index 83fe8b1463d8..6fb395e574c2 100644
--- a/services/emrcontainers/pom.xml
+++ b/services/emrcontainers/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
emrcontainers
AWS Java SDK :: Services :: EMR Containers
diff --git a/services/emrserverless/pom.xml b/services/emrserverless/pom.xml
index cf64e29c2120..50487ba20a56 100644
--- a/services/emrserverless/pom.xml
+++ b/services/emrserverless/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
emrserverless
AWS Java SDK :: Services :: EMR Serverless
diff --git a/services/entityresolution/pom.xml b/services/entityresolution/pom.xml
index 7ce612fa0541..c801be3f2615 100644
--- a/services/entityresolution/pom.xml
+++ b/services/entityresolution/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
entityresolution
AWS Java SDK :: Services :: Entity Resolution
diff --git a/services/eventbridge/pom.xml b/services/eventbridge/pom.xml
index ae9c527f5069..0a3e226b7752 100644
--- a/services/eventbridge/pom.xml
+++ b/services/eventbridge/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
eventbridge
AWS Java SDK :: Services :: EventBridge
diff --git a/services/evidently/pom.xml b/services/evidently/pom.xml
index 4b0053647666..5ed92f641a33 100644
--- a/services/evidently/pom.xml
+++ b/services/evidently/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
evidently
AWS Java SDK :: Services :: Evidently
diff --git a/services/finspace/pom.xml b/services/finspace/pom.xml
index 14720255cae5..e9e35cba122b 100644
--- a/services/finspace/pom.xml
+++ b/services/finspace/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
finspace
AWS Java SDK :: Services :: Finspace
diff --git a/services/finspacedata/pom.xml b/services/finspacedata/pom.xml
index 725b53b4c1f4..00517bd607ce 100644
--- a/services/finspacedata/pom.xml
+++ b/services/finspacedata/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
finspacedata
AWS Java SDK :: Services :: Finspace Data
diff --git a/services/firehose/pom.xml b/services/firehose/pom.xml
index 053f6eaa264f..63793254b478 100644
--- a/services/firehose/pom.xml
+++ b/services/firehose/pom.xml
@@ -22,7 +22,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
firehose
AWS Java SDK :: Services :: Amazon Kinesis Firehose
diff --git a/services/fis/pom.xml b/services/fis/pom.xml
index 6bb1f2828e99..f63c550023fd 100644
--- a/services/fis/pom.xml
+++ b/services/fis/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
fis
AWS Java SDK :: Services :: Fis
diff --git a/services/fms/pom.xml b/services/fms/pom.xml
index 0bccaa71dfd5..e700195ac6c6 100644
--- a/services/fms/pom.xml
+++ b/services/fms/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
fms
AWS Java SDK :: Services :: FMS
diff --git a/services/forecast/pom.xml b/services/forecast/pom.xml
index fc91c372cf02..ff0d10971061 100644
--- a/services/forecast/pom.xml
+++ b/services/forecast/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
forecast
AWS Java SDK :: Services :: Forecast
diff --git a/services/forecastquery/pom.xml b/services/forecastquery/pom.xml
index d32243a1b356..0e168fe2bfe8 100644
--- a/services/forecastquery/pom.xml
+++ b/services/forecastquery/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
forecastquery
AWS Java SDK :: Services :: Forecastquery
diff --git a/services/frauddetector/pom.xml b/services/frauddetector/pom.xml
index 1c7ea031ded8..f30c61be2912 100644
--- a/services/frauddetector/pom.xml
+++ b/services/frauddetector/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
frauddetector
AWS Java SDK :: Services :: FraudDetector
diff --git a/services/freetier/pom.xml b/services/freetier/pom.xml
index 6ab54341eac0..06650376f8be 100644
--- a/services/freetier/pom.xml
+++ b/services/freetier/pom.xml
@@ -17,7 +17,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
freetier
AWS Java SDK :: Services :: Free Tier
diff --git a/services/fsx/pom.xml b/services/fsx/pom.xml
index 6d8c362ed87e..059bff9bf5be 100644
--- a/services/fsx/pom.xml
+++ b/services/fsx/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
fsx
AWS Java SDK :: Services :: FSx
diff --git a/services/gamelift/pom.xml b/services/gamelift/pom.xml
index 8ee68a4be220..f7987ebc0e0c 100644
--- a/services/gamelift/pom.xml
+++ b/services/gamelift/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
gamelift
AWS Java SDK :: Services :: AWS GameLift
diff --git a/services/glacier/pom.xml b/services/glacier/pom.xml
index 947e9029a623..b8fdd14b57d7 100644
--- a/services/glacier/pom.xml
+++ b/services/glacier/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
glacier
AWS Java SDK :: Services :: Amazon Glacier
diff --git a/services/globalaccelerator/pom.xml b/services/globalaccelerator/pom.xml
index 3ef80bbf089f..e372534fb2ee 100644
--- a/services/globalaccelerator/pom.xml
+++ b/services/globalaccelerator/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
globalaccelerator
AWS Java SDK :: Services :: Global Accelerator
diff --git a/services/glue/pom.xml b/services/glue/pom.xml
index 001b89c393f5..4434a93ec901 100644
--- a/services/glue/pom.xml
+++ b/services/glue/pom.xml
@@ -20,7 +20,7 @@
services
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
4.0.0
glue
diff --git a/services/grafana/pom.xml b/services/grafana/pom.xml
index 51e5c6a5e177..c59baf9140da 100644
--- a/services/grafana/pom.xml
+++ b/services/grafana/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
grafana
AWS Java SDK :: Services :: Grafana
diff --git a/services/greengrass/pom.xml b/services/greengrass/pom.xml
index b35fa62ae7d7..f52aeb586051 100644
--- a/services/greengrass/pom.xml
+++ b/services/greengrass/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
greengrass
AWS Java SDK :: Services :: AWS Greengrass
diff --git a/services/greengrassv2/pom.xml b/services/greengrassv2/pom.xml
index b352636a4378..0df17988de92 100644
--- a/services/greengrassv2/pom.xml
+++ b/services/greengrassv2/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
greengrassv2
AWS Java SDK :: Services :: Greengrass V2
diff --git a/services/groundstation/pom.xml b/services/groundstation/pom.xml
index 9c29ef772cba..9c689f41e7ea 100644
--- a/services/groundstation/pom.xml
+++ b/services/groundstation/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
groundstation
AWS Java SDK :: Services :: GroundStation
diff --git a/services/guardduty/pom.xml b/services/guardduty/pom.xml
index 149368affca4..c0df97c41183 100644
--- a/services/guardduty/pom.xml
+++ b/services/guardduty/pom.xml
@@ -20,7 +20,7 @@
services
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
4.0.0
guardduty
diff --git a/services/health/pom.xml b/services/health/pom.xml
index 51cdec7718da..e8d465890b6d 100644
--- a/services/health/pom.xml
+++ b/services/health/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
health
AWS Java SDK :: Services :: AWS Health APIs and Notifications
diff --git a/services/healthlake/pom.xml b/services/healthlake/pom.xml
index 69a3f9570165..79761cf4df42 100644
--- a/services/healthlake/pom.xml
+++ b/services/healthlake/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
healthlake
AWS Java SDK :: Services :: Health Lake
diff --git a/services/honeycode/pom.xml b/services/honeycode/pom.xml
index 283bb0557fc7..6728ea6dc46b 100644
--- a/services/honeycode/pom.xml
+++ b/services/honeycode/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
honeycode
AWS Java SDK :: Services :: Honeycode
diff --git a/services/iam/pom.xml b/services/iam/pom.xml
index 6cf11142c22d..363ce03c4402 100644
--- a/services/iam/pom.xml
+++ b/services/iam/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
iam
AWS Java SDK :: Services :: AWS IAM
diff --git a/services/identitystore/pom.xml b/services/identitystore/pom.xml
index d8df94ded4ad..04f6ece53c46 100644
--- a/services/identitystore/pom.xml
+++ b/services/identitystore/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
identitystore
AWS Java SDK :: Services :: Identitystore
diff --git a/services/imagebuilder/pom.xml b/services/imagebuilder/pom.xml
index ecadd82f4ff8..418e4f92b173 100644
--- a/services/imagebuilder/pom.xml
+++ b/services/imagebuilder/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
imagebuilder
AWS Java SDK :: Services :: Imagebuilder
diff --git a/services/inspector/pom.xml b/services/inspector/pom.xml
index 6867e8fadba9..26deb32af9d6 100644
--- a/services/inspector/pom.xml
+++ b/services/inspector/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
inspector
AWS Java SDK :: Services :: Amazon Inspector Service
diff --git a/services/inspector2/pom.xml b/services/inspector2/pom.xml
index 60f951439c02..515400164489 100644
--- a/services/inspector2/pom.xml
+++ b/services/inspector2/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
inspector2
AWS Java SDK :: Services :: Inspector2
diff --git a/services/inspectorscan/pom.xml b/services/inspectorscan/pom.xml
index 2dddcee03480..30bcdd98a81a 100644
--- a/services/inspectorscan/pom.xml
+++ b/services/inspectorscan/pom.xml
@@ -17,7 +17,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
inspectorscan
AWS Java SDK :: Services :: Inspector Scan
diff --git a/services/internetmonitor/pom.xml b/services/internetmonitor/pom.xml
index a8a7cecd6031..f988b2a15010 100644
--- a/services/internetmonitor/pom.xml
+++ b/services/internetmonitor/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
internetmonitor
AWS Java SDK :: Services :: Internet Monitor
diff --git a/services/iot/pom.xml b/services/iot/pom.xml
index 4d7bba0e0b00..9e2acf5d5c9d 100644
--- a/services/iot/pom.xml
+++ b/services/iot/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
iot
AWS Java SDK :: Services :: AWS IoT
diff --git a/services/iot1clickdevices/pom.xml b/services/iot1clickdevices/pom.xml
index 17042f4232ff..9468af58791f 100644
--- a/services/iot1clickdevices/pom.xml
+++ b/services/iot1clickdevices/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
iot1clickdevices
AWS Java SDK :: Services :: IoT 1Click Devices Service
diff --git a/services/iot1clickprojects/pom.xml b/services/iot1clickprojects/pom.xml
index 0e75dd8e1280..d87dd1eba3a9 100644
--- a/services/iot1clickprojects/pom.xml
+++ b/services/iot1clickprojects/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
iot1clickprojects
AWS Java SDK :: Services :: IoT 1Click Projects
diff --git a/services/iotanalytics/pom.xml b/services/iotanalytics/pom.xml
index 6c6e5007f43a..1a43e3f49ce5 100644
--- a/services/iotanalytics/pom.xml
+++ b/services/iotanalytics/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
iotanalytics
AWS Java SDK :: Services :: IoTAnalytics
diff --git a/services/iotdataplane/pom.xml b/services/iotdataplane/pom.xml
index d9a10f293996..459b2f6ecfdb 100644
--- a/services/iotdataplane/pom.xml
+++ b/services/iotdataplane/pom.xml
@@ -22,7 +22,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
iotdataplane
AWS Java SDK :: Services :: AWS IoT Data Plane
diff --git a/services/iotdeviceadvisor/pom.xml b/services/iotdeviceadvisor/pom.xml
index af4a5c6bb56b..6e2109198e52 100644
--- a/services/iotdeviceadvisor/pom.xml
+++ b/services/iotdeviceadvisor/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
iotdeviceadvisor
AWS Java SDK :: Services :: Iot Device Advisor
diff --git a/services/iotevents/pom.xml b/services/iotevents/pom.xml
index c6b21977b95a..ccb18b9ea128 100644
--- a/services/iotevents/pom.xml
+++ b/services/iotevents/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
iotevents
AWS Java SDK :: Services :: IoT Events
diff --git a/services/ioteventsdata/pom.xml b/services/ioteventsdata/pom.xml
index b82623191d79..51324b777ccd 100644
--- a/services/ioteventsdata/pom.xml
+++ b/services/ioteventsdata/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
ioteventsdata
AWS Java SDK :: Services :: IoT Events Data
diff --git a/services/iotfleethub/pom.xml b/services/iotfleethub/pom.xml
index a21b8c097670..d02d086b5623 100644
--- a/services/iotfleethub/pom.xml
+++ b/services/iotfleethub/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
iotfleethub
AWS Java SDK :: Services :: Io T Fleet Hub
diff --git a/services/iotfleetwise/pom.xml b/services/iotfleetwise/pom.xml
index 5ad16c8d3af7..1957f4171d2c 100644
--- a/services/iotfleetwise/pom.xml
+++ b/services/iotfleetwise/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
iotfleetwise
AWS Java SDK :: Services :: Io T Fleet Wise
diff --git a/services/iotjobsdataplane/pom.xml b/services/iotjobsdataplane/pom.xml
index 32d811360ae2..831c4efe3b3c 100644
--- a/services/iotjobsdataplane/pom.xml
+++ b/services/iotjobsdataplane/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
iotjobsdataplane
AWS Java SDK :: Services :: IoT Jobs Data Plane
diff --git a/services/iotroborunner/pom.xml b/services/iotroborunner/pom.xml
index a299b285061e..f75b607cfee4 100644
--- a/services/iotroborunner/pom.xml
+++ b/services/iotroborunner/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
iotroborunner
AWS Java SDK :: Services :: IoT Robo Runner
diff --git a/services/iotsecuretunneling/pom.xml b/services/iotsecuretunneling/pom.xml
index 6727edbbd666..cf3ceb251726 100644
--- a/services/iotsecuretunneling/pom.xml
+++ b/services/iotsecuretunneling/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
iotsecuretunneling
AWS Java SDK :: Services :: IoTSecureTunneling
diff --git a/services/iotsitewise/pom.xml b/services/iotsitewise/pom.xml
index 80e0a486d5ed..41794c7d1c2b 100644
--- a/services/iotsitewise/pom.xml
+++ b/services/iotsitewise/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
iotsitewise
AWS Java SDK :: Services :: Io T Site Wise
diff --git a/services/iotthingsgraph/pom.xml b/services/iotthingsgraph/pom.xml
index 365bed1da3fd..b0ff1c6b6b1d 100644
--- a/services/iotthingsgraph/pom.xml
+++ b/services/iotthingsgraph/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
iotthingsgraph
AWS Java SDK :: Services :: IoTThingsGraph
diff --git a/services/iottwinmaker/pom.xml b/services/iottwinmaker/pom.xml
index 6856ff35da0a..de309b53e571 100644
--- a/services/iottwinmaker/pom.xml
+++ b/services/iottwinmaker/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
iottwinmaker
AWS Java SDK :: Services :: Io T Twin Maker
diff --git a/services/iotwireless/pom.xml b/services/iotwireless/pom.xml
index b2f75203a5ed..0238e641dcc8 100644
--- a/services/iotwireless/pom.xml
+++ b/services/iotwireless/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
iotwireless
AWS Java SDK :: Services :: IoT Wireless
diff --git a/services/ivs/pom.xml b/services/ivs/pom.xml
index 414b6d8e30ec..0860b306c41e 100644
--- a/services/ivs/pom.xml
+++ b/services/ivs/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
ivs
AWS Java SDK :: Services :: Ivs
diff --git a/services/ivschat/pom.xml b/services/ivschat/pom.xml
index 777eec02c2d2..ab113e9a0538 100644
--- a/services/ivschat/pom.xml
+++ b/services/ivschat/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
ivschat
AWS Java SDK :: Services :: Ivschat
diff --git a/services/ivsrealtime/pom.xml b/services/ivsrealtime/pom.xml
index 823a4f781fad..b3107fccb147 100644
--- a/services/ivsrealtime/pom.xml
+++ b/services/ivsrealtime/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
ivsrealtime
AWS Java SDK :: Services :: IVS Real Time
diff --git a/services/kafka/pom.xml b/services/kafka/pom.xml
index 4814694a6e94..853e70bf66f7 100644
--- a/services/kafka/pom.xml
+++ b/services/kafka/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
kafka
AWS Java SDK :: Services :: Kafka
diff --git a/services/kafkaconnect/pom.xml b/services/kafkaconnect/pom.xml
index e62334eb07ad..850535945619 100644
--- a/services/kafkaconnect/pom.xml
+++ b/services/kafkaconnect/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
kafkaconnect
AWS Java SDK :: Services :: Kafka Connect
diff --git a/services/kendra/pom.xml b/services/kendra/pom.xml
index 84358fc958d9..a2ab2938162d 100644
--- a/services/kendra/pom.xml
+++ b/services/kendra/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
kendra
AWS Java SDK :: Services :: Kendra
diff --git a/services/kendraranking/pom.xml b/services/kendraranking/pom.xml
index 72f37264f88f..b7b5d356e4b9 100644
--- a/services/kendraranking/pom.xml
+++ b/services/kendraranking/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
kendraranking
AWS Java SDK :: Services :: Kendra Ranking
diff --git a/services/keyspaces/pom.xml b/services/keyspaces/pom.xml
index f42d75257da4..467a6fefb7fe 100644
--- a/services/keyspaces/pom.xml
+++ b/services/keyspaces/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
keyspaces
AWS Java SDK :: Services :: Keyspaces
diff --git a/services/kinesis/pom.xml b/services/kinesis/pom.xml
index d6756e7b70cc..61267c60f0d1 100644
--- a/services/kinesis/pom.xml
+++ b/services/kinesis/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
kinesis
AWS Java SDK :: Services :: Amazon Kinesis
diff --git a/services/kinesisanalytics/pom.xml b/services/kinesisanalytics/pom.xml
index 78dcb159f3eb..8c31dc5281a8 100644
--- a/services/kinesisanalytics/pom.xml
+++ b/services/kinesisanalytics/pom.xml
@@ -22,7 +22,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
kinesisanalytics
AWS Java SDK :: Services :: Amazon Kinesis Analytics
diff --git a/services/kinesisanalyticsv2/pom.xml b/services/kinesisanalyticsv2/pom.xml
index ee3376fcf6fa..12a970985fcf 100644
--- a/services/kinesisanalyticsv2/pom.xml
+++ b/services/kinesisanalyticsv2/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
kinesisanalyticsv2
AWS Java SDK :: Services :: Kinesis Analytics V2
diff --git a/services/kinesisvideo/pom.xml b/services/kinesisvideo/pom.xml
index 3d60aafc40ea..0c758c3c0a92 100644
--- a/services/kinesisvideo/pom.xml
+++ b/services/kinesisvideo/pom.xml
@@ -20,7 +20,7 @@
services
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
4.0.0
kinesisvideo
diff --git a/services/kinesisvideoarchivedmedia/pom.xml b/services/kinesisvideoarchivedmedia/pom.xml
index 7deec72b351a..26d1cae7c284 100644
--- a/services/kinesisvideoarchivedmedia/pom.xml
+++ b/services/kinesisvideoarchivedmedia/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
kinesisvideoarchivedmedia
AWS Java SDK :: Services :: Kinesis Video Archived Media
diff --git a/services/kinesisvideomedia/pom.xml b/services/kinesisvideomedia/pom.xml
index e261c6397e07..e0575176c3e1 100644
--- a/services/kinesisvideomedia/pom.xml
+++ b/services/kinesisvideomedia/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
kinesisvideomedia
AWS Java SDK :: Services :: Kinesis Video Media
diff --git a/services/kinesisvideosignaling/pom.xml b/services/kinesisvideosignaling/pom.xml
index 7c77091abd6c..806a9914a245 100644
--- a/services/kinesisvideosignaling/pom.xml
+++ b/services/kinesisvideosignaling/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
kinesisvideosignaling
AWS Java SDK :: Services :: Kinesis Video Signaling
diff --git a/services/kinesisvideowebrtcstorage/pom.xml b/services/kinesisvideowebrtcstorage/pom.xml
index 076f8df9a5e8..9bda0a223d3d 100644
--- a/services/kinesisvideowebrtcstorage/pom.xml
+++ b/services/kinesisvideowebrtcstorage/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
kinesisvideowebrtcstorage
AWS Java SDK :: Services :: Kinesis Video Web RTC Storage
diff --git a/services/kms/pom.xml b/services/kms/pom.xml
index 4259e4d8667b..0e598c42a53c 100644
--- a/services/kms/pom.xml
+++ b/services/kms/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
kms
AWS Java SDK :: Services :: AWS KMS
diff --git a/services/lakeformation/pom.xml b/services/lakeformation/pom.xml
index 88ebb1aeabba..a59e212e1116 100644
--- a/services/lakeformation/pom.xml
+++ b/services/lakeformation/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
lakeformation
AWS Java SDK :: Services :: LakeFormation
diff --git a/services/lambda/pom.xml b/services/lambda/pom.xml
index db9b7e67b9d0..daa658dae927 100644
--- a/services/lambda/pom.xml
+++ b/services/lambda/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
lambda
AWS Java SDK :: Services :: AWS Lambda
diff --git a/services/launchwizard/pom.xml b/services/launchwizard/pom.xml
index 6eb51f15cc63..60af370fae60 100644
--- a/services/launchwizard/pom.xml
+++ b/services/launchwizard/pom.xml
@@ -17,7 +17,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
launchwizard
AWS Java SDK :: Services :: Launch Wizard
diff --git a/services/lexmodelbuilding/pom.xml b/services/lexmodelbuilding/pom.xml
index 8a268cf1bb46..0bcae2a9c355 100644
--- a/services/lexmodelbuilding/pom.xml
+++ b/services/lexmodelbuilding/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
lexmodelbuilding
AWS Java SDK :: Services :: Amazon Lex Model Building
diff --git a/services/lexmodelsv2/pom.xml b/services/lexmodelsv2/pom.xml
index f2c3268bcb38..adf8647e5908 100644
--- a/services/lexmodelsv2/pom.xml
+++ b/services/lexmodelsv2/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
lexmodelsv2
AWS Java SDK :: Services :: Lex Models V2
diff --git a/services/lexruntime/pom.xml b/services/lexruntime/pom.xml
index ff8f6020a956..b57b706ba3c5 100644
--- a/services/lexruntime/pom.xml
+++ b/services/lexruntime/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
lexruntime
AWS Java SDK :: Services :: Amazon Lex Runtime
diff --git a/services/lexruntimev2/pom.xml b/services/lexruntimev2/pom.xml
index 4ab30a5b4e4c..2fc1de67c2aa 100644
--- a/services/lexruntimev2/pom.xml
+++ b/services/lexruntimev2/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
lexruntimev2
AWS Java SDK :: Services :: Lex Runtime V2
diff --git a/services/licensemanager/pom.xml b/services/licensemanager/pom.xml
index 52c2abc6d112..c248342f416c 100644
--- a/services/licensemanager/pom.xml
+++ b/services/licensemanager/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
licensemanager
AWS Java SDK :: Services :: License Manager
diff --git a/services/licensemanagerlinuxsubscriptions/pom.xml b/services/licensemanagerlinuxsubscriptions/pom.xml
index ab14cebafa9a..06f8684a72d0 100644
--- a/services/licensemanagerlinuxsubscriptions/pom.xml
+++ b/services/licensemanagerlinuxsubscriptions/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
licensemanagerlinuxsubscriptions
AWS Java SDK :: Services :: License Manager Linux Subscriptions
diff --git a/services/licensemanagerusersubscriptions/pom.xml b/services/licensemanagerusersubscriptions/pom.xml
index 1528e455ed57..b5b605086d27 100644
--- a/services/licensemanagerusersubscriptions/pom.xml
+++ b/services/licensemanagerusersubscriptions/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
licensemanagerusersubscriptions
AWS Java SDK :: Services :: License Manager User Subscriptions
diff --git a/services/lightsail/pom.xml b/services/lightsail/pom.xml
index c2b032efa9fd..2566716086c8 100644
--- a/services/lightsail/pom.xml
+++ b/services/lightsail/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
lightsail
AWS Java SDK :: Services :: Amazon Lightsail
diff --git a/services/location/pom.xml b/services/location/pom.xml
index 7fda7b062ae2..18db2471b3be 100644
--- a/services/location/pom.xml
+++ b/services/location/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
location
AWS Java SDK :: Services :: Location
diff --git a/services/lookoutequipment/pom.xml b/services/lookoutequipment/pom.xml
index 87c375d01e99..273fad810d40 100644
--- a/services/lookoutequipment/pom.xml
+++ b/services/lookoutequipment/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
lookoutequipment
AWS Java SDK :: Services :: Lookout Equipment
diff --git a/services/lookoutmetrics/pom.xml b/services/lookoutmetrics/pom.xml
index 794e55c9e584..488ef06765d1 100644
--- a/services/lookoutmetrics/pom.xml
+++ b/services/lookoutmetrics/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
lookoutmetrics
AWS Java SDK :: Services :: Lookout Metrics
diff --git a/services/lookoutvision/pom.xml b/services/lookoutvision/pom.xml
index 97c0c74dc1a3..ce87293b9a37 100644
--- a/services/lookoutvision/pom.xml
+++ b/services/lookoutvision/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
lookoutvision
AWS Java SDK :: Services :: Lookout Vision
diff --git a/services/m2/pom.xml b/services/m2/pom.xml
index 0ba0c7792660..7f115e0502c2 100644
--- a/services/m2/pom.xml
+++ b/services/m2/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
m2
AWS Java SDK :: Services :: M2
diff --git a/services/machinelearning/pom.xml b/services/machinelearning/pom.xml
index 3ba7c33c0095..6571d67f795f 100644
--- a/services/machinelearning/pom.xml
+++ b/services/machinelearning/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
machinelearning
AWS Java SDK :: Services :: Amazon Machine Learning
diff --git a/services/macie2/pom.xml b/services/macie2/pom.xml
index 0679d8ca6a64..80935a1763de 100644
--- a/services/macie2/pom.xml
+++ b/services/macie2/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
macie2
AWS Java SDK :: Services :: Macie2
diff --git a/services/managedblockchain/pom.xml b/services/managedblockchain/pom.xml
index b059880f1c1a..6711fc1ca645 100644
--- a/services/managedblockchain/pom.xml
+++ b/services/managedblockchain/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
managedblockchain
AWS Java SDK :: Services :: ManagedBlockchain
diff --git a/services/managedblockchainquery/pom.xml b/services/managedblockchainquery/pom.xml
index 22991ccb7cc2..a93b5145493f 100644
--- a/services/managedblockchainquery/pom.xml
+++ b/services/managedblockchainquery/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
managedblockchainquery
AWS Java SDK :: Services :: Managed Blockchain Query
diff --git a/services/marketplaceagreement/pom.xml b/services/marketplaceagreement/pom.xml
index 169b9789267f..0859efaa6063 100644
--- a/services/marketplaceagreement/pom.xml
+++ b/services/marketplaceagreement/pom.xml
@@ -17,7 +17,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
marketplaceagreement
AWS Java SDK :: Services :: Marketplace Agreement
diff --git a/services/marketplacecatalog/pom.xml b/services/marketplacecatalog/pom.xml
index 59fc06c558c3..f563e98e05e6 100644
--- a/services/marketplacecatalog/pom.xml
+++ b/services/marketplacecatalog/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
marketplacecatalog
AWS Java SDK :: Services :: Marketplace Catalog
diff --git a/services/marketplacecommerceanalytics/pom.xml b/services/marketplacecommerceanalytics/pom.xml
index 99436f52e32d..622a2a6f1ddb 100644
--- a/services/marketplacecommerceanalytics/pom.xml
+++ b/services/marketplacecommerceanalytics/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
marketplacecommerceanalytics
AWS Java SDK :: Services :: AWS Marketplace Commerce Analytics
diff --git a/services/marketplacedeployment/pom.xml b/services/marketplacedeployment/pom.xml
index 3c187ba73467..aff8e54adcd7 100644
--- a/services/marketplacedeployment/pom.xml
+++ b/services/marketplacedeployment/pom.xml
@@ -17,7 +17,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
marketplacedeployment
AWS Java SDK :: Services :: Marketplace Deployment
diff --git a/services/marketplaceentitlement/pom.xml b/services/marketplaceentitlement/pom.xml
index f9cfe75bac81..822cbc82c01e 100644
--- a/services/marketplaceentitlement/pom.xml
+++ b/services/marketplaceentitlement/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
marketplaceentitlement
AWS Java SDK :: Services :: AWS Marketplace Entitlement
diff --git a/services/marketplacemetering/pom.xml b/services/marketplacemetering/pom.xml
index a23ffbfd55e9..dcf4ca6918a9 100644
--- a/services/marketplacemetering/pom.xml
+++ b/services/marketplacemetering/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
marketplacemetering
AWS Java SDK :: Services :: AWS Marketplace Metering Service
diff --git a/services/mediaconnect/pom.xml b/services/mediaconnect/pom.xml
index 25d093d83729..b59831ecf97f 100644
--- a/services/mediaconnect/pom.xml
+++ b/services/mediaconnect/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
mediaconnect
AWS Java SDK :: Services :: MediaConnect
diff --git a/services/mediaconvert/pom.xml b/services/mediaconvert/pom.xml
index c23a4b656a93..05ca695df201 100644
--- a/services/mediaconvert/pom.xml
+++ b/services/mediaconvert/pom.xml
@@ -20,7 +20,7 @@
services
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
4.0.0
mediaconvert
diff --git a/services/medialive/pom.xml b/services/medialive/pom.xml
index 5d46a6743b30..7f0163dd6b3e 100644
--- a/services/medialive/pom.xml
+++ b/services/medialive/pom.xml
@@ -20,7 +20,7 @@
services
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
4.0.0
medialive
diff --git a/services/mediapackage/pom.xml b/services/mediapackage/pom.xml
index 88e69b4593ea..5593f381d462 100644
--- a/services/mediapackage/pom.xml
+++ b/services/mediapackage/pom.xml
@@ -20,7 +20,7 @@
services
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
4.0.0
mediapackage
diff --git a/services/mediapackagev2/pom.xml b/services/mediapackagev2/pom.xml
index 8d432a6c5817..e49625c45512 100644
--- a/services/mediapackagev2/pom.xml
+++ b/services/mediapackagev2/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
mediapackagev2
AWS Java SDK :: Services :: Media Package V2
diff --git a/services/mediapackagevod/pom.xml b/services/mediapackagevod/pom.xml
index f823b9e1b3dc..844756eb029c 100644
--- a/services/mediapackagevod/pom.xml
+++ b/services/mediapackagevod/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
mediapackagevod
AWS Java SDK :: Services :: MediaPackage Vod
diff --git a/services/mediastore/pom.xml b/services/mediastore/pom.xml
index cfadefc4cd0c..9d359b3e5cd1 100644
--- a/services/mediastore/pom.xml
+++ b/services/mediastore/pom.xml
@@ -20,7 +20,7 @@
services
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
4.0.0
mediastore
diff --git a/services/mediastoredata/pom.xml b/services/mediastoredata/pom.xml
index ba05c498de5e..d022f5d4e577 100644
--- a/services/mediastoredata/pom.xml
+++ b/services/mediastoredata/pom.xml
@@ -20,7 +20,7 @@
services
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
4.0.0
mediastoredata
diff --git a/services/mediatailor/pom.xml b/services/mediatailor/pom.xml
index dcdfb444c489..c2d79fe5025a 100644
--- a/services/mediatailor/pom.xml
+++ b/services/mediatailor/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
mediatailor
AWS Java SDK :: Services :: MediaTailor
diff --git a/services/medicalimaging/pom.xml b/services/medicalimaging/pom.xml
index 9a0d6a3f1a58..9f1ec87146c6 100644
--- a/services/medicalimaging/pom.xml
+++ b/services/medicalimaging/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
medicalimaging
AWS Java SDK :: Services :: Medical Imaging
diff --git a/services/memorydb/pom.xml b/services/memorydb/pom.xml
index 2f03e01d2e36..d9efbd7a31d6 100644
--- a/services/memorydb/pom.xml
+++ b/services/memorydb/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
memorydb
AWS Java SDK :: Services :: Memory DB
diff --git a/services/mgn/pom.xml b/services/mgn/pom.xml
index 69a165d8eb2c..6153e941c477 100644
--- a/services/mgn/pom.xml
+++ b/services/mgn/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
mgn
AWS Java SDK :: Services :: Mgn
diff --git a/services/migrationhub/pom.xml b/services/migrationhub/pom.xml
index 6931aba6a4d4..2030e42f49b7 100644
--- a/services/migrationhub/pom.xml
+++ b/services/migrationhub/pom.xml
@@ -20,7 +20,7 @@
services
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
4.0.0
migrationhub
diff --git a/services/migrationhubconfig/pom.xml b/services/migrationhubconfig/pom.xml
index 0d81475d49ce..64f7e6558959 100644
--- a/services/migrationhubconfig/pom.xml
+++ b/services/migrationhubconfig/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
migrationhubconfig
AWS Java SDK :: Services :: MigrationHub Config
diff --git a/services/migrationhuborchestrator/pom.xml b/services/migrationhuborchestrator/pom.xml
index 7b0b76e9d86b..fa8d5107877e 100644
--- a/services/migrationhuborchestrator/pom.xml
+++ b/services/migrationhuborchestrator/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
migrationhuborchestrator
AWS Java SDK :: Services :: Migration Hub Orchestrator
diff --git a/services/migrationhubrefactorspaces/pom.xml b/services/migrationhubrefactorspaces/pom.xml
index 10283968174b..b503938f5cf7 100644
--- a/services/migrationhubrefactorspaces/pom.xml
+++ b/services/migrationhubrefactorspaces/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
migrationhubrefactorspaces
AWS Java SDK :: Services :: Migration Hub Refactor Spaces
diff --git a/services/migrationhubstrategy/pom.xml b/services/migrationhubstrategy/pom.xml
index e8d87c4fb978..33b255f2071a 100644
--- a/services/migrationhubstrategy/pom.xml
+++ b/services/migrationhubstrategy/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
migrationhubstrategy
AWS Java SDK :: Services :: Migration Hub Strategy
diff --git a/services/mobile/pom.xml b/services/mobile/pom.xml
index 7e51bed995c0..bb6c9806f1e5 100644
--- a/services/mobile/pom.xml
+++ b/services/mobile/pom.xml
@@ -20,7 +20,7 @@
services
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
4.0.0
mobile
diff --git a/services/mq/pom.xml b/services/mq/pom.xml
index 6f7468518fb2..5a69402117c0 100644
--- a/services/mq/pom.xml
+++ b/services/mq/pom.xml
@@ -20,7 +20,7 @@
services
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
4.0.0
mq
diff --git a/services/mturk/pom.xml b/services/mturk/pom.xml
index 2ba3297bf3c1..8868c9806b00 100644
--- a/services/mturk/pom.xml
+++ b/services/mturk/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
mturk
AWS Java SDK :: Services :: Amazon Mechanical Turk Requester
diff --git a/services/mwaa/pom.xml b/services/mwaa/pom.xml
index 9bf0309f57c3..e2024b1dfc48 100644
--- a/services/mwaa/pom.xml
+++ b/services/mwaa/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
mwaa
AWS Java SDK :: Services :: MWAA
diff --git a/services/neptune/pom.xml b/services/neptune/pom.xml
index 18feacb9237b..16a5284835f1 100644
--- a/services/neptune/pom.xml
+++ b/services/neptune/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
neptune
AWS Java SDK :: Services :: Neptune
diff --git a/services/neptunedata/pom.xml b/services/neptunedata/pom.xml
index eac455251d77..e7c8d8ad14ce 100644
--- a/services/neptunedata/pom.xml
+++ b/services/neptunedata/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
neptunedata
AWS Java SDK :: Services :: Neptunedata
diff --git a/services/neptunegraph/pom.xml b/services/neptunegraph/pom.xml
index 35429a701356..ce6e6df2cca2 100644
--- a/services/neptunegraph/pom.xml
+++ b/services/neptunegraph/pom.xml
@@ -17,7 +17,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
neptunegraph
AWS Java SDK :: Services :: Neptune Graph
diff --git a/services/networkfirewall/pom.xml b/services/networkfirewall/pom.xml
index 08dcf327d446..d6421d5de82a 100644
--- a/services/networkfirewall/pom.xml
+++ b/services/networkfirewall/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
networkfirewall
AWS Java SDK :: Services :: Network Firewall
diff --git a/services/networkmanager/pom.xml b/services/networkmanager/pom.xml
index 6a9d282231c3..c66eeea59aa3 100644
--- a/services/networkmanager/pom.xml
+++ b/services/networkmanager/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
networkmanager
AWS Java SDK :: Services :: NetworkManager
diff --git a/services/nimble/pom.xml b/services/nimble/pom.xml
index 1921d0513fd8..c0391ddd555b 100644
--- a/services/nimble/pom.xml
+++ b/services/nimble/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
nimble
AWS Java SDK :: Services :: Nimble
diff --git a/services/oam/pom.xml b/services/oam/pom.xml
index 2215b000a6c3..727578cae551 100644
--- a/services/oam/pom.xml
+++ b/services/oam/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
oam
AWS Java SDK :: Services :: OAM
diff --git a/services/omics/pom.xml b/services/omics/pom.xml
index ca4656a2d1fa..442539d4743f 100644
--- a/services/omics/pom.xml
+++ b/services/omics/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
omics
AWS Java SDK :: Services :: Omics
diff --git a/services/opensearch/pom.xml b/services/opensearch/pom.xml
index 3f3d4904e1e3..7f2724b95d27 100644
--- a/services/opensearch/pom.xml
+++ b/services/opensearch/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
opensearch
AWS Java SDK :: Services :: Open Search
diff --git a/services/opensearchserverless/pom.xml b/services/opensearchserverless/pom.xml
index 0fcb87e4991b..18aaf0667ee7 100644
--- a/services/opensearchserverless/pom.xml
+++ b/services/opensearchserverless/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
opensearchserverless
AWS Java SDK :: Services :: Open Search Serverless
diff --git a/services/opsworks/pom.xml b/services/opsworks/pom.xml
index b599681dd7d2..397262f47539 100644
--- a/services/opsworks/pom.xml
+++ b/services/opsworks/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
opsworks
AWS Java SDK :: Services :: AWS OpsWorks
diff --git a/services/opsworkscm/pom.xml b/services/opsworkscm/pom.xml
index b30aeb6aeabb..c2a4066dfc4b 100644
--- a/services/opsworkscm/pom.xml
+++ b/services/opsworkscm/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
opsworkscm
AWS Java SDK :: Services :: AWS OpsWorks for Chef Automate
diff --git a/services/organizations/pom.xml b/services/organizations/pom.xml
index b34856315d6d..0676ea05d372 100644
--- a/services/organizations/pom.xml
+++ b/services/organizations/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
organizations
AWS Java SDK :: Services :: AWS Organizations
diff --git a/services/osis/pom.xml b/services/osis/pom.xml
index cfaae4201f4e..99efa5d6f836 100644
--- a/services/osis/pom.xml
+++ b/services/osis/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
osis
AWS Java SDK :: Services :: OSIS
diff --git a/services/outposts/pom.xml b/services/outposts/pom.xml
index 043356511cf4..0fbada201a48 100644
--- a/services/outposts/pom.xml
+++ b/services/outposts/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
outposts
AWS Java SDK :: Services :: Outposts
diff --git a/services/panorama/pom.xml b/services/panorama/pom.xml
index 415ac305179b..81d364ed5266 100644
--- a/services/panorama/pom.xml
+++ b/services/panorama/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
panorama
AWS Java SDK :: Services :: Panorama
diff --git a/services/paymentcryptography/pom.xml b/services/paymentcryptography/pom.xml
index b5e552583a7d..6c50505302c4 100644
--- a/services/paymentcryptography/pom.xml
+++ b/services/paymentcryptography/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
paymentcryptography
AWS Java SDK :: Services :: Payment Cryptography
diff --git a/services/paymentcryptographydata/pom.xml b/services/paymentcryptographydata/pom.xml
index 569d919e39c0..3ed81546476e 100644
--- a/services/paymentcryptographydata/pom.xml
+++ b/services/paymentcryptographydata/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
paymentcryptographydata
AWS Java SDK :: Services :: Payment Cryptography Data
diff --git a/services/pcaconnectorad/pom.xml b/services/pcaconnectorad/pom.xml
index c3209a95f2a5..ea15ff20f656 100644
--- a/services/pcaconnectorad/pom.xml
+++ b/services/pcaconnectorad/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
pcaconnectorad
AWS Java SDK :: Services :: Pca Connector Ad
diff --git a/services/personalize/pom.xml b/services/personalize/pom.xml
index ced35e9e5181..b62c6a6a2ce5 100644
--- a/services/personalize/pom.xml
+++ b/services/personalize/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
personalize
AWS Java SDK :: Services :: Personalize
diff --git a/services/personalizeevents/pom.xml b/services/personalizeevents/pom.xml
index 20b5dbfbe566..e18e4a449e3c 100644
--- a/services/personalizeevents/pom.xml
+++ b/services/personalizeevents/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
personalizeevents
AWS Java SDK :: Services :: Personalize Events
diff --git a/services/personalizeruntime/pom.xml b/services/personalizeruntime/pom.xml
index a08be4043c1a..4f491fbdeec3 100644
--- a/services/personalizeruntime/pom.xml
+++ b/services/personalizeruntime/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
personalizeruntime
AWS Java SDK :: Services :: Personalize Runtime
diff --git a/services/pi/pom.xml b/services/pi/pom.xml
index 55400f0fefb7..373abfade2e1 100644
--- a/services/pi/pom.xml
+++ b/services/pi/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
pi
AWS Java SDK :: Services :: PI
diff --git a/services/pinpoint/pom.xml b/services/pinpoint/pom.xml
index b95b76220853..135b2cd26315 100644
--- a/services/pinpoint/pom.xml
+++ b/services/pinpoint/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
pinpoint
AWS Java SDK :: Services :: Amazon Pinpoint
diff --git a/services/pinpointemail/pom.xml b/services/pinpointemail/pom.xml
index e63190319e0f..9d9fdc82fbb7 100644
--- a/services/pinpointemail/pom.xml
+++ b/services/pinpointemail/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
pinpointemail
AWS Java SDK :: Services :: Pinpoint Email
diff --git a/services/pinpointsmsvoice/pom.xml b/services/pinpointsmsvoice/pom.xml
index f2d47748fce0..8cc703c5d955 100644
--- a/services/pinpointsmsvoice/pom.xml
+++ b/services/pinpointsmsvoice/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
pinpointsmsvoice
AWS Java SDK :: Services :: Pinpoint SMS Voice
diff --git a/services/pinpointsmsvoicev2/pom.xml b/services/pinpointsmsvoicev2/pom.xml
index 805ef163bb8c..51c1f12ff6de 100644
--- a/services/pinpointsmsvoicev2/pom.xml
+++ b/services/pinpointsmsvoicev2/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
pinpointsmsvoicev2
AWS Java SDK :: Services :: Pinpoint SMS Voice V2
diff --git a/services/pipes/pom.xml b/services/pipes/pom.xml
index 73ff72515bf5..1a4f91165c68 100644
--- a/services/pipes/pom.xml
+++ b/services/pipes/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
pipes
AWS Java SDK :: Services :: Pipes
diff --git a/services/polly/pom.xml b/services/polly/pom.xml
index facfcd2e4bc3..89d51fa05059 100644
--- a/services/polly/pom.xml
+++ b/services/polly/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
polly
AWS Java SDK :: Services :: Amazon Polly
diff --git a/services/pom.xml b/services/pom.xml
index 15b81b67fa0a..1c0b9f6a6e82 100644
--- a/services/pom.xml
+++ b/services/pom.xml
@@ -17,7 +17,7 @@
software.amazon.awssdk
aws-sdk-java-pom
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
services
AWS Java SDK :: Services
diff --git a/services/pricing/pom.xml b/services/pricing/pom.xml
index b36c4c0551e4..4ee1e2dccd72 100644
--- a/services/pricing/pom.xml
+++ b/services/pricing/pom.xml
@@ -20,7 +20,7 @@
services
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
4.0.0
pricing
diff --git a/services/privatenetworks/pom.xml b/services/privatenetworks/pom.xml
index 40af4d89262b..abe848b090a2 100644
--- a/services/privatenetworks/pom.xml
+++ b/services/privatenetworks/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
privatenetworks
AWS Java SDK :: Services :: Private Networks
diff --git a/services/proton/pom.xml b/services/proton/pom.xml
index 13b98296ebea..9a4d6efd6b86 100644
--- a/services/proton/pom.xml
+++ b/services/proton/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
proton
AWS Java SDK :: Services :: Proton
diff --git a/services/qbusiness/pom.xml b/services/qbusiness/pom.xml
index 0718cac0d168..f8ed3811a5b7 100644
--- a/services/qbusiness/pom.xml
+++ b/services/qbusiness/pom.xml
@@ -17,7 +17,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
qbusiness
AWS Java SDK :: Services :: Q Business
diff --git a/services/qconnect/pom.xml b/services/qconnect/pom.xml
index bd4c4b020c6c..03c901018a2a 100644
--- a/services/qconnect/pom.xml
+++ b/services/qconnect/pom.xml
@@ -17,7 +17,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
qconnect
AWS Java SDK :: Services :: Q Connect
diff --git a/services/qldb/pom.xml b/services/qldb/pom.xml
index e0943c7d612c..6d468e5c2495 100644
--- a/services/qldb/pom.xml
+++ b/services/qldb/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
qldb
AWS Java SDK :: Services :: QLDB
diff --git a/services/qldbsession/pom.xml b/services/qldbsession/pom.xml
index ec173ff3a0d1..9a6b8e2e02bc 100644
--- a/services/qldbsession/pom.xml
+++ b/services/qldbsession/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
qldbsession
AWS Java SDK :: Services :: QLDB Session
diff --git a/services/quicksight/pom.xml b/services/quicksight/pom.xml
index 6fbe746649c8..a121fb703de2 100644
--- a/services/quicksight/pom.xml
+++ b/services/quicksight/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
quicksight
AWS Java SDK :: Services :: QuickSight
diff --git a/services/ram/pom.xml b/services/ram/pom.xml
index 83dbd88f46a4..34b32ba1fe2c 100644
--- a/services/ram/pom.xml
+++ b/services/ram/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
ram
AWS Java SDK :: Services :: RAM
diff --git a/services/rbin/pom.xml b/services/rbin/pom.xml
index da876aec5751..cfd3eb908d55 100644
--- a/services/rbin/pom.xml
+++ b/services/rbin/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
rbin
AWS Java SDK :: Services :: Rbin
diff --git a/services/rds/pom.xml b/services/rds/pom.xml
index e8f5dfc1a6f1..b921639bdc28 100644
--- a/services/rds/pom.xml
+++ b/services/rds/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
rds
AWS Java SDK :: Services :: Amazon RDS
diff --git a/services/rdsdata/pom.xml b/services/rdsdata/pom.xml
index ea92b7110334..93a3d9fc7f16 100644
--- a/services/rdsdata/pom.xml
+++ b/services/rdsdata/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
rdsdata
AWS Java SDK :: Services :: RDS Data
diff --git a/services/redshift/pom.xml b/services/redshift/pom.xml
index 75046caba112..8c6d8284d4b5 100644
--- a/services/redshift/pom.xml
+++ b/services/redshift/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
redshift
AWS Java SDK :: Services :: Amazon Redshift
diff --git a/services/redshiftdata/pom.xml b/services/redshiftdata/pom.xml
index c3c4ce052e08..f1f3f6382d7c 100644
--- a/services/redshiftdata/pom.xml
+++ b/services/redshiftdata/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
redshiftdata
AWS Java SDK :: Services :: Redshift Data
diff --git a/services/redshiftserverless/pom.xml b/services/redshiftserverless/pom.xml
index c49583e402e6..de33159e66ef 100644
--- a/services/redshiftserverless/pom.xml
+++ b/services/redshiftserverless/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
redshiftserverless
AWS Java SDK :: Services :: Redshift Serverless
diff --git a/services/rekognition/pom.xml b/services/rekognition/pom.xml
index 51a9c946f086..6743b6fa8f26 100644
--- a/services/rekognition/pom.xml
+++ b/services/rekognition/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
rekognition
AWS Java SDK :: Services :: Amazon Rekognition
diff --git a/services/repostspace/pom.xml b/services/repostspace/pom.xml
index 996094023bbe..15b4db8ba9b6 100644
--- a/services/repostspace/pom.xml
+++ b/services/repostspace/pom.xml
@@ -17,7 +17,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
repostspace
AWS Java SDK :: Services :: Repostspace
diff --git a/services/resiliencehub/pom.xml b/services/resiliencehub/pom.xml
index 0a8cd68344b8..fb8dfbd5b8c4 100644
--- a/services/resiliencehub/pom.xml
+++ b/services/resiliencehub/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
resiliencehub
AWS Java SDK :: Services :: Resiliencehub
diff --git a/services/resourceexplorer2/pom.xml b/services/resourceexplorer2/pom.xml
index b78bad8318cb..f793091b847a 100644
--- a/services/resourceexplorer2/pom.xml
+++ b/services/resourceexplorer2/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
resourceexplorer2
AWS Java SDK :: Services :: Resource Explorer 2
diff --git a/services/resourcegroups/pom.xml b/services/resourcegroups/pom.xml
index ea71d289046e..dbb6edd5972d 100644
--- a/services/resourcegroups/pom.xml
+++ b/services/resourcegroups/pom.xml
@@ -20,7 +20,7 @@
services
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
4.0.0
resourcegroups
diff --git a/services/resourcegroupstaggingapi/pom.xml b/services/resourcegroupstaggingapi/pom.xml
index b59917d5ef1f..c9c6689ad33b 100644
--- a/services/resourcegroupstaggingapi/pom.xml
+++ b/services/resourcegroupstaggingapi/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
resourcegroupstaggingapi
AWS Java SDK :: Services :: AWS Resource Groups Tagging API
diff --git a/services/robomaker/pom.xml b/services/robomaker/pom.xml
index fa7858e9d5e0..22683c86d569 100644
--- a/services/robomaker/pom.xml
+++ b/services/robomaker/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
robomaker
AWS Java SDK :: Services :: RoboMaker
diff --git a/services/rolesanywhere/pom.xml b/services/rolesanywhere/pom.xml
index ac689047b78d..7ab7c21517ee 100644
--- a/services/rolesanywhere/pom.xml
+++ b/services/rolesanywhere/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
rolesanywhere
AWS Java SDK :: Services :: Roles Anywhere
diff --git a/services/route53/pom.xml b/services/route53/pom.xml
index 2ea5b7269ad3..56e6dcd71443 100644
--- a/services/route53/pom.xml
+++ b/services/route53/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
route53
AWS Java SDK :: Services :: Amazon Route53
diff --git a/services/route53domains/pom.xml b/services/route53domains/pom.xml
index a28dc23f14ec..9c9dee484fd4 100644
--- a/services/route53domains/pom.xml
+++ b/services/route53domains/pom.xml
@@ -22,7 +22,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
route53domains
AWS Java SDK :: Services :: Amazon Route53 Domains
diff --git a/services/route53recoverycluster/pom.xml b/services/route53recoverycluster/pom.xml
index 0a06941cd6ad..29fb0f78dc1e 100644
--- a/services/route53recoverycluster/pom.xml
+++ b/services/route53recoverycluster/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
route53recoverycluster
AWS Java SDK :: Services :: Route53 Recovery Cluster
diff --git a/services/route53recoverycontrolconfig/pom.xml b/services/route53recoverycontrolconfig/pom.xml
index dc433fba4426..d404906d6213 100644
--- a/services/route53recoverycontrolconfig/pom.xml
+++ b/services/route53recoverycontrolconfig/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
route53recoverycontrolconfig
AWS Java SDK :: Services :: Route53 Recovery Control Config
diff --git a/services/route53recoveryreadiness/pom.xml b/services/route53recoveryreadiness/pom.xml
index e9d733396949..87b34de4d6d8 100644
--- a/services/route53recoveryreadiness/pom.xml
+++ b/services/route53recoveryreadiness/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
route53recoveryreadiness
AWS Java SDK :: Services :: Route53 Recovery Readiness
diff --git a/services/route53resolver/pom.xml b/services/route53resolver/pom.xml
index dec2e8b30a81..2189dc8350a8 100644
--- a/services/route53resolver/pom.xml
+++ b/services/route53resolver/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
route53resolver
AWS Java SDK :: Services :: Route53Resolver
diff --git a/services/rum/pom.xml b/services/rum/pom.xml
index 0b5edf831362..6f0762644590 100644
--- a/services/rum/pom.xml
+++ b/services/rum/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
rum
AWS Java SDK :: Services :: RUM
diff --git a/services/s3/pom.xml b/services/s3/pom.xml
index 6f0d12aba701..2d3affd22daf 100644
--- a/services/s3/pom.xml
+++ b/services/s3/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
s3
AWS Java SDK :: Services :: Amazon S3
@@ -174,6 +174,12 @@
${awsjavasdk.version}
test
+
+ software.amazon.awssdk
+ aws-crt-client
+ ${awsjavasdk.version}
+ test
+
io.netty
netty-transport
diff --git a/services/s3/src/it/java/software/amazon/awssdk/services/SelectObjectContentIntegrationTest.java b/services/s3/src/it/java/software/amazon/awssdk/services/SelectObjectContentIntegrationTest.java
index f42482795452..05993a13aa64 100644
--- a/services/s3/src/it/java/software/amazon/awssdk/services/SelectObjectContentIntegrationTest.java
+++ b/services/s3/src/it/java/software/amazon/awssdk/services/SelectObjectContentIntegrationTest.java
@@ -77,7 +77,7 @@ public static void teardown() {
} finally {
s3AsyncClients().forEach(SdkAutoCloseable::close);
s3.close();
- CrtResource.waitForNoResources();
+
}
}
diff --git a/services/s3/src/it/java/software/amazon/awssdk/services/s3/S3IntegrationTestBase.java b/services/s3/src/it/java/software/amazon/awssdk/services/s3/S3IntegrationTestBase.java
index 03cf42afe5df..02afbebb7f72 100644
--- a/services/s3/src/it/java/software/amazon/awssdk/services/s3/S3IntegrationTestBase.java
+++ b/services/s3/src/it/java/software/amazon/awssdk/services/s3/S3IntegrationTestBase.java
@@ -17,12 +17,14 @@
import static org.assertj.core.api.Assertions.assertThat;
+import org.junit.AfterClass;
import org.junit.BeforeClass;
import software.amazon.awssdk.core.ClientType;
import software.amazon.awssdk.core.interceptor.Context;
import software.amazon.awssdk.core.interceptor.ExecutionAttributes;
import software.amazon.awssdk.core.interceptor.ExecutionInterceptor;
import software.amazon.awssdk.crt.Log;
+import software.amazon.awssdk.http.crt.AwsCrtHttpClient;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.model.BucketLocationConstraint;
import software.amazon.awssdk.services.s3.model.CreateBucketConfiguration;
@@ -51,11 +53,18 @@ public class S3IntegrationTestBase extends AwsTestBase {
*/
@BeforeClass
public static void setUp() throws Exception {
+ System.setProperty("aws.crt.debugnative", "true");
Log.initLoggingToStdout(Log.LogLevel.Warn);
s3 = s3ClientBuilder().build();
s3Async = s3AsyncClientBuilder().build();
}
+ @AfterClass
+ public static void cleanUpResources() {
+ s3.close();
+ s3Async.close();
+ }
+
protected static S3ClientBuilder s3ClientBuilder() {
return S3Client.builder()
.region(DEFAULT_REGION)
@@ -64,6 +73,15 @@ protected static S3ClientBuilder s3ClientBuilder() {
new UserAgentVerifyingExecutionInterceptor("Apache", ClientType.SYNC)));
}
+ protected static S3ClientBuilder s3ClientBuilderWithCrtHttpClient() {
+ return S3Client.builder()
+ .region(DEFAULT_REGION)
+ .credentialsProvider(CREDENTIALS_PROVIDER_CHAIN)
+ .httpClientBuilder(AwsCrtHttpClient.builder())
+ .overrideConfiguration(o -> o.addExecutionInterceptor(
+ new UserAgentVerifyingExecutionInterceptor("AwsCommonRuntime", ClientType.SYNC)));
+ }
+
protected static S3AsyncClientBuilder s3AsyncClientBuilder() {
return S3AsyncClient.builder()
.region(DEFAULT_REGION)
diff --git a/services/s3/src/it/java/software/amazon/awssdk/services/s3/crt/ChecksumIntegrationTest.java b/services/s3/src/it/java/software/amazon/awssdk/services/s3/crt/ChecksumIntegrationTest.java
index 1507f626cde5..5dca87203369 100644
--- a/services/s3/src/it/java/software/amazon/awssdk/services/s3/crt/ChecksumIntegrationTest.java
+++ b/services/s3/src/it/java/software/amazon/awssdk/services/s3/crt/ChecksumIntegrationTest.java
@@ -66,7 +66,7 @@ public static void teardown() throws IOException {
S3IntegrationTestBase.deleteBucketAndAllContents(TEST_BUCKET);
Files.delete(testFile.toPath());
s3Crt.close();
- CrtResource.waitForNoResources();
+
}
@Test
diff --git a/services/s3/src/it/java/software/amazon/awssdk/services/s3/crt/CrtExceptionTransformationIntegrationTest.java b/services/s3/src/it/java/software/amazon/awssdk/services/s3/crt/CrtExceptionTransformationIntegrationTest.java
index 87cdb3e2d1d2..d40768da1590 100644
--- a/services/s3/src/it/java/software/amazon/awssdk/services/s3/crt/CrtExceptionTransformationIntegrationTest.java
+++ b/services/s3/src/it/java/software/amazon/awssdk/services/s3/crt/CrtExceptionTransformationIntegrationTest.java
@@ -61,7 +61,7 @@ public static void setupFixture() throws Exception {
public static void tearDownFixture() {
S3IntegrationTestBase.deleteBucketAndAllContents(BUCKET);
s3Crt.close();
- CrtResource.waitForNoResources();
+
}
@Test
diff --git a/services/s3/src/it/java/software/amazon/awssdk/services/s3/crt/S3CrossRegionCrtIntegrationTest.java b/services/s3/src/it/java/software/amazon/awssdk/services/s3/crt/S3CrossRegionCrtIntegrationTest.java
index 72c6fce095ce..2f0cf4e6ceec 100644
--- a/services/s3/src/it/java/software/amazon/awssdk/services/s3/crt/S3CrossRegionCrtIntegrationTest.java
+++ b/services/s3/src/it/java/software/amazon/awssdk/services/s3/crt/S3CrossRegionCrtIntegrationTest.java
@@ -84,7 +84,7 @@ public static void cleanup() {
crtClient.close();
S3IntegrationTestBase.deleteBucketAndAllContents(BUCKET);
executorService.shutdown();
- CrtResource.waitForNoResources();
+
}
@Test
diff --git a/services/s3/src/it/java/software/amazon/awssdk/services/s3/crt/S3CrtClientPutObjectIntegrationTest.java b/services/s3/src/it/java/software/amazon/awssdk/services/s3/crt/S3CrtClientPutObjectIntegrationTest.java
index 133b9da0a858..911214dade11 100644
--- a/services/s3/src/it/java/software/amazon/awssdk/services/s3/crt/S3CrtClientPutObjectIntegrationTest.java
+++ b/services/s3/src/it/java/software/amazon/awssdk/services/s3/crt/S3CrtClientPutObjectIntegrationTest.java
@@ -74,7 +74,7 @@ public static void teardown() throws IOException {
S3IntegrationTestBase.deleteBucketAndAllContents(TEST_BUCKET);
Files.delete(testFile.toPath());
s3Crt.close();
- CrtResource.waitForNoResources();
+
}
@Test
diff --git a/services/s3/src/it/java/software/amazon/awssdk/services/s3/crt/S3CrtGetObjectIntegrationTest.java b/services/s3/src/it/java/software/amazon/awssdk/services/s3/crt/S3CrtGetObjectIntegrationTest.java
index a7ea924c5fe4..8c7265dd6e19 100644
--- a/services/s3/src/it/java/software/amazon/awssdk/services/s3/crt/S3CrtGetObjectIntegrationTest.java
+++ b/services/s3/src/it/java/software/amazon/awssdk/services/s3/crt/S3CrtGetObjectIntegrationTest.java
@@ -66,7 +66,6 @@ public static void cleanup() {
crtClient.close();
S3IntegrationTestBase.deleteBucketAndAllContents(BUCKET);
executorService.shutdown();
- CrtResource.waitForNoResources();
}
@Test
diff --git a/services/s3/src/it/java/software/amazon/awssdk/services/s3/crthttpclient/S3WithCrtHttpClientsIntegrationTests.java b/services/s3/src/it/java/software/amazon/awssdk/services/s3/crthttpclient/S3WithCrtHttpClientsIntegrationTests.java
new file mode 100644
index 000000000000..f1eb1c6e4f23
--- /dev/null
+++ b/services/s3/src/it/java/software/amazon/awssdk/services/s3/crthttpclient/S3WithCrtHttpClientsIntegrationTests.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://aws.amazon.com/apache2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package software.amazon.awssdk.services.s3.crthttpclient;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static software.amazon.awssdk.testutils.service.S3BucketUtils.temporaryBucketName;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import org.assertj.core.api.Assertions;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import software.amazon.awssdk.core.ResponseInputStream;
+import software.amazon.awssdk.core.sync.RequestBody;
+import software.amazon.awssdk.core.sync.ResponseTransformer;
+import software.amazon.awssdk.crt.CrtResource;
+import software.amazon.awssdk.services.s3.S3Client;
+import software.amazon.awssdk.services.s3.S3IntegrationTestBase;
+import software.amazon.awssdk.services.s3.model.GetObjectResponse;
+import software.amazon.awssdk.services.s3.utils.ChecksumUtils;
+import software.amazon.awssdk.testutils.RandomTempFile;
+import software.amazon.awssdk.utils.Md5Utils;
+
+public class S3WithCrtHttpClientsIntegrationTests extends S3IntegrationTestBase {
+ private static final String TEST_BUCKET = temporaryBucketName(S3WithCrtHttpClientsIntegrationTests.class);
+ private static final String TEST_KEY = "2mib_file.dat";
+ private static final int OBJ_SIZE = 2 * 1024 * 1024;
+
+ private static S3Client s3WithCrtHttpClient;
+ private static RandomTempFile testFile;
+
+ @BeforeAll
+ public static void setup() throws Exception {
+ S3IntegrationTestBase.setUp();
+ S3IntegrationTestBase.createBucket(TEST_BUCKET);
+ testFile = new RandomTempFile(TEST_KEY, OBJ_SIZE);
+ s3WithCrtHttpClient = s3ClientBuilderWithCrtHttpClient().build();
+ s3WithCrtHttpClient.putObject(r -> r.bucket(TEST_BUCKET).key(TEST_KEY), RequestBody.fromFile(testFile.toPath()));
+ }
+
+ @AfterAll
+ public static void teardown() throws IOException {
+ S3IntegrationTestBase.deleteBucketAndAllContents(TEST_BUCKET);
+ Files.delete(testFile.toPath());
+ s3WithCrtHttpClient.close();
+
+ }
+
+ @Test
+ void getObject_toResponseStream_objectSentCorrectly() throws Exception {
+ ResponseInputStream objContent =
+ s3WithCrtHttpClient.getObject(r -> r.bucket(TEST_BUCKET).key(TEST_KEY),
+ ResponseTransformer.toInputStream());
+
+ byte[] expectedSum = ChecksumUtils.computeCheckSum(Files.newInputStream(testFile.toPath()));
+
+ assertThat(ChecksumUtils.computeCheckSum(objContent)).isEqualTo(expectedSum);
+ }
+
+ @Test
+ void getObject_toFile_objectSentCorrectly() throws Exception {
+ Path destination = RandomTempFile.randomUncreatedFile().toPath();
+ GetObjectResponse response = s3WithCrtHttpClient.getObject(r -> r.bucket(TEST_BUCKET).key(TEST_KEY),
+ ResponseTransformer.toFile(destination));
+
+ assertThat(Md5Utils.md5AsBase64(destination.toFile())).isEqualTo(Md5Utils.md5AsBase64(testFile));
+ }
+}
diff --git a/services/s3control/pom.xml b/services/s3control/pom.xml
index 6cd68c377ee6..e41c522ca863 100644
--- a/services/s3control/pom.xml
+++ b/services/s3control/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
s3control
AWS Java SDK :: Services :: Amazon S3 Control
diff --git a/services/s3outposts/pom.xml b/services/s3outposts/pom.xml
index a61b602aad81..1ce7958ffae0 100644
--- a/services/s3outposts/pom.xml
+++ b/services/s3outposts/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
s3outposts
AWS Java SDK :: Services :: S3 Outposts
diff --git a/services/sagemaker/pom.xml b/services/sagemaker/pom.xml
index ce49c7a4172c..fa2887b82695 100644
--- a/services/sagemaker/pom.xml
+++ b/services/sagemaker/pom.xml
@@ -20,7 +20,7 @@
services
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
4.0.0
sagemaker
diff --git a/services/sagemakera2iruntime/pom.xml b/services/sagemakera2iruntime/pom.xml
index c803fbd04552..0217a578c884 100644
--- a/services/sagemakera2iruntime/pom.xml
+++ b/services/sagemakera2iruntime/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
sagemakera2iruntime
AWS Java SDK :: Services :: SageMaker A2I Runtime
diff --git a/services/sagemakeredge/pom.xml b/services/sagemakeredge/pom.xml
index b6b87996224a..2fe98a850de0 100644
--- a/services/sagemakeredge/pom.xml
+++ b/services/sagemakeredge/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
sagemakeredge
AWS Java SDK :: Services :: Sagemaker Edge
diff --git a/services/sagemakerfeaturestoreruntime/pom.xml b/services/sagemakerfeaturestoreruntime/pom.xml
index 19a9b6984fbe..e088c6134d34 100644
--- a/services/sagemakerfeaturestoreruntime/pom.xml
+++ b/services/sagemakerfeaturestoreruntime/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
sagemakerfeaturestoreruntime
AWS Java SDK :: Services :: Sage Maker Feature Store Runtime
diff --git a/services/sagemakergeospatial/pom.xml b/services/sagemakergeospatial/pom.xml
index d7b2c6a801e0..d07413e3bcfa 100644
--- a/services/sagemakergeospatial/pom.xml
+++ b/services/sagemakergeospatial/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
sagemakergeospatial
AWS Java SDK :: Services :: Sage Maker Geospatial
diff --git a/services/sagemakermetrics/pom.xml b/services/sagemakermetrics/pom.xml
index 42f73b696268..48cb94527085 100644
--- a/services/sagemakermetrics/pom.xml
+++ b/services/sagemakermetrics/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
sagemakermetrics
AWS Java SDK :: Services :: Sage Maker Metrics
diff --git a/services/sagemakerruntime/pom.xml b/services/sagemakerruntime/pom.xml
index cbdaa804f12f..3ef6a6d05b6c 100644
--- a/services/sagemakerruntime/pom.xml
+++ b/services/sagemakerruntime/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
sagemakerruntime
AWS Java SDK :: Services :: SageMaker Runtime
diff --git a/services/savingsplans/pom.xml b/services/savingsplans/pom.xml
index dd4c7005900e..4f28183fca03 100644
--- a/services/savingsplans/pom.xml
+++ b/services/savingsplans/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
savingsplans
AWS Java SDK :: Services :: Savingsplans
diff --git a/services/scheduler/pom.xml b/services/scheduler/pom.xml
index c4fa0413d47f..9afb59276c5a 100644
--- a/services/scheduler/pom.xml
+++ b/services/scheduler/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
scheduler
AWS Java SDK :: Services :: Scheduler
diff --git a/services/schemas/pom.xml b/services/schemas/pom.xml
index 09da89a27596..43485615530a 100644
--- a/services/schemas/pom.xml
+++ b/services/schemas/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
schemas
AWS Java SDK :: Services :: Schemas
diff --git a/services/secretsmanager/pom.xml b/services/secretsmanager/pom.xml
index 858b7ce56636..9116e180e296 100644
--- a/services/secretsmanager/pom.xml
+++ b/services/secretsmanager/pom.xml
@@ -22,7 +22,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
secretsmanager
AWS Java SDK :: Services :: AWS Secrets Manager
diff --git a/services/securityhub/pom.xml b/services/securityhub/pom.xml
index dc64da6013ae..c2e7a46d71d6 100644
--- a/services/securityhub/pom.xml
+++ b/services/securityhub/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
securityhub
AWS Java SDK :: Services :: SecurityHub
diff --git a/services/securitylake/pom.xml b/services/securitylake/pom.xml
index 2908ed0ce60a..3b35857b15cd 100644
--- a/services/securitylake/pom.xml
+++ b/services/securitylake/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
securitylake
AWS Java SDK :: Services :: Security Lake
diff --git a/services/serverlessapplicationrepository/pom.xml b/services/serverlessapplicationrepository/pom.xml
index ac3433ef769c..e1b28a17df94 100644
--- a/services/serverlessapplicationrepository/pom.xml
+++ b/services/serverlessapplicationrepository/pom.xml
@@ -20,7 +20,7 @@
services
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
4.0.0
serverlessapplicationrepository
diff --git a/services/servicecatalog/pom.xml b/services/servicecatalog/pom.xml
index 0775d4d37f18..21fb69d8136a 100644
--- a/services/servicecatalog/pom.xml
+++ b/services/servicecatalog/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
servicecatalog
AWS Java SDK :: Services :: AWS Service Catalog
diff --git a/services/servicecatalogappregistry/pom.xml b/services/servicecatalogappregistry/pom.xml
index ea0509149a94..ff09c5e8d391 100644
--- a/services/servicecatalogappregistry/pom.xml
+++ b/services/servicecatalogappregistry/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
servicecatalogappregistry
AWS Java SDK :: Services :: Service Catalog App Registry
diff --git a/services/servicediscovery/pom.xml b/services/servicediscovery/pom.xml
index 167e32c8e44b..6e132c954f21 100644
--- a/services/servicediscovery/pom.xml
+++ b/services/servicediscovery/pom.xml
@@ -20,7 +20,7 @@
services
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
4.0.0
servicediscovery
diff --git a/services/servicequotas/pom.xml b/services/servicequotas/pom.xml
index c8ab915bb07e..e076dc86162f 100644
--- a/services/servicequotas/pom.xml
+++ b/services/servicequotas/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
servicequotas
AWS Java SDK :: Services :: Service Quotas
diff --git a/services/ses/pom.xml b/services/ses/pom.xml
index 25da5abe1f89..c61e263b2499 100644
--- a/services/ses/pom.xml
+++ b/services/ses/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
ses
AWS Java SDK :: Services :: Amazon SES
diff --git a/services/sesv2/pom.xml b/services/sesv2/pom.xml
index 62a7377b7115..e4841dea4750 100644
--- a/services/sesv2/pom.xml
+++ b/services/sesv2/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
sesv2
AWS Java SDK :: Services :: SESv2
diff --git a/services/sfn/pom.xml b/services/sfn/pom.xml
index 2accf09330fc..c22fc32164f7 100644
--- a/services/sfn/pom.xml
+++ b/services/sfn/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
sfn
AWS Java SDK :: Services :: AWS Step Functions
diff --git a/services/shield/pom.xml b/services/shield/pom.xml
index 0c3f8c9cc9a8..b9d28fd6d5f7 100644
--- a/services/shield/pom.xml
+++ b/services/shield/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
shield
AWS Java SDK :: Services :: AWS Shield
diff --git a/services/signer/pom.xml b/services/signer/pom.xml
index 4fe4397f3864..76712816773b 100644
--- a/services/signer/pom.xml
+++ b/services/signer/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
signer
AWS Java SDK :: Services :: Signer
diff --git a/services/simspaceweaver/pom.xml b/services/simspaceweaver/pom.xml
index 52920728aa2e..3052428dd6f2 100644
--- a/services/simspaceweaver/pom.xml
+++ b/services/simspaceweaver/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
simspaceweaver
AWS Java SDK :: Services :: Sim Space Weaver
diff --git a/services/sms/pom.xml b/services/sms/pom.xml
index 394ad4b98b26..c138df780409 100644
--- a/services/sms/pom.xml
+++ b/services/sms/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
sms
AWS Java SDK :: Services :: AWS Server Migration
diff --git a/services/snowball/pom.xml b/services/snowball/pom.xml
index 1ba26438d928..b7946ed59ad9 100644
--- a/services/snowball/pom.xml
+++ b/services/snowball/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
snowball
AWS Java SDK :: Services :: Amazon Snowball
diff --git a/services/snowdevicemanagement/pom.xml b/services/snowdevicemanagement/pom.xml
index 6f18c7e3774e..af9036cf9f64 100644
--- a/services/snowdevicemanagement/pom.xml
+++ b/services/snowdevicemanagement/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
snowdevicemanagement
AWS Java SDK :: Services :: Snow Device Management
diff --git a/services/sns/pom.xml b/services/sns/pom.xml
index 0dc2732065ee..e3f098347249 100644
--- a/services/sns/pom.xml
+++ b/services/sns/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
sns
AWS Java SDK :: Services :: Amazon SNS
diff --git a/services/sqs/pom.xml b/services/sqs/pom.xml
index 445d38fcc3fb..9e3eb694ca30 100644
--- a/services/sqs/pom.xml
+++ b/services/sqs/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
sqs
AWS Java SDK :: Services :: Amazon SQS
diff --git a/services/ssm/pom.xml b/services/ssm/pom.xml
index 2ceb90c4bef3..9139761c11db 100644
--- a/services/ssm/pom.xml
+++ b/services/ssm/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
ssm
AWS Java SDK :: Services :: AWS Simple Systems Management (SSM)
diff --git a/services/ssmcontacts/pom.xml b/services/ssmcontacts/pom.xml
index cc8e8d1b555d..fba2b9b364ff 100644
--- a/services/ssmcontacts/pom.xml
+++ b/services/ssmcontacts/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
ssmcontacts
AWS Java SDK :: Services :: SSM Contacts
diff --git a/services/ssmincidents/pom.xml b/services/ssmincidents/pom.xml
index 02965d575238..214f01e0cbf5 100644
--- a/services/ssmincidents/pom.xml
+++ b/services/ssmincidents/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
ssmincidents
AWS Java SDK :: Services :: SSM Incidents
diff --git a/services/ssmsap/pom.xml b/services/ssmsap/pom.xml
index 50fd932decef..9e77ae7d227e 100644
--- a/services/ssmsap/pom.xml
+++ b/services/ssmsap/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
ssmsap
AWS Java SDK :: Services :: Ssm Sap
diff --git a/services/sso/pom.xml b/services/sso/pom.xml
index bd047e850a68..344a302fe7af 100644
--- a/services/sso/pom.xml
+++ b/services/sso/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
sso
AWS Java SDK :: Services :: SSO
diff --git a/services/ssoadmin/pom.xml b/services/ssoadmin/pom.xml
index f3f591e40fc3..9dd7a2a2846d 100644
--- a/services/ssoadmin/pom.xml
+++ b/services/ssoadmin/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
ssoadmin
AWS Java SDK :: Services :: SSO Admin
diff --git a/services/ssooidc/pom.xml b/services/ssooidc/pom.xml
index c467a97f3eca..39aea90746fe 100644
--- a/services/ssooidc/pom.xml
+++ b/services/ssooidc/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
ssooidc
AWS Java SDK :: Services :: SSO OIDC
diff --git a/services/storagegateway/pom.xml b/services/storagegateway/pom.xml
index 1d7fef8c520d..573d8401d831 100644
--- a/services/storagegateway/pom.xml
+++ b/services/storagegateway/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
storagegateway
AWS Java SDK :: Services :: AWS Storage Gateway
diff --git a/services/sts/pom.xml b/services/sts/pom.xml
index 8db1b5648f02..7e7c3ede1326 100644
--- a/services/sts/pom.xml
+++ b/services/sts/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
sts
AWS Java SDK :: Services :: AWS STS
diff --git a/services/support/pom.xml b/services/support/pom.xml
index e0e5bf5cf4f1..d18212aafcd1 100644
--- a/services/support/pom.xml
+++ b/services/support/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
support
AWS Java SDK :: Services :: AWS Support
diff --git a/services/supportapp/pom.xml b/services/supportapp/pom.xml
index f98f0fde32cc..d0cec7c8d95f 100644
--- a/services/supportapp/pom.xml
+++ b/services/supportapp/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
supportapp
AWS Java SDK :: Services :: Support App
diff --git a/services/swf/pom.xml b/services/swf/pom.xml
index fab7b85b871b..e4fef691e377 100644
--- a/services/swf/pom.xml
+++ b/services/swf/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
swf
AWS Java SDK :: Services :: Amazon SWF
diff --git a/services/synthetics/pom.xml b/services/synthetics/pom.xml
index fb16aabd382d..25a0494e8b95 100644
--- a/services/synthetics/pom.xml
+++ b/services/synthetics/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
synthetics
AWS Java SDK :: Services :: Synthetics
diff --git a/services/textract/pom.xml b/services/textract/pom.xml
index 6ab93963f5b0..d1636d87db09 100644
--- a/services/textract/pom.xml
+++ b/services/textract/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
textract
AWS Java SDK :: Services :: Textract
diff --git a/services/timestreamquery/pom.xml b/services/timestreamquery/pom.xml
index e539eba43ad1..a9e42ad93add 100644
--- a/services/timestreamquery/pom.xml
+++ b/services/timestreamquery/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
timestreamquery
AWS Java SDK :: Services :: Timestream Query
diff --git a/services/timestreamwrite/pom.xml b/services/timestreamwrite/pom.xml
index 751a49e11fd4..124e8b969cb3 100644
--- a/services/timestreamwrite/pom.xml
+++ b/services/timestreamwrite/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
timestreamwrite
AWS Java SDK :: Services :: Timestream Write
diff --git a/services/tnb/pom.xml b/services/tnb/pom.xml
index 129906774143..d5f112f6eec4 100644
--- a/services/tnb/pom.xml
+++ b/services/tnb/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
tnb
AWS Java SDK :: Services :: Tnb
diff --git a/services/transcribe/pom.xml b/services/transcribe/pom.xml
index c27b357bf591..b747f81b6a20 100644
--- a/services/transcribe/pom.xml
+++ b/services/transcribe/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
transcribe
AWS Java SDK :: Services :: Transcribe
diff --git a/services/transcribestreaming/pom.xml b/services/transcribestreaming/pom.xml
index 1ed7104cf09f..fb964dee6371 100644
--- a/services/transcribestreaming/pom.xml
+++ b/services/transcribestreaming/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
transcribestreaming
AWS Java SDK :: Services :: AWS Transcribe Streaming
diff --git a/services/transfer/pom.xml b/services/transfer/pom.xml
index 4622188d96c0..36f96d9af1f5 100644
--- a/services/transfer/pom.xml
+++ b/services/transfer/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
transfer
AWS Java SDK :: Services :: Transfer
diff --git a/services/translate/pom.xml b/services/translate/pom.xml
index 7c912ce808c4..ef6af2315bc3 100644
--- a/services/translate/pom.xml
+++ b/services/translate/pom.xml
@@ -20,7 +20,7 @@
services
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
4.0.0
translate
diff --git a/services/trustedadvisor/pom.xml b/services/trustedadvisor/pom.xml
index 9e9647de481b..08b717cfec95 100644
--- a/services/trustedadvisor/pom.xml
+++ b/services/trustedadvisor/pom.xml
@@ -17,7 +17,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
trustedadvisor
AWS Java SDK :: Services :: Trusted Advisor
diff --git a/services/verifiedpermissions/pom.xml b/services/verifiedpermissions/pom.xml
index b1fd7ea7cb1b..5718200e9358 100644
--- a/services/verifiedpermissions/pom.xml
+++ b/services/verifiedpermissions/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
verifiedpermissions
AWS Java SDK :: Services :: Verified Permissions
diff --git a/services/voiceid/pom.xml b/services/voiceid/pom.xml
index e510f60377b8..3bca18e7505e 100644
--- a/services/voiceid/pom.xml
+++ b/services/voiceid/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
voiceid
AWS Java SDK :: Services :: Voice ID
diff --git a/services/vpclattice/pom.xml b/services/vpclattice/pom.xml
index f1a832ad91ab..66e294a5f1b4 100644
--- a/services/vpclattice/pom.xml
+++ b/services/vpclattice/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
vpclattice
AWS Java SDK :: Services :: VPC Lattice
diff --git a/services/waf/pom.xml b/services/waf/pom.xml
index f54736c45788..c0bff7b52fd5 100644
--- a/services/waf/pom.xml
+++ b/services/waf/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
waf
AWS Java SDK :: Services :: AWS WAF
diff --git a/services/wafv2/pom.xml b/services/wafv2/pom.xml
index 45c7983341a5..2889b8fabc98 100644
--- a/services/wafv2/pom.xml
+++ b/services/wafv2/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
wafv2
AWS Java SDK :: Services :: WAFV2
diff --git a/services/wellarchitected/pom.xml b/services/wellarchitected/pom.xml
index 3ef7669a197f..d56c3ee37974 100644
--- a/services/wellarchitected/pom.xml
+++ b/services/wellarchitected/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
wellarchitected
AWS Java SDK :: Services :: Well Architected
diff --git a/services/wisdom/pom.xml b/services/wisdom/pom.xml
index 944d3c93d758..b6a9c074a7ac 100644
--- a/services/wisdom/pom.xml
+++ b/services/wisdom/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
wisdom
AWS Java SDK :: Services :: Wisdom
diff --git a/services/workdocs/pom.xml b/services/workdocs/pom.xml
index 0991314911bc..7e4e2c5e9827 100644
--- a/services/workdocs/pom.xml
+++ b/services/workdocs/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
workdocs
AWS Java SDK :: Services :: Amazon WorkDocs
diff --git a/services/worklink/pom.xml b/services/worklink/pom.xml
index 4f5ca5231833..fa0173249604 100644
--- a/services/worklink/pom.xml
+++ b/services/worklink/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
worklink
AWS Java SDK :: Services :: WorkLink
diff --git a/services/workmail/pom.xml b/services/workmail/pom.xml
index 7f65917b2d18..c36e957dcbb5 100644
--- a/services/workmail/pom.xml
+++ b/services/workmail/pom.xml
@@ -20,7 +20,7 @@
services
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
4.0.0
workmail
diff --git a/services/workmailmessageflow/pom.xml b/services/workmailmessageflow/pom.xml
index c47ee912f916..8eed5ee48e96 100644
--- a/services/workmailmessageflow/pom.xml
+++ b/services/workmailmessageflow/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
workmailmessageflow
AWS Java SDK :: Services :: WorkMailMessageFlow
diff --git a/services/workspaces/pom.xml b/services/workspaces/pom.xml
index 6a8c55444774..3a24ee0d3864 100644
--- a/services/workspaces/pom.xml
+++ b/services/workspaces/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
workspaces
AWS Java SDK :: Services :: Amazon WorkSpaces
diff --git a/services/workspacesthinclient/pom.xml b/services/workspacesthinclient/pom.xml
index e159e58b7d2b..7b4bcafc99f2 100644
--- a/services/workspacesthinclient/pom.xml
+++ b/services/workspacesthinclient/pom.xml
@@ -17,7 +17,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
workspacesthinclient
AWS Java SDK :: Services :: Work Spaces Thin Client
diff --git a/services/workspacesweb/pom.xml b/services/workspacesweb/pom.xml
index b5615e4ffa6c..15f27a98a566 100644
--- a/services/workspacesweb/pom.xml
+++ b/services/workspacesweb/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
workspacesweb
AWS Java SDK :: Services :: Work Spaces Web
diff --git a/services/xray/pom.xml b/services/xray/pom.xml
index 5a964cde2ec9..14f874037381 100644
--- a/services/xray/pom.xml
+++ b/services/xray/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
services
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
xray
AWS Java SDK :: Services :: AWS X-Ray
diff --git a/test/auth-tests/pom.xml b/test/auth-tests/pom.xml
index 0d6ce75d3c2d..dae93a745cab 100644
--- a/test/auth-tests/pom.xml
+++ b/test/auth-tests/pom.xml
@@ -20,7 +20,7 @@
aws-sdk-java-pom
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
../../pom.xml
4.0.0
diff --git a/test/bundle-logging-bridge-binding-test/pom.xml b/test/bundle-logging-bridge-binding-test/pom.xml
index 839d7d00e317..87ef9f3a39db 100644
--- a/test/bundle-logging-bridge-binding-test/pom.xml
+++ b/test/bundle-logging-bridge-binding-test/pom.xml
@@ -20,7 +20,7 @@
aws-sdk-java-pom
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
../../pom.xml
4.0.0
diff --git a/test/codegen-generated-classes-test/pom.xml b/test/codegen-generated-classes-test/pom.xml
index 6ef6265cac67..9a3153352cb1 100644
--- a/test/codegen-generated-classes-test/pom.xml
+++ b/test/codegen-generated-classes-test/pom.xml
@@ -21,7 +21,7 @@
aws-sdk-java-pom
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
../../pom.xml
diff --git a/test/http-client-tests/pom.xml b/test/http-client-tests/pom.xml
index f10f620574f0..8d13e34a3b46 100644
--- a/test/http-client-tests/pom.xml
+++ b/test/http-client-tests/pom.xml
@@ -21,7 +21,7 @@
aws-sdk-java-pom
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
../../pom.xml
http-client-tests
diff --git a/test/http-client-tests/src/main/java/software/amazon/awssdk/http/SdkHttpClientDefaultTestSuite.java b/test/http-client-tests/src/main/java/software/amazon/awssdk/http/SdkHttpClientDefaultTestSuite.java
index a2fb20bf50c4..e0e300b848d4 100644
--- a/test/http-client-tests/src/main/java/software/amazon/awssdk/http/SdkHttpClientDefaultTestSuite.java
+++ b/test/http-client-tests/src/main/java/software/amazon/awssdk/http/SdkHttpClientDefaultTestSuite.java
@@ -44,7 +44,7 @@
/**
* A set of tests validating that the functionality implemented by a {@link SdkHttpClient}.
- *
+ *
* This is used by an HTTP plugin implementation by extending this class and implementing the abstract methods to provide this
* suite with a testable HTTP client implementation.
*/
@@ -95,7 +95,7 @@ public void supportsResponseCode500() throws Exception {
}
@Test
- public void validatesHttpsCertificateIssuer() throws Exception {
+ public void validatesHttpsCertificateIssuer() {
SdkHttpClient client = createSdkHttpClient();
SdkHttpFullRequest request = mockSdkRequest("https://localhost:" + mockServer.httpsPort(), SdkHttpMethod.POST);
@@ -185,7 +185,9 @@ private SdkHttpFullRequest mockSdkRequest(String uriString, SdkHttpMethod method
.putHeader("Host", uri.getHost())
.putHeader("User-Agent", "hello-world!");
if (method != SdkHttpMethod.HEAD) {
- requestBuilder.contentStreamProvider(() -> new ByteArrayInputStream("Body".getBytes(StandardCharsets.UTF_8)));
+ byte[] content = "Body".getBytes(StandardCharsets.UTF_8);
+ requestBuilder.putHeader("Content-Length", Integer.toString(content.length));
+ requestBuilder.contentStreamProvider(() -> new ByteArrayInputStream(content));
}
return requestBuilder.build();
diff --git a/test/http-client-tests/src/main/java/software/amazon/awssdk/http/SdkHttpClientTestSuite.java b/test/http-client-tests/src/main/java/software/amazon/awssdk/http/SdkHttpClientTestSuite.java
index 941fefa10d69..540c38129d36 100644
--- a/test/http-client-tests/src/main/java/software/amazon/awssdk/http/SdkHttpClientTestSuite.java
+++ b/test/http-client-tests/src/main/java/software/amazon/awssdk/http/SdkHttpClientTestSuite.java
@@ -50,7 +50,7 @@
/**
* A set of tests validating that the functionality implemented by a {@link SdkHttpClient}.
- *
+ *
* This is used by an HTTP plugin implementation by extending this class and implementing the abstract methods to provide this
* suite with a testable HTTP client implementation.
*/
@@ -108,13 +108,13 @@ public void supportsResponseCode500() throws Exception {
}
@Test
- public void validatesHttpsCertificateIssuer() throws Exception {
- SdkHttpClient client = createSdkHttpClient();
-
- SdkHttpFullRequest request = mockSdkRequest("https://localhost:" + mockServer.httpsPort(), SdkHttpMethod.POST);
+ public void validatesHttpsCertificateIssuer() {
+ try (SdkHttpClient client = createSdkHttpClient()) {
+ SdkHttpFullRequest request = mockSdkRequest("https://localhost:" + mockServer.httpsPort(), SdkHttpMethod.POST);
- assertThatThrownBy(client.prepareRequest(HttpExecuteRequest.builder().request(request).build())::call)
+ assertThatThrownBy(client.prepareRequest(HttpExecuteRequest.builder().request(request).build())::call)
.isInstanceOf(SSLHandshakeException.class);
+ }
}
@Test
@@ -123,22 +123,26 @@ public void connectionPoolingWorks() throws Exception {
SdkHttpClientOptions httpClientOptions = new SdkHttpClientOptions();
httpClientOptions.trustAll(true);
- SdkHttpClient client = createSdkHttpClient(httpClientOptions);
-
- stubForMockRequest(200);
-
- for (int i = 0; i < 5; i++) {
- SdkHttpFullRequest req = mockSdkRequest("http://localhost:" + mockServer.port(), SdkHttpMethod.POST);
- HttpExecuteResponse response =
- client.prepareRequest(HttpExecuteRequest.builder()
- .request(req)
- .contentStreamProvider(req.contentStreamProvider().orElse(null))
- .build())
- .call();
- response.responseBody().ifPresent(IoUtils::drainInputStream);
- }
+ try (SdkHttpClient client = createSdkHttpClient(httpClientOptions)) {
+ stubForMockRequest(200);
+
+ for (int i = 0; i < 5; i++) {
+ SdkHttpFullRequest req = mockSdkRequest("http://localhost:" + mockServer.port(), SdkHttpMethod.POST);
+ HttpExecuteResponse response =
+ client.prepareRequest(HttpExecuteRequest.builder()
+ .request(req)
+ .contentStreamProvider(req.contentStreamProvider().orElse(null))
+ .build())
+ .call();
+ response.responseBody().ifPresent(IoUtils::drainInputStream);
+ }
- assertThat(CONNECTION_COUNTER.openedConnections()).isEqualTo(initialOpenedConnections + 1);
+ // connection pool growth strategies vary across client implementations. Some, such as the CRT grow connection counts
+ // by a factor of 2, while some grow strictly as requested. Mainly we want to test that it kicks in at some point and
+ // doesn't create a new connection for all 5 requests. This proves that while allowing variance in this behavior.
+ assertThat(CONNECTION_COUNTER.openedConnections()).isGreaterThanOrEqualTo(initialOpenedConnections + 1);
+ assertThat(CONNECTION_COUNTER.openedConnections()).isLessThanOrEqualTo(initialOpenedConnections + 2);
+ }
}
@Test
@@ -147,22 +151,26 @@ public void connectionsAreNotReusedOn5xxErrors() throws Exception {
SdkHttpClientOptions httpClientOptions = new SdkHttpClientOptions();
httpClientOptions.trustAll(true);
- SdkHttpClient client = createSdkHttpClient(httpClientOptions);
-
- stubForMockRequest(503);
-
- for (int i = 0; i < 5; i++) {
- SdkHttpFullRequest req = mockSdkRequest("http://localhost:" + mockServer.port(), SdkHttpMethod.POST);
- HttpExecuteResponse response =
- client.prepareRequest(HttpExecuteRequest.builder()
- .request(req)
- .contentStreamProvider(req.contentStreamProvider().orElse(null))
- .build())
- .call();
- response.responseBody().ifPresent(IoUtils::drainInputStream);
- }
+ try (SdkHttpClient client = createSdkHttpClient(httpClientOptions)) {
+ stubForMockRequest(503);
+
+ for (int i = 0; i < 5; i++) {
+ SdkHttpFullRequest req = mockSdkRequest("http://localhost:" + mockServer.port(), SdkHttpMethod.POST);
+ HttpExecuteResponse response =
+ client.prepareRequest(HttpExecuteRequest.builder()
+ .request(req)
+ .contentStreamProvider(req.contentStreamProvider().orElse(null))
+ .build())
+ .call();
+ response.responseBody().ifPresent(IoUtils::drainInputStream);
+ }
- assertThat(CONNECTION_COUNTER.openedConnections()).isEqualTo(initialOpenedConnections + 5);
+ // don't couple this test to connection manager behaviors we don't have to. We want to make sure that the
+ // connection count increased by at least as many connections as we got 5xx errors back on. But the connection
+ // manager also predictively creates connections and we need to take those into account in a way that lets it
+ // remain a dynamic behavior.
+ assertThat(CONNECTION_COUNTER.openedConnections()).isGreaterThanOrEqualTo(initialOpenedConnections + 5);
+ }
}
@Test
@@ -177,11 +185,14 @@ public void testCustomTlsTrustManager() throws Exception {
selfSignedServer.start();
- try {
- SdkHttpClient client = createSdkHttpClient(httpClientOptions);
+ try (SdkHttpClient client = createSdkHttpClient(httpClientOptions)) {
SdkHttpFullRequest request = mockSdkRequest("https://localhost:" + selfSignedServer.httpsPort(), SdkHttpMethod.POST);
- client.prepareRequest(HttpExecuteRequest.builder().request(request).build()).call();
+ client.prepareRequest(HttpExecuteRequest.builder()
+ .request(request)
+ .contentStreamProvider(request.contentStreamProvider().orElse(null))
+ .build())
+ .call();
} finally {
selfSignedServer.stop();
}
@@ -192,7 +203,10 @@ public void testTrustAllWorks() throws Exception {
SdkHttpClientOptions httpClientOptions = new SdkHttpClientOptions();
httpClientOptions.trustAll(true);
- testForResponseCodeUsingHttps(createSdkHttpClient(httpClientOptions), HttpURLConnection.HTTP_OK);
+ try (SdkHttpClient client = createSdkHttpClient(httpClientOptions)) {
+ testForResponseCodeUsingHttps(client, HttpURLConnection.HTTP_OK);
+ }
+
}
@Test
@@ -209,19 +223,19 @@ protected void testForResponseCode(int returnCode) throws Exception {
}
private void testForResponseCode(int returnCode, SdkHttpMethod method) throws Exception {
- SdkHttpClient client = createSdkHttpClient();
-
- stubForMockRequest(returnCode);
-
- SdkHttpFullRequest req = mockSdkRequest("http://localhost:" + mockServer.port(), method);
- HttpExecuteResponse rsp = client.prepareRequest(HttpExecuteRequest.builder()
- .request(req)
- .contentStreamProvider(req.contentStreamProvider()
- .orElse(null))
- .build())
- .call();
-
- validateResponse(rsp, returnCode, method);
+ try (SdkHttpClient client = createSdkHttpClient()) {
+ stubForMockRequest(returnCode);
+
+ SdkHttpFullRequest req = mockSdkRequest("http://localhost:" + mockServer.port(), method);
+ HttpExecuteResponse rsp = client.prepareRequest(HttpExecuteRequest.builder()
+ .request(req)
+ .contentStreamProvider(req.contentStreamProvider()
+ .orElse(null))
+ .build())
+ .call();
+
+ validateResponse(rsp, returnCode, method);
+ }
}
protected void testForResponseCodeUsingHttps(SdkHttpClient client, int returnCode) throws Exception {
@@ -277,15 +291,36 @@ private void validateResponse(HttpExecuteResponse response, int returnCode, SdkH
mockServer.resetMappings();
}
- protected SdkHttpFullRequest mockSdkRequest(String uriString, SdkHttpMethod method) {
+ protected SdkHttpFullRequest mockSdkRequest(String uriString, SdkHttpMethod method, boolean chunkedEncoding) {
+ SdkHttpFullRequest.Builder requestBuilder = mockSdkRequestBuilder(uriString, method);
+ if (method != SdkHttpMethod.HEAD) {
+ byte[] content = "Body".getBytes(StandardCharsets.UTF_8);
+ if (!chunkedEncoding) {
+ requestBuilder.putHeader("Content-Length", Integer.toString(content.length));
+ }
+ requestBuilder.contentStreamProvider(() -> new ByteArrayInputStream(content));
+ }
+
+ return requestBuilder.build();
+ }
+
+ private static SdkHttpFullRequest.Builder mockSdkRequestBuilder(String uriString, SdkHttpMethod method) {
URI uri = URI.create(uriString);
SdkHttpFullRequest.Builder requestBuilder = SdkHttpFullRequest.builder()
- .uri(uri)
- .method(method)
- .putHeader("Host", uri.getHost())
- .putHeader("User-Agent", "hello-world!");
+ .uri(uri)
+ .method(method)
+ .putHeader("Host", uri.getHost())
+ .putHeader("User-Agent", "hello-world!");
+ return requestBuilder;
+ }
+
+
+ protected SdkHttpFullRequest mockSdkRequest(String uriString, SdkHttpMethod method) {
+ SdkHttpFullRequest.Builder requestBuilder = mockSdkRequestBuilder(uriString, method);
if (method != SdkHttpMethod.HEAD) {
- requestBuilder.contentStreamProvider(() -> new ByteArrayInputStream("Body".getBytes(StandardCharsets.UTF_8)));
+ byte[] content = "Body".getBytes(StandardCharsets.UTF_8);
+ requestBuilder.putHeader("Content-Length", Integer.toString(content.length));
+ requestBuilder.contentStreamProvider(() -> new ByteArrayInputStream(content));
}
return requestBuilder.build();
diff --git a/test/module-path-tests/pom.xml b/test/module-path-tests/pom.xml
index 9c3d0935501e..d13f18f547eb 100644
--- a/test/module-path-tests/pom.xml
+++ b/test/module-path-tests/pom.xml
@@ -20,7 +20,7 @@
aws-sdk-java-pom
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
../../pom.xml
4.0.0
diff --git a/test/old-client-version-compatibility-test/pom.xml b/test/old-client-version-compatibility-test/pom.xml
index a49826a97daf..98ac41dbc8f6 100644
--- a/test/old-client-version-compatibility-test/pom.xml
+++ b/test/old-client-version-compatibility-test/pom.xml
@@ -21,7 +21,7 @@
aws-sdk-java-pom
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
../../pom.xml
diff --git a/test/protocol-tests-core/pom.xml b/test/protocol-tests-core/pom.xml
index 1b5e8407b83f..d83df4953dd9 100644
--- a/test/protocol-tests-core/pom.xml
+++ b/test/protocol-tests-core/pom.xml
@@ -20,7 +20,7 @@
aws-sdk-java-pom
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
../../pom.xml
4.0.0
diff --git a/test/protocol-tests/pom.xml b/test/protocol-tests/pom.xml
index f63d67b9dbdb..ff99004d0317 100644
--- a/test/protocol-tests/pom.xml
+++ b/test/protocol-tests/pom.xml
@@ -20,7 +20,7 @@
aws-sdk-java-pom
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
../../pom.xml
4.0.0
diff --git a/test/region-testing/pom.xml b/test/region-testing/pom.xml
index a18bc86a1226..42cb86d1a041 100644
--- a/test/region-testing/pom.xml
+++ b/test/region-testing/pom.xml
@@ -20,7 +20,7 @@
aws-sdk-java-pom
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
../../pom.xml
4.0.0
diff --git a/test/ruleset-testing-core/pom.xml b/test/ruleset-testing-core/pom.xml
index 993011c3c55a..135887f36a33 100644
--- a/test/ruleset-testing-core/pom.xml
+++ b/test/ruleset-testing-core/pom.xml
@@ -20,7 +20,7 @@
aws-sdk-java-pom
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
../../pom.xml
4.0.0
diff --git a/test/s3-benchmarks/pom.xml b/test/s3-benchmarks/pom.xml
index 9b646a6996ed..e10c4816c8c8 100644
--- a/test/s3-benchmarks/pom.xml
+++ b/test/s3-benchmarks/pom.xml
@@ -20,7 +20,7 @@
aws-sdk-java-pom
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
../../pom.xml
4.0.0
diff --git a/test/sdk-benchmarks/pom.xml b/test/sdk-benchmarks/pom.xml
index 262bc362e515..8636525a3d61 100644
--- a/test/sdk-benchmarks/pom.xml
+++ b/test/sdk-benchmarks/pom.xml
@@ -19,7 +19,7 @@
software.amazon.awssdk
aws-sdk-java-pom
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
../../pom.xml
diff --git a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/BenchmarkRunner.java b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/BenchmarkRunner.java
index 4c49f0270a87..d63c1e2391e5 100644
--- a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/BenchmarkRunner.java
+++ b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/BenchmarkRunner.java
@@ -42,6 +42,7 @@
import software.amazon.awssdk.benchmark.apicall.httpclient.async.NettyHttpClientH1Benchmark;
import software.amazon.awssdk.benchmark.apicall.httpclient.async.NettyHttpClientH2Benchmark;
import software.amazon.awssdk.benchmark.apicall.httpclient.sync.ApacheHttpClientBenchmark;
+import software.amazon.awssdk.benchmark.apicall.httpclient.sync.CrtHttpClientBenchmark;
import software.amazon.awssdk.benchmark.apicall.httpclient.sync.UrlConnectionHttpClientBenchmark;
import software.amazon.awssdk.benchmark.apicall.protocol.Ec2ProtocolBenchmark;
import software.amazon.awssdk.benchmark.apicall.protocol.JsonProtocolBenchmark;
@@ -75,7 +76,8 @@ public class BenchmarkRunner {
private static final List SYNC_BENCHMARKS = Arrays.asList(
ApacheHttpClientBenchmark.class.getSimpleName(),
- UrlConnectionHttpClientBenchmark.class.getSimpleName());
+ UrlConnectionHttpClientBenchmark.class.getSimpleName(),
+ CrtHttpClientBenchmark.class.getSimpleName());
private static final List COLD_START_BENCHMARKS = Arrays.asList(
V2OptimizedClientCreationBenchmark.class.getSimpleName(),
diff --git a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/apicall/httpclient/sync/ApacheHttpClientBenchmark.java b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/apicall/httpclient/sync/ApacheHttpClientBenchmark.java
index 9dc7319184a9..232a892c23d5 100644
--- a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/apicall/httpclient/sync/ApacheHttpClientBenchmark.java
+++ b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/apicall/httpclient/sync/ApacheHttpClientBenchmark.java
@@ -48,6 +48,7 @@
import software.amazon.awssdk.benchmark.utils.MockServer;
import software.amazon.awssdk.http.SdkHttpClient;
import software.amazon.awssdk.http.apache.ApacheHttpClient;
+import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.protocolrestjson.ProtocolRestJsonClient;
/**
@@ -74,6 +75,7 @@ public void setup() throws Exception {
client = ProtocolRestJsonClient.builder()
.endpointOverride(mockServer.getHttpsUri())
.httpClient(sdkHttpClient)
+ .region(Region.US_EAST_1)
.build();
executorService = Executors.newFixedThreadPool(CONCURRENT_CALLS);
diff --git a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/apicall/httpclient/sync/CrtHttpClientBenchmark.java b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/apicall/httpclient/sync/CrtHttpClientBenchmark.java
new file mode 100644
index 000000000000..3e59cdf09281
--- /dev/null
+++ b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/apicall/httpclient/sync/CrtHttpClientBenchmark.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://aws.amazon.com/apache2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package software.amazon.awssdk.benchmark.apicall.httpclient.sync;
+
+import static software.amazon.awssdk.benchmark.utils.BenchmarkConstant.CONCURRENT_CALLS;
+import static software.amazon.awssdk.benchmark.utils.BenchmarkUtils.awaitCountdownLatchUninterruptibly;
+import static software.amazon.awssdk.benchmark.utils.BenchmarkUtils.countDownUponCompletion;
+import static software.amazon.awssdk.benchmark.utils.BenchmarkUtils.trustAllTlsAttributeMapBuilder;
+
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Fork;
+import org.openjdk.jmh.annotations.Level;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OperationsPerInvocation;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.TearDown;
+import org.openjdk.jmh.annotations.Warmup;
+import org.openjdk.jmh.infra.Blackhole;
+import org.openjdk.jmh.profile.StackProfiler;
+import org.openjdk.jmh.runner.Runner;
+import org.openjdk.jmh.runner.options.Options;
+import org.openjdk.jmh.runner.options.OptionsBuilder;
+import software.amazon.awssdk.benchmark.apicall.httpclient.SdkHttpClientBenchmark;
+import software.amazon.awssdk.benchmark.utils.MockServer;
+import software.amazon.awssdk.http.SdkHttpClient;
+import software.amazon.awssdk.http.crt.AwsCrtHttpClient;
+import software.amazon.awssdk.regions.Region;
+import software.amazon.awssdk.services.protocolrestjson.ProtocolRestJsonClient;
+
+/**
+ * Benchmarking for running with different http clients.
+ */
+@State(Scope.Benchmark)
+@Warmup(iterations = 3, time = 15, timeUnit = TimeUnit.SECONDS)
+@Measurement(iterations = 5, time = 10, timeUnit = TimeUnit.SECONDS)
+@Fork(2) // To reduce difference between each run
+@BenchmarkMode(Mode.Throughput)
+public class CrtHttpClientBenchmark implements SdkHttpClientBenchmark {
+
+ private MockServer mockServer;
+ private SdkHttpClient sdkHttpClient;
+ private ProtocolRestJsonClient client;
+ private ExecutorService executorService;
+
+ @Setup(Level.Trial)
+ public void setup() throws Exception {
+ mockServer = new MockServer();
+ mockServer.start();
+ sdkHttpClient = AwsCrtHttpClient.builder()
+ .buildWithDefaults(trustAllTlsAttributeMapBuilder().build());
+ client = ProtocolRestJsonClient.builder()
+ .endpointOverride(mockServer.getHttpsUri())
+ .region(Region.US_EAST_1)
+ .httpClient(sdkHttpClient)
+ .build();
+ executorService = Executors.newFixedThreadPool(CONCURRENT_CALLS);
+
+ client.allTypes();
+ }
+
+ @TearDown(Level.Trial)
+ public void tearDown() throws Exception {
+ executorService.shutdown();
+ mockServer.stop();
+ sdkHttpClient.close();
+ client.close();
+ }
+
+ @Benchmark
+ @Override
+ public void sequentialApiCall(Blackhole blackhole) {
+ blackhole.consume(client.allTypes());
+ }
+
+ @Benchmark
+ @Override
+ @OperationsPerInvocation(CONCURRENT_CALLS)
+ public void concurrentApiCall(Blackhole blackhole) {
+ CountDownLatch countDownLatch = new CountDownLatch(CONCURRENT_CALLS);
+ for (int i = 0; i < CONCURRENT_CALLS; i++) {
+ countDownUponCompletion(blackhole,
+ CompletableFuture.runAsync(() -> client.allTypes(), executorService), countDownLatch);
+ }
+
+ awaitCountdownLatchUninterruptibly(countDownLatch, 10, TimeUnit.SECONDS);
+ }
+
+ public static void main(String... args) throws Exception {
+
+ Options opt = new OptionsBuilder()
+ .include(CrtHttpClientBenchmark.class.getSimpleName() + ".concurrentApiCall")
+ .addProfiler(StackProfiler.class)
+ .build();
+ new Runner(opt).run();
+ }
+}
diff --git a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/apicall/httpclient/sync/UrlConnectionHttpClientBenchmark.java b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/apicall/httpclient/sync/UrlConnectionHttpClientBenchmark.java
index 3ff99b5dcd0b..9a7abfc20eea 100644
--- a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/apicall/httpclient/sync/UrlConnectionHttpClientBenchmark.java
+++ b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/apicall/httpclient/sync/UrlConnectionHttpClientBenchmark.java
@@ -43,6 +43,7 @@
import software.amazon.awssdk.benchmark.utils.MockServer;
import software.amazon.awssdk.http.SdkHttpClient;
import software.amazon.awssdk.http.urlconnection.UrlConnectionHttpClient;
+import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.protocolrestjson.ProtocolRestJsonClient;
/**
@@ -68,6 +69,7 @@ public void setup() throws Exception {
.buildWithDefaults(trustAllTlsAttributeMapBuilder().build());
client = ProtocolRestJsonClient.builder()
.endpointOverride(mockServer.getHttpsUri())
+ .region(Region.US_EAST_1)
.httpClient(sdkHttpClient)
.build();
client.allTypes();
diff --git a/test/sdk-native-image-test/pom.xml b/test/sdk-native-image-test/pom.xml
index 4568d6fd479c..a243541f36c6 100644
--- a/test/sdk-native-image-test/pom.xml
+++ b/test/sdk-native-image-test/pom.xml
@@ -20,7 +20,7 @@
aws-sdk-java-pom
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
../../pom.xml
4.0.0
diff --git a/test/service-test-utils/pom.xml b/test/service-test-utils/pom.xml
index 6b37c59a5589..2be334a53890 100644
--- a/test/service-test-utils/pom.xml
+++ b/test/service-test-utils/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
aws-sdk-java-pom
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
../../pom.xml
service-test-utils
diff --git a/test/stability-tests/pom.xml b/test/stability-tests/pom.xml
index 6b585a47da5b..963364e1ca86 100644
--- a/test/stability-tests/pom.xml
+++ b/test/stability-tests/pom.xml
@@ -20,7 +20,7 @@
aws-sdk-java-pom
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
../../pom.xml
4.0.0
diff --git a/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3AsyncBaseStabilityTest.java b/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3AsyncBaseStabilityTest.java
new file mode 100644
index 000000000000..20f27963bdad
--- /dev/null
+++ b/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3AsyncBaseStabilityTest.java
@@ -0,0 +1,208 @@
+/*
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://aws.amazon.com/apache2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package software.amazon.awssdk.stability.tests.s3;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.time.Duration;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+import java.util.function.IntFunction;
+import org.apache.commons.lang3.RandomStringUtils;
+import software.amazon.awssdk.core.async.AsyncRequestBody;
+import software.amazon.awssdk.core.async.AsyncResponseTransformer;
+import software.amazon.awssdk.core.sync.RequestBody;
+import software.amazon.awssdk.http.apache.ApacheHttpClient;
+import software.amazon.awssdk.services.s3.S3AsyncClient;
+import software.amazon.awssdk.services.s3.S3Client;
+import software.amazon.awssdk.services.s3.model.DeleteBucketRequest;
+import software.amazon.awssdk.services.s3.model.NoSuchBucketException;
+import software.amazon.awssdk.services.s3.model.NoSuchKeyException;
+import software.amazon.awssdk.stability.tests.exceptions.StabilityTestsRetryableException;
+import software.amazon.awssdk.stability.tests.utils.RetryableTest;
+import software.amazon.awssdk.stability.tests.utils.StabilityTestRunner;
+import software.amazon.awssdk.testutils.RandomTempFile;
+import software.amazon.awssdk.testutils.service.AwsTestBase;
+import software.amazon.awssdk.utils.Logger;
+import software.amazon.awssdk.utils.Md5Utils;
+
+public abstract class S3AsyncBaseStabilityTest extends AwsTestBase {
+ private static final Logger log = Logger.loggerFor(S3AsyncBaseStabilityTest.class);
+ protected static final int CONCURRENCY = 100;
+ protected static final int TOTAL_RUNS = 50;
+ protected static final String LARGE_KEY_NAME = "2GB";
+
+ protected static S3Client s3ApacheClient;
+ private final S3AsyncClient testClient;
+
+ static {
+ s3ApacheClient = S3Client.builder()
+ .httpClientBuilder(ApacheHttpClient.builder()
+ .maxConnections(CONCURRENCY))
+ .credentialsProvider(CREDENTIALS_PROVIDER_CHAIN)
+ .overrideConfiguration(b -> b.apiCallTimeout(Duration.ofMinutes(10)))
+ .build();
+ }
+
+ public S3AsyncBaseStabilityTest(S3AsyncClient testClient) {
+ this.testClient = testClient;
+ }
+
+ @RetryableTest(maxRetries = 3, retryableException = StabilityTestsRetryableException.class)
+ public void largeObject_put_get_usingFile() {
+ String md5Upload = uploadLargeObjectFromFile();
+ String md5Download = downloadLargeObjectToFile();
+ assertThat(md5Upload).isEqualTo(md5Download);
+ }
+
+ @RetryableTest(maxRetries = 3, retryableException = StabilityTestsRetryableException.class)
+ public void putObject_getObject_highConcurrency() {
+ putObject();
+ getObject();
+ }
+
+ protected String computeKeyName(int i) {
+ return "key_" + i;
+ }
+
+ protected abstract String getTestBucketName();
+
+ protected void doGetBucketAcl_lowTpsLongInterval() {
+ IntFunction> future = i -> testClient.getBucketAcl(b -> b.bucket(getTestBucketName()));
+ String className = this.getClass().getSimpleName();
+ StabilityTestRunner.newRunner()
+ .testName(className + ".getBucketAcl_lowTpsLongInterval")
+ .futureFactory(future)
+ .requestCountPerRun(10)
+ .totalRuns(3)
+ .delaysBetweenEachRun(Duration.ofSeconds(6))
+ .run();
+ }
+
+
+ protected String downloadLargeObjectToFile() {
+ File randomTempFile = RandomTempFile.randomUncreatedFile();
+ StabilityTestRunner.newRunner()
+ .testName("S3AsyncStabilityTest.downloadLargeObjectToFile")
+ .futures(testClient.getObject(b -> b.bucket(getTestBucketName()).key(LARGE_KEY_NAME),
+ AsyncResponseTransformer.toFile(randomTempFile)))
+ .run();
+
+
+ try {
+ return Md5Utils.md5AsBase64(randomTempFile);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ } finally {
+ randomTempFile.delete();
+ }
+ }
+
+ protected String uploadLargeObjectFromFile() {
+ RandomTempFile file = null;
+ try {
+ file = new RandomTempFile((long) 2e+9);
+ String md5 = Md5Utils.md5AsBase64(file);
+ StabilityTestRunner.newRunner()
+ .testName("S3AsyncStabilityTest.uploadLargeObjectFromFile")
+ .futures(testClient.putObject(b -> b.bucket(getTestBucketName()).key(LARGE_KEY_NAME),
+ AsyncRequestBody.fromFile(file)))
+ .run();
+ return md5;
+ } catch (IOException e) {
+ throw new RuntimeException("fail to create test file", e);
+ } finally {
+ if (file != null) {
+ file.delete();
+ }
+ }
+ }
+
+ protected void putObject() {
+ byte[] bytes = RandomStringUtils.randomAlphanumeric(10_000).getBytes();
+
+ IntFunction> future = i -> {
+ String keyName = computeKeyName(i);
+ return testClient.putObject(b -> b.bucket(getTestBucketName()).key(keyName),
+ AsyncRequestBody.fromBytes(bytes));
+ };
+
+ StabilityTestRunner.newRunner()
+ .testName("S3AsyncStabilityTest.putObject")
+ .futureFactory(future)
+ .requestCountPerRun(CONCURRENCY)
+ .totalRuns(TOTAL_RUNS)
+ .delaysBetweenEachRun(Duration.ofMillis(100))
+ .run();
+ }
+
+ protected void getObject() {
+ IntFunction> future = i -> {
+ String keyName = computeKeyName(i);
+ Path path = RandomTempFile.randomUncreatedFile().toPath();
+ return testClient.getObject(b -> b.bucket(getTestBucketName()).key(keyName), AsyncResponseTransformer.toFile(path));
+ };
+
+ StabilityTestRunner.newRunner()
+ .testName("S3AsyncStabilityTest.getObject")
+ .futureFactory(future)
+ .requestCountPerRun(CONCURRENCY)
+ .totalRuns(TOTAL_RUNS)
+ .delaysBetweenEachRun(Duration.ofMillis(100))
+ .run();
+ }
+
+ protected static void deleteBucketAndAllContents(S3AsyncClient client, String bucketName) {
+ try {
+ List> futures = new ArrayList<>();
+
+ client.listObjectsV2Paginator(b -> b.bucket(bucketName))
+ .subscribe(r -> r.contents().forEach(s -> futures.add(client.deleteObject(o -> o.bucket(bucketName).key(s.key())))))
+ .join();
+
+ CompletableFuture>[] futureArray = futures.toArray(new CompletableFuture>[0]);
+
+ CompletableFuture.allOf(futureArray).join();
+
+ client.deleteBucket(DeleteBucketRequest.builder().bucket(bucketName).build()).join();
+ } catch (Exception e) {
+ log.error(() -> "Failed to delete bucket: " +bucketName);
+ }
+ }
+
+ protected void verifyObjectExist(String bucketName, String keyName, long size) throws IOException {
+ try {
+ s3ApacheClient.headBucket(b -> b.bucket(bucketName));
+ } catch (NoSuchBucketException e) {
+ log.info(() -> "NoSuchBucketException was thrown, staring to create the bucket");
+ s3ApacheClient.createBucket(b -> b.bucket(bucketName));
+ }
+
+ try {
+ s3ApacheClient.headObject(b -> b.key(keyName).bucket(bucketName));
+ } catch (NoSuchKeyException e) {
+ log.info(() -> "NoSuchKeyException was thrown, starting to upload the object");
+ RandomTempFile file = new RandomTempFile(size);
+ s3ApacheClient.putObject(b -> b.bucket(bucketName).key(keyName), RequestBody.fromFile(file));
+ file.delete();
+ }
+ }
+
+}
diff --git a/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3WithCrtAsyncHttpClientStabilityTest.java b/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3AsyncWithCrtAsyncHttpClientStabilityTest.java
similarity index 93%
rename from test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3WithCrtAsyncHttpClientStabilityTest.java
rename to test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3AsyncWithCrtAsyncHttpClientStabilityTest.java
index c92e5f691194..9573f12f54e7 100644
--- a/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3WithCrtAsyncHttpClientStabilityTest.java
+++ b/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3AsyncWithCrtAsyncHttpClientStabilityTest.java
@@ -13,7 +13,7 @@
/**
* Stability tests for {@link S3AsyncClient} using {@link AwsCrtAsyncHttpClient}
*/
-public class S3WithCrtAsyncHttpClientStabilityTest extends S3BaseStabilityTest {
+public class S3AsyncWithCrtAsyncHttpClientStabilityTest extends S3AsyncBaseStabilityTest {
private static String bucketName = "s3withcrtasyncclientstabilitytests" + System.currentTimeMillis();
@@ -33,7 +33,7 @@ public class S3WithCrtAsyncHttpClientStabilityTest extends S3BaseStabilityTest {
.build();
}
- public S3WithCrtAsyncHttpClientStabilityTest() {
+ public S3AsyncWithCrtAsyncHttpClientStabilityTest() {
super(s3CrtClient);
}
diff --git a/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3BaseStabilityTest.java b/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3BaseStabilityTest.java
index df8c1871f56a..b6805a7c2d43 100644
--- a/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3BaseStabilityTest.java
+++ b/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3BaseStabilityTest.java
@@ -24,11 +24,12 @@
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
import java.util.function.IntFunction;
import org.apache.commons.lang3.RandomStringUtils;
-import software.amazon.awssdk.core.async.AsyncRequestBody;
-import software.amazon.awssdk.core.async.AsyncResponseTransformer;
import software.amazon.awssdk.core.sync.RequestBody;
+import software.amazon.awssdk.core.sync.ResponseTransformer;
import software.amazon.awssdk.http.apache.ApacheHttpClient;
import software.amazon.awssdk.services.s3.S3AsyncClient;
import software.amazon.awssdk.services.s3.S3Client;
@@ -47,10 +48,19 @@ public abstract class S3BaseStabilityTest extends AwsTestBase {
private static final Logger log = Logger.loggerFor(S3BaseStabilityTest.class);
protected static final int CONCURRENCY = 100;
protected static final int TOTAL_RUNS = 50;
- protected static final String LARGE_KEY_NAME = "2GB";
+
+ protected static final String LARGEST_KEY_NAME = "16MB";
protected static S3Client s3ApacheClient;
- private final S3AsyncClient testClient;
+ protected static ExecutorService futureThreadPool;
+
+ private final S3Client testClient;
+
+
+ // The JVM does a bunch under the hood, so leave some room for magic.
+ private static final int ALLOWED_THREAD_OVERHEAD = 50;
+
+ protected int allowedPeakThreads;
static {
s3ApacheClient = S3Client.builder()
@@ -61,7 +71,14 @@ public abstract class S3BaseStabilityTest extends AwsTestBase {
.build();
}
- public S3BaseStabilityTest(S3AsyncClient testClient) {
+ protected S3BaseStabilityTest() {
+ this(null, 0);
+ }
+
+ protected S3BaseStabilityTest(S3Client testClient, int testClientThreadsUsed) {
+ // use the passed in known thread count for testClient, plus CONCURRENCY for the sync executor,
+ // and some room for the JVM to do weird things.
+ this.allowedPeakThreads = testClientThreadsUsed + CONCURRENCY + ALLOWED_THREAD_OVERHEAD;
this.testClient = testClient;
}
@@ -85,9 +102,10 @@ protected String computeKeyName(int i) {
protected abstract String getTestBucketName();
protected void doGetBucketAcl_lowTpsLongInterval() {
- IntFunction> future = i -> testClient.getBucketAcl(b -> b.bucket(getTestBucketName()));
+ IntFunction> future =
+ i -> CompletableFuture.supplyAsync(() -> testClient.getBucketAcl(b -> b.bucket(getTestBucketName())), futureThreadPool);
String className = this.getClass().getSimpleName();
- StabilityTestRunner.newRunner()
+ StabilityTestRunner.newRunner(allowedPeakThreads)
.testName(className + ".getBucketAcl_lowTpsLongInterval")
.futureFactory(future)
.requestCountPerRun(10)
@@ -99,10 +117,14 @@ protected void doGetBucketAcl_lowTpsLongInterval() {
protected String downloadLargeObjectToFile() {
File randomTempFile = RandomTempFile.randomUncreatedFile();
- StabilityTestRunner.newRunner()
- .testName("S3AsyncStabilityTest.downloadLargeObjectToFile")
- .futures(testClient.getObject(b -> b.bucket(getTestBucketName()).key(LARGE_KEY_NAME),
- AsyncResponseTransformer.toFile(randomTempFile)))
+
+ StabilityTestRunner.newRunner(allowedPeakThreads)
+ .testName("S3StabilityTest.downloadLargeObjectToFile")
+ .futures(CompletableFuture.supplyAsync(() -> {
+ testClient.getObject(b -> b.bucket(getTestBucketName())
+ .key(LARGEST_KEY_NAME), ResponseTransformer.toFile(randomTempFile));
+ return null;
+ }, futureThreadPool))
.run();
@@ -116,36 +138,40 @@ protected String downloadLargeObjectToFile() {
}
protected String uploadLargeObjectFromFile() {
- RandomTempFile file = null;
try {
- file = new RandomTempFile((long) 2e+9);
- String md5 = Md5Utils.md5AsBase64(file);
- StabilityTestRunner.newRunner()
- .testName("S3AsyncStabilityTest.uploadLargeObjectFromFile")
- .futures(testClient.putObject(b -> b.bucket(getTestBucketName()).key(LARGE_KEY_NAME),
- AsyncRequestBody.fromFile(file)))
- .run();
- return md5;
- } catch (IOException e) {
- throw new RuntimeException("fail to create test file", e);
- } finally {
- if (file != null) {
+ RandomTempFile file = new RandomTempFile(16L * 1024 * 1024);
+
+ try {
+ String md5 = Md5Utils.md5AsBase64(file);
+ StabilityTestRunner.newRunner(allowedPeakThreads)
+ .testName("S3StabilityTest.uploadLargeObjectFromFile")
+ .futures(CompletableFuture.supplyAsync(() -> {
+ testClient.putObject(b -> b.bucket(getTestBucketName()).key(LARGEST_KEY_NAME), file.toPath());
+
+ return null;
+ }, futureThreadPool))
+ .run();
+ return md5;
+ } finally {
file.delete();
}
+ } catch (IOException e) {
+ throw new RuntimeException(e);
}
}
protected void putObject() {
byte[] bytes = RandomStringUtils.randomAlphanumeric(10_000).getBytes();
- IntFunction> future = i -> {
+ IntFunction> future = i -> CompletableFuture.supplyAsync(() -> {
String keyName = computeKeyName(i);
- return testClient.putObject(b -> b.bucket(getTestBucketName()).key(keyName),
- AsyncRequestBody.fromBytes(bytes));
- };
+ testClient.putObject(b -> b.bucket(getTestBucketName()).key(keyName), RequestBody.fromBytes(bytes));
- StabilityTestRunner.newRunner()
- .testName("S3AsyncStabilityTest.putObject")
+ return null;
+ }, futureThreadPool);
+
+ StabilityTestRunner.newRunner(allowedPeakThreads)
+ .testName("S3StabilityTest.putObject")
.futureFactory(future)
.requestCountPerRun(CONCURRENCY)
.totalRuns(TOTAL_RUNS)
@@ -154,14 +180,16 @@ protected void putObject() {
}
protected void getObject() {
- IntFunction> future = i -> {
+ IntFunction> future = i -> CompletableFuture.supplyAsync(() -> {
String keyName = computeKeyName(i);
Path path = RandomTempFile.randomUncreatedFile().toPath();
- return testClient.getObject(b -> b.bucket(getTestBucketName()).key(keyName), AsyncResponseTransformer.toFile(path));
- };
+ testClient.getObject(b -> b.bucket(getTestBucketName()).key(keyName), ResponseTransformer.toFile(path));
+
+ return null;
+ }, futureThreadPool);
- StabilityTestRunner.newRunner()
- .testName("S3AsyncStabilityTest.getObject")
+ StabilityTestRunner.newRunner(allowedPeakThreads)
+ .testName("S3StabilityTest.getObject")
.futureFactory(future)
.requestCountPerRun(CONCURRENCY)
.totalRuns(TOTAL_RUNS)
@@ -204,5 +232,4 @@ protected void verifyObjectExist(String bucketName, String keyName, long size) t
file.delete();
}
}
-
}
diff --git a/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3CrtAsyncClientStabilityTest.java b/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3CrtAsyncClientStabilityTest.java
index dc91d6328d0c..10c803700cb5 100644
--- a/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3CrtAsyncClientStabilityTest.java
+++ b/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3CrtAsyncClientStabilityTest.java
@@ -25,9 +25,9 @@
/**
* Stability tests for {@link S3CrtAsyncClient}
*/
-public class S3CrtAsyncClientStabilityTest extends S3BaseStabilityTest {
- private static final String BUCKET_NAME = "s3crtasyncclinetstabilitytests" + System.currentTimeMillis();
- private static S3AsyncClient s3CrtAsyncClient;
+public class S3CrtAsyncClientStabilityTest extends S3AsyncBaseStabilityTest {
+ private static final String BUCKET_NAME = String.format("s3crtasyncclinetstabilitytests%d", System.currentTimeMillis());
+ private static final S3AsyncClient s3CrtAsyncClient;
static {
s3CrtAsyncClient = S3CrtAsyncClient.builder()
diff --git a/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3CrtClientStabilityTest.java b/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3CrtClientStabilityTest.java
new file mode 100644
index 000000000000..dfbcbf26e6b3
--- /dev/null
+++ b/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3CrtClientStabilityTest.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://aws.amazon.com/apache2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package software.amazon.awssdk.stability.tests.s3;
+
+import java.time.Duration;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import software.amazon.awssdk.crt.CrtResource;
+import software.amazon.awssdk.crt.SystemInfo;
+import software.amazon.awssdk.http.crt.AwsCrtHttpClient;
+import software.amazon.awssdk.http.nio.netty.NettyNioAsyncHttpClient;
+import software.amazon.awssdk.services.s3.S3AsyncClient;
+import software.amazon.awssdk.services.s3.S3Client;
+import software.amazon.awssdk.services.s3.internal.crt.S3CrtAsyncClient;
+
+/**
+ * Stability tests for S3 sync client using {@link AwsCrtHttpClient}.
+ */
+public class S3CrtClientStabilityTest extends S3BaseStabilityTest {
+ private static final String BUCKET_NAME = String.format("s3crthttpclientstabilitytests%d", System.currentTimeMillis());
+
+ private static final int CRT_CLIENT_THREAD_COUNT;
+
+ private static final S3Client s3Client;
+
+
+ static {
+ s3Client = S3Client.builder()
+ .httpClientBuilder(AwsCrtHttpClient.builder()
+ .maxConcurrency(CONCURRENCY))
+ .credentialsProvider(CREDENTIALS_PROVIDER_CHAIN)
+ .overrideConfiguration(b -> b.apiCallTimeout(Duration.ofMinutes(10)))
+ .build();
+
+ // The underlying client has a thread per processor in its default configuration along with a DNS resolver thread.
+ CRT_CLIENT_THREAD_COUNT = SystemInfo.getProcessorCount() + 1;
+
+ }
+
+ public S3CrtClientStabilityTest() {
+ super(s3Client, CRT_CLIENT_THREAD_COUNT);
+ }
+
+ @BeforeAll
+ public static void setup() {
+ System.setProperty("aws.crt.debugnative", "true");
+ s3ApacheClient.createBucket(b -> b.bucket(BUCKET_NAME));
+ futureThreadPool = Executors.newFixedThreadPool(CONCURRENCY);
+ }
+
+ @AfterAll
+ public static void cleanup() {
+ try (S3AsyncClient s3NettyClient = S3AsyncClient.builder()
+ .httpClientBuilder(NettyNioAsyncHttpClient.builder()
+ .maxConcurrency(CONCURRENCY))
+ .credentialsProvider(CREDENTIALS_PROVIDER_CHAIN)
+ .build()) {
+ deleteBucketAndAllContents(s3NettyClient, BUCKET_NAME);
+ }
+ s3Client.close();
+ s3ApacheClient.close();
+ CrtResource.waitForNoResources();
+ futureThreadPool.shutdown();
+ try {
+ futureThreadPool.awaitTermination(5, TimeUnit.SECONDS);
+ } catch (InterruptedException e) {
+
+ }
+ }
+
+ @Override
+ protected String getTestBucketName() {
+ return BUCKET_NAME;
+ }
+}
diff --git a/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3NettyAsyncStabilityTest.java b/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3NettyAsyncStabilityTest.java
index d7afa62bade0..e852004fec33 100644
--- a/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3NettyAsyncStabilityTest.java
+++ b/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3NettyAsyncStabilityTest.java
@@ -10,7 +10,7 @@
import java.time.Duration;
-public class S3NettyAsyncStabilityTest extends S3BaseStabilityTest {
+public class S3NettyAsyncStabilityTest extends S3AsyncBaseStabilityTest {
private static String bucketName = "s3nettyasyncstabilitytests" + System.currentTimeMillis();
diff --git a/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/utils/StabilityTestRunner.java b/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/utils/StabilityTestRunner.java
index 5e47ea3d1e83..eceda3abc1a5 100644
--- a/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/utils/StabilityTestRunner.java
+++ b/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/utils/StabilityTestRunner.java
@@ -74,7 +74,9 @@ public class StabilityTestRunner {
private static final int TESTS_TIMEOUT_IN_MINUTES = 60;
// The peak thread count might be different depending on the machine the tests are currently running on.
// because of the internal thread pool used in AsynchronousFileChannel
- private static final int ALLOWED_PEAK_THREAD_COUNT = 90;
+ // Also, synchronous clients have their own thread pools so this measurement needs to be mutable
+ // so that the async and synchronous paths can both use this runner.
+ private int allowedPeakThreadCount = 90;
private ThreadMXBean threadMXBean;
private IntFunction> futureFactory;
@@ -91,6 +93,11 @@ private StabilityTestRunner() {
threadMXBean.resetPeakThreadCount();
}
+ private StabilityTestRunner(int allowedPeakThreadCount) {
+ this();
+ this.allowedPeakThreadCount = allowedPeakThreadCount;
+ }
+
/**
* Create a new test runner
*
@@ -100,6 +107,10 @@ public static StabilityTestRunner newRunner() {
return new StabilityTestRunner();
}
+ public static StabilityTestRunner newRunner(int allowedPeakThreadCount) {
+ return new StabilityTestRunner(allowedPeakThreadCount);
+ }
+
public StabilityTestRunner futureFactory(IntFunction> futureFactory) {
this.futureFactory = futureFactory;
return this;
@@ -331,9 +342,9 @@ private void processResult(TestResult testResult) {
throw new StabilityTestsRetryableException(errorMessage);
}
- if (testResult.peakThreadCount() > ALLOWED_PEAK_THREAD_COUNT) {
+ if (testResult.peakThreadCount() > allowedPeakThreadCount) {
String errorMessage = String.format("The number of peak thread exceeds the allowed peakThread threshold %s",
- ALLOWED_PEAK_THREAD_COUNT);
+ allowedPeakThreadCount);
threadDump(testResult.testName());
diff --git a/test/test-utils/pom.xml b/test/test-utils/pom.xml
index 61ccc245a3ad..5ab41c5dd076 100644
--- a/test/test-utils/pom.xml
+++ b/test/test-utils/pom.xml
@@ -21,7 +21,7 @@
software.amazon.awssdk
aws-sdk-java-pom
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
../../pom.xml
test-utils
diff --git a/test/tests-coverage-reporting/pom.xml b/test/tests-coverage-reporting/pom.xml
index 4f11ec5221f7..2fed4bf7f10a 100644
--- a/test/tests-coverage-reporting/pom.xml
+++ b/test/tests-coverage-reporting/pom.xml
@@ -20,7 +20,7 @@
aws-sdk-java-pom
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
../../pom.xml
4.0.0
diff --git a/third-party/pom.xml b/third-party/pom.xml
index e0344e4e33ee..35a6459a7beb 100644
--- a/third-party/pom.xml
+++ b/third-party/pom.xml
@@ -21,7 +21,7 @@
aws-sdk-java-pom
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
third-party
diff --git a/third-party/third-party-jackson-core/pom.xml b/third-party/third-party-jackson-core/pom.xml
index 2c67a2155b48..9710c0a7e679 100644
--- a/third-party/third-party-jackson-core/pom.xml
+++ b/third-party/third-party-jackson-core/pom.xml
@@ -20,7 +20,7 @@
third-party
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
4.0.0
diff --git a/third-party/third-party-jackson-dataformat-cbor/pom.xml b/third-party/third-party-jackson-dataformat-cbor/pom.xml
index 14384e8f3223..9069a7f6551c 100644
--- a/third-party/third-party-jackson-dataformat-cbor/pom.xml
+++ b/third-party/third-party-jackson-dataformat-cbor/pom.xml
@@ -20,7 +20,7 @@
third-party
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
4.0.0
diff --git a/third-party/third-party-slf4j-api/pom.xml b/third-party/third-party-slf4j-api/pom.xml
index c766015b9756..c07ca14d29f8 100644
--- a/third-party/third-party-slf4j-api/pom.xml
+++ b/third-party/third-party-slf4j-api/pom.xml
@@ -20,7 +20,7 @@
third-party
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
4.0.0
diff --git a/utils/pom.xml b/utils/pom.xml
index 4fc62886ba3b..9baa33a17e0a 100644
--- a/utils/pom.xml
+++ b/utils/pom.xml
@@ -20,7 +20,7 @@
aws-sdk-java-pom
software.amazon.awssdk
- 2.21.47-SNAPSHOT
+ 2.22.0-SNAPSHOT
4.0.0
diff --git a/utils/src/main/java/software/amazon/awssdk/utils/async/InputStreamSubscriber.java b/utils/src/main/java/software/amazon/awssdk/utils/async/InputStreamSubscriber.java
index a33cc9b0b994..95f697b6d689 100644
--- a/utils/src/main/java/software/amazon/awssdk/utils/async/InputStreamSubscriber.java
+++ b/utils/src/main/java/software/amazon/awssdk/utils/async/InputStreamSubscriber.java
@@ -82,7 +82,10 @@ public void onError(Throwable t) {
@Override
public void onComplete() {
- callQueue.add(new QueueEntry(true, delegate::onComplete));
+ callQueue.add(new QueueEntry(true, () -> {
+ delegate.onComplete();
+ inputStreamState.set(State.STREAMING_DONE);
+ }));
drainQueue();
}
@@ -125,6 +128,11 @@ public int read(byte[] bytes, int off, int len) {
@Override
public void close() {
synchronized (subscribeLock) {
+ // If it is done, no-op
+ if (inputStreamState.get().equals(State.STREAMING_DONE)) {
+ return;
+ }
+
if (inputStreamState.compareAndSet(State.UNINITIALIZED, State.CLOSED)) {
delegate.onSubscribe(new NoOpSubscription());
delegate.onError(new CancellationException());
@@ -153,6 +161,9 @@ private void doDrainQueue() {
while (true) {
QueueEntry entry = callQueue.poll();
if (done || entry == null) {
+ if (done) {
+ inputStreamState.set(State.STREAMING_DONE);
+ }
return;
}
done = entry.terminal;
@@ -173,7 +184,8 @@ private QueueEntry(boolean terminal, Runnable call) {
private enum State {
UNINITIALIZED,
READABLE,
- CLOSED
+ CLOSED,
+ STREAMING_DONE
}
private final class CancelWatcher implements Subscription {