Skip to content

Commit 70547a5

Browse files
Avery-DunnSomkaPe
andauthored
Improve HTTP client timeouts (#275)
* 1.6.2 release (#269) * 1.6.2 release * Make DefaultHttpClient timeouts settable * Refactor timeout names Co-authored-by: SomkaPe <[email protected]>
1 parent 0b20b14 commit 70547a5

File tree

3 files changed

+49
-7
lines changed

3 files changed

+49
-7
lines changed

src/main/java/com/microsoft/aad/msal4j/AbstractClientApplicationBase.java

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,14 @@ abstract class AbstractClientApplicationBase implements IClientApplicationBase {
6666
@Getter
6767
private SSLSocketFactory sslSocketFactory;
6868

69+
@Accessors(fluent = true)
70+
@Getter
71+
private Integer connectTimeoutForDefaultHttpClient;
72+
73+
@Accessors(fluent = true)
74+
@Getter
75+
private Integer readTimeoutForDefaultHttpClient;
76+
6977
@Accessors(fluent = true)
7078
@Getter
7179
protected TokenCache tokenCache;
@@ -284,6 +292,8 @@ abstract static class Builder<T extends Builder<T>> {
284292
private ITokenCacheAccessAspect tokenCacheAccessAspect;
285293
private AadInstanceDiscoveryResponse aadInstanceDiscoveryResponse;
286294
private String clientCapabilities;
295+
private Integer connectTimeoutForDefaultHttpClient;
296+
private Integer readTimeoutForDefaultHttpClient;
287297

288298
/**
289299
* Constructor to create instance of Builder of client application
@@ -446,6 +456,34 @@ public T sslSocketFactory(SSLSocketFactory val) {
446456
return self();
447457
}
448458

459+
/**
460+
* Sets the connect timeout value used in HttpsURLConnection connections made by {@link DefaultHttpClient},
461+
* and is not needed if using a custom HTTP client
462+
*
463+
* @param val timeout value in milliseconds
464+
* @return instance of the Builder on which method was called
465+
*/
466+
public T connectTimeoutForDefaultHttpClient(Integer val) {
467+
validateNotNull("connectTimeoutForDefaultHttpClient", val);
468+
469+
connectTimeoutForDefaultHttpClient = val;
470+
return self();
471+
}
472+
473+
/**
474+
* Sets the read timeout value used in HttpsURLConnection connections made by {@link DefaultHttpClient},
475+
* and is not needed if using a custom HTTP client
476+
*
477+
* @param val timeout value in milliseconds
478+
* @return instance of the Builder on which method was called
479+
*/
480+
public T readTimeoutForDefaultHttpClient(Integer val) {
481+
validateNotNull("readTimeoutForDefaultHttpClient", val);
482+
483+
readTimeoutForDefaultHttpClient = val;
484+
return self();
485+
}
486+
449487
T telemetryConsumer(Consumer<List<HashMap<String, String>>> val) {
450488
validateNotNull("telemetryConsumer", val);
451489

@@ -549,10 +587,12 @@ public T clientCapabilities(Set<String> capabilities) {
549587
telemetryConsumer = builder.telemetryConsumer;
550588
proxy = builder.proxy;
551589
sslSocketFactory = builder.sslSocketFactory;
590+
connectTimeoutForDefaultHttpClient = builder.connectTimeoutForDefaultHttpClient;
591+
readTimeoutForDefaultHttpClient = builder.readTimeoutForDefaultHttpClient;
552592
serviceBundle = new ServiceBundle(
553593
builder.executorService,
554594
builder.httpClient == null ?
555-
new DefaultHttpClient(builder.proxy, builder.sslSocketFactory) :
595+
new DefaultHttpClient(builder.proxy, builder.sslSocketFactory, builder.connectTimeoutForDefaultHttpClient, builder.readTimeoutForDefaultHttpClient) :
556596
builder.httpClient,
557597
new TelemetryManager(telemetryConsumer, builder.onlySendFailureTelemetry));
558598
authenticationAuthority = builder.authenticationAuthority;

src/main/java/com/microsoft/aad/msal4j/DefaultHttpClient.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,14 @@ class DefaultHttpClient implements IHttpClient {
1515

1616
private final Proxy proxy;
1717
private final SSLSocketFactory sslSocketFactory;
18-
public int DEFAULTCONNECTIONTIMEOUT = 3000;
19-
public int DEFAULTREADTIMEOUT = 5000;
18+
private int connectTimeout = 10000;
19+
private int readTimeout = 15000;
2020

21-
DefaultHttpClient(Proxy proxy, SSLSocketFactory sslSocketFactory){
21+
DefaultHttpClient(Proxy proxy, SSLSocketFactory sslSocketFactory, Integer connectTimeout, Integer readTimeout){
2222
this.proxy = proxy;
2323
this.sslSocketFactory = sslSocketFactory;
24+
if (connectTimeout != null) this.connectTimeout = connectTimeout;
25+
if (readTimeout != null) this.readTimeout = readTimeout;
2426
}
2527

2628
public IHttpResponse send(HttpRequest httpRequest) throws Exception{
@@ -78,8 +80,8 @@ private HttpsURLConnection openConnection(final URL finalURL)
7880
connection.setSSLSocketFactory(sslSocketFactory);
7981
}
8082

81-
connection.setConnectTimeout(DEFAULTCONNECTIONTIMEOUT);
82-
connection.setReadTimeout(DEFAULTREADTIMEOUT);
83+
connection.setConnectTimeout(connectTimeout);
84+
connection.setReadTimeout(readTimeout);
8385

8486
return connection;
8587
}

src/test/java/com/microsoft/aad/msal4j/TokenRequestExecutorTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ private TokenRequestExecutor createMockedTokenRequest() throws URISyntaxExceptio
119119

120120
ServiceBundle serviceBundle = new ServiceBundle(
121121
null,
122-
new DefaultHttpClient(null, null),
122+
new DefaultHttpClient(null, null, null, null),
123123
new TelemetryManager(null, false));
124124

125125
return PowerMock.createPartialMock(

0 commit comments

Comments
 (0)