Skip to content

Commit 1b7c9e1

Browse files
committed
New options for configuring SSLSession cache, close AsyncHttpClient#837
1 parent 1866a34 commit 1b7c9e1

File tree

5 files changed

+74
-10
lines changed

5 files changed

+74
-10
lines changed

api/src/main/java/org/asynchttpclient/AsyncHttpClientConfig.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ public class AsyncHttpClientConfig {
100100
protected int ioThreadMultiplier;
101101
protected String[] enabledProtocols;
102102
protected String[] enabledCipherSuites;
103+
protected Integer sslSessionCacheSize;
104+
protected Integer sslSessionTimeout;
103105
protected AsyncHttpProviderConfig<?, ?> providerConfig;
104106

105107
// AHC 2 specific
@@ -139,6 +141,8 @@ private AsyncHttpClientConfig(int connectTimeout,//
139141
int ioThreadMultiplier, //
140142
String[] enabledProtocols,//
141143
String[] enabledCipherSuites,//
144+
Integer sslSessionCacheSize,//
145+
Integer sslSessionTimeout,//
142146
AsyncHttpProviderConfig<?, ?> providerConfig,//
143147
boolean spdyEnabled, //
144148
int spdyInitialWindowSize, //
@@ -173,6 +177,8 @@ private AsyncHttpClientConfig(int connectTimeout,//
173177
this.ioThreadMultiplier = ioThreadMultiplier;
174178
this.enabledProtocols = enabledProtocols;
175179
this.enabledCipherSuites = enabledCipherSuites;
180+
this.sslSessionCacheSize = sslSessionCacheSize;
181+
this.sslSessionTimeout = sslSessionTimeout;
176182
this.providerConfig = providerConfig;
177183
this.spdyEnabled = spdyEnabled;
178184
this.spdyInitialWindowSize = spdyInitialWindowSize;
@@ -505,6 +511,20 @@ public String[] getEnabledCipherSuites() {
505511
return enabledCipherSuites;
506512
}
507513

514+
/**
515+
* since 1.9.13
516+
*/
517+
public Integer getSslSessionCacheSize() {
518+
return sslSessionCacheSize;
519+
}
520+
521+
/**
522+
* since 1.9.13
523+
*/
524+
public Integer getSslSessionTimeout() {
525+
return sslSessionTimeout;
526+
}
527+
508528
/**
509529
* Builder for an {@link AsyncHttpClient}
510530
*/
@@ -540,6 +560,8 @@ public static class Builder {
540560
private int ioThreadMultiplier = defaultIoThreadMultiplier();
541561
private String[] enabledProtocols;
542562
private String[] enabledCipherSuites;
563+
private Integer sslSessionCacheSize = defaultSslSessionCacheSize();
564+
private Integer sslSessionTimeout = defaultSslSessionTimeout();
543565
private AsyncHttpProviderConfig<?, ?> providerConfig;
544566

545567
// AHC 2
@@ -992,6 +1014,16 @@ public Builder setEnabledCipherSuites(String[] enabledCipherSuites) {
9921014
return this;
9931015
}
9941016

1017+
public Builder setSslSessionCacheSize(Integer sslSessionCacheSize) {
1018+
this.sslSessionCacheSize = sslSessionCacheSize;
1019+
return this;
1020+
}
1021+
1022+
public Builder setSslSessionTimeout(Integer sslSessionTimeout) {
1023+
this.sslSessionTimeout = sslSessionTimeout;
1024+
return this;
1025+
}
1026+
9951027
/**
9961028
* Create a config builder with values taken from the given prototype configuration.
9971029
*
@@ -1032,6 +1064,8 @@ public Builder(AsyncHttpClientConfig prototype) {
10321064
acceptAnyCertificate = prototype.acceptAnyCertificate;
10331065
enabledProtocols = prototype.enabledProtocols;
10341066
enabledCipherSuites = prototype.enabledCipherSuites;
1067+
sslSessionCacheSize = prototype.sslSessionCacheSize;
1068+
sslSessionTimeout = prototype.sslSessionTimeout;
10351069

10361070
spdyEnabled = prototype.isSpdyEnabled();
10371071
spdyInitialWindowSize = prototype.getSpdyInitialWindowSize();
@@ -1083,6 +1117,8 @@ public AsyncHttpClientConfig build() {
10831117
ioThreadMultiplier, //
10841118
enabledProtocols, //
10851119
enabledCipherSuites, //
1120+
sslSessionCacheSize, //
1121+
sslSessionTimeout, //
10861122
providerConfig, //
10871123
spdyEnabled, //
10881124
spdyInitialWindowSize, //

api/src/main/java/org/asynchttpclient/AsyncHttpClientConfigBean.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ void configureDefaults() {
6464
disableUrlEncodingForBoundRequests = defaultDisableUrlEncodingForBoundRequests();
6565
strict302Handling = defaultStrict302Handling();
6666
acceptAnyCertificate = defaultAcceptAnyCertificate();
67+
sslSessionCacheSize = defaultSslSessionCacheSize();
68+
sslSessionTimeout = defaultSslSessionTimeout();
6769

6870
if (defaultUseProxySelector()) {
6971
proxyServerSelector = ProxyUtils.getJdkDefaultProxyServerSelector();
@@ -223,4 +225,14 @@ public AsyncHttpClientConfigBean setAcceptAnyCertificate(boolean acceptAnyCertif
223225
this.acceptAnyCertificate = acceptAnyCertificate;
224226
return this;
225227
}
228+
229+
public AsyncHttpClientConfigBean setSslSessionCacheSize(Integer sslSessionCacheSize) {
230+
this.sslSessionCacheSize = sslSessionCacheSize;
231+
return this;
232+
}
233+
234+
public AsyncHttpClientConfigBean setSslSessionTimeout(Integer sslSessionTimeout) {
235+
this.sslSessionTimeout = sslSessionTimeout;
236+
return this;
237+
}
226238
}

api/src/main/java/org/asynchttpclient/AsyncHttpClientConfigDefaults.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,4 +120,12 @@ public static int defaultSpdyMaxConcurrentStreams() {
120120
public static boolean defaultAcceptAnyCertificate() {
121121
return AsyncPropertiesHelper.getAsyncHttpClientConfig().getBoolean(ASYNC_CLIENT + "acceptAnyCertificate");
122122
}
123+
124+
public static Integer defaultSslSessionCacheSize() {
125+
return Integer.getInteger(ASYNC_CLIENT + "sslSessionCacheSize");
126+
}
127+
128+
public static Integer defaultSslSessionTimeout() {
129+
return Integer.getInteger(ASYNC_CLIENT + "sslSessionTimeout");
130+
}
123131
}

api/src/main/java/org/asynchttpclient/SSLEngineFactory.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,7 @@ public DefaultSSLEngineFactory(AsyncHttpClientConfig config) {
4444

4545
@Override
4646
public SSLEngine newSSLEngine(String peerHost, int peerPort) throws GeneralSecurityException {
47-
SSLContext sslContext = config.getSSLContext();
48-
49-
if (sslContext == null)
50-
sslContext = SslUtils.getInstance().getSSLContext(config.isAcceptAnyCertificate());
47+
SSLContext sslContext = SslUtils.getInstance().getSSLContext(config);
5148

5249
SSLEngine sslEngine = sslContext.createSSLEngine(peerHost, peerPort);
5350
if (!config.isAcceptAnyCertificate()) {

api/src/main/java/org/asynchttpclient/util/SslUtils.java

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,17 @@
1515
*/
1616
package org.asynchttpclient.util;
1717

18-
import javax.net.ssl.SSLContext;
19-
import javax.net.ssl.TrustManager;
20-
import javax.net.ssl.X509TrustManager;
21-
2218
import java.security.GeneralSecurityException;
2319
import java.security.KeyManagementException;
2420
import java.security.NoSuchAlgorithmException;
2521
import java.security.SecureRandom;
2622

23+
import javax.net.ssl.SSLContext;
24+
import javax.net.ssl.TrustManager;
25+
import javax.net.ssl.X509TrustManager;
26+
27+
import org.asynchttpclient.AsyncHttpClientConfig;
28+
2729
/**
2830
* This class is a copy of http://github.com/sonatype/wagon-ning/raw/master/src/main/java/org/apache/maven/wagon/providers/http/SslUtils.java
2931
*/
@@ -64,7 +66,16 @@ public static SslUtils getInstance() {
6466
return SingletonHolder.instance;
6567
}
6668

67-
public SSLContext getSSLContext(boolean acceptAnyCertificate) throws GeneralSecurityException {
68-
return acceptAnyCertificate? looseTrustManagerSSLContext: SSLContext.getDefault();
69+
public SSLContext getSSLContext(AsyncHttpClientConfig config) throws GeneralSecurityException {
70+
SSLContext sslContext = config.getSSLContext();
71+
72+
if (sslContext != null) {
73+
sslContext = config.isAcceptAnyCertificate() ? looseTrustManagerSSLContext : SSLContext.getDefault();
74+
if (config.getSslSessionCacheSize() != null)
75+
sslContext.getClientSessionContext().setSessionCacheSize(config.getSslSessionCacheSize());
76+
if (config.getSslSessionTimeout() != null)
77+
sslContext.getClientSessionContext().setSessionTimeout(config.getSslSessionTimeout());
78+
}
79+
return sslContext;
6980
}
7081
}

0 commit comments

Comments
 (0)