Skip to content

Commit ad29dd4

Browse files
authored
If tlsNegotiationTimeout is not configured, it will be resolved as th… (#2917)
* If tlsNegotiationTimeout is not configured, it will be resolved as the connectTimeout * Address feedback * Fix tls timeout resolution * Update changelog entry
1 parent 1f15812 commit ad29dd4

File tree

4 files changed

+56
-1
lines changed

4 files changed

+56
-1
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"category": "Netty NIO HTTP Client",
3+
"contributor": "",
4+
"type": "feature",
5+
"description": "If `tlsNegotiationTimeout` is not configured, it will be set to the resolved `connectionTimeout`. By default, `tlsNegotiationTimeout` is now 2s instead of 10s"
6+
}

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,9 @@ public final class SdkHttpConfigurationOption<T> extends AttributeMap.Key<T> {
124124
/**
125125
* The maximum amount of time that a TLS handshake is allowed to take from the time the CLIENT HELLO
126126
* message is sent to the time the client and server have fully negotiated ciphers and exchanged keys.
127+
*
128+
* <p>
129+
* If not specified, the default value will be the same as the resolved {@link #CONNECTION_TIMEOUT}.
127130
*/
128131
public static final SdkHttpConfigurationOption<Duration> TLS_NEGOTIATION_TIMEOUT =
129132
new SdkHttpConfigurationOption<>("TlsNegotiationTimeout", Duration.class);
@@ -134,7 +137,7 @@ public final class SdkHttpConfigurationOption<T> extends AttributeMap.Key<T> {
134137
private static final Duration DEFAULT_CONNECTION_ACQUIRE_TIMEOUT = Duration.ofSeconds(10);
135138
private static final Duration DEFAULT_CONNECTION_MAX_IDLE_TIMEOUT = Duration.ofSeconds(60);
136139
private static final Duration DEFAULT_CONNECTION_TIME_TO_LIVE = Duration.ZERO;
137-
private static final Duration DEFAULT_TLS_HANDSHAKE_TIMEOUT = Duration.ofSeconds(10);
140+
private static final Duration DEFAULT_TLS_HANDSHAKE_TIMEOUT = DEFAULT_CONNECTION_TIMEOUT;
138141
private static final Boolean DEFAULT_REAP_IDLE_CONNECTIONS = Boolean.TRUE;
139142
private static final int DEFAULT_MAX_CONNECTIONS = 50;
140143
private static final int DEFAULT_MAX_CONNECTION_ACQUIRES = 10_000;

http-clients/netty-nio-client/src/main/java/software/amazon/awssdk/http/nio/netty/NettyNioAsyncHttpClient.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -720,6 +720,11 @@ public void setHttp2Configuration(Http2Configuration http2Configuration) {
720720

721721
@Override
722722
public SdkAsyncHttpClient buildWithDefaults(AttributeMap serviceDefaults) {
723+
if (standardOptions.get(SdkHttpConfigurationOption.TLS_NEGOTIATION_TIMEOUT) == null) {
724+
standardOptions.put(SdkHttpConfigurationOption.TLS_NEGOTIATION_TIMEOUT,
725+
standardOptions.get(SdkHttpConfigurationOption.CONNECTION_TIMEOUT));
726+
}
727+
723728
return new NettyNioAsyncHttpClient(this, standardOptions.build()
724729
.merge(serviceDefaults)
725730
.merge(NETTY_HTTP_DEFAULTS)

http-clients/netty-nio-client/src/test/java/software/amazon/awssdk/http/nio/netty/NettyNioAsyncHttpClientWireMockTest.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,47 @@ public void defaultConnectionIdleTimeout() {
125125
}
126126
}
127127

128+
@Test
129+
public void noTlsTimeout_shouldResolveToConnectTimeout() {
130+
Duration connectTimeout = Duration.ofSeconds(1);
131+
try (NettyNioAsyncHttpClient client = (NettyNioAsyncHttpClient) NettyNioAsyncHttpClient.builder()
132+
.connectionTimeout(connectTimeout)
133+
.build()) {
134+
assertThat(client.configuration().tlsHandshakeTimeout()).isEqualTo(connectTimeout);
135+
}
136+
Duration timeoutOverride = Duration.ofSeconds(2);
137+
try (NettyNioAsyncHttpClient client = (NettyNioAsyncHttpClient) NettyNioAsyncHttpClient.builder()
138+
.connectionTimeout(connectTimeout)
139+
.connectionTimeout(timeoutOverride)
140+
.build()) {
141+
assertThat(client.configuration().tlsHandshakeTimeout()).isEqualTo(timeoutOverride);
142+
}
143+
144+
try (NettyNioAsyncHttpClient client = (NettyNioAsyncHttpClient) NettyNioAsyncHttpClient.create()) {
145+
assertThat(client.configuration().tlsHandshakeTimeout().toMillis()).
146+
isEqualTo(client.configuration().connectTimeoutMillis());
147+
}
148+
}
149+
150+
@Test
151+
public void tlsTimeoutConfigured_shouldHonor() {
152+
Duration connectTimeout = Duration.ofSeconds(1);
153+
Duration tlsTimeout = Duration.ofSeconds(3);
154+
try (NettyNioAsyncHttpClient client = (NettyNioAsyncHttpClient) NettyNioAsyncHttpClient.builder()
155+
.tlsNegotiationTimeout(tlsTimeout)
156+
.connectionTimeout(connectTimeout)
157+
.build()) {
158+
assertThat(client.configuration().tlsHandshakeTimeout()).isEqualTo(tlsTimeout);
159+
}
160+
161+
try (NettyNioAsyncHttpClient client = (NettyNioAsyncHttpClient) NettyNioAsyncHttpClient.builder()
162+
.connectionTimeout(connectTimeout)
163+
.tlsNegotiationTimeout(tlsTimeout)
164+
.build()) {
165+
assertThat(client.configuration().tlsHandshakeTimeout()).isEqualTo(tlsTimeout);
166+
}
167+
}
168+
128169
@Test
129170
public void overrideConnectionIdleTimeout_shouldHonor() {
130171
try (NettyNioAsyncHttpClient client = (NettyNioAsyncHttpClient) NettyNioAsyncHttpClient.builder()

0 commit comments

Comments
 (0)