From 7c7f008edac61b02be58e9bb9d9959caa61052b1 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Tue, 15 Sep 2020 13:02:06 -0400 Subject: [PATCH 1/6] - fixes unit test with leaky implementation --- src/test/java/com/microsoft/graph/functional/BatchTests.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/java/com/microsoft/graph/functional/BatchTests.java b/src/test/java/com/microsoft/graph/functional/BatchTests.java index 0af1d1b6c32..a0f1b7deb62 100644 --- a/src/test/java/com/microsoft/graph/functional/BatchTests.java +++ b/src/test/java/com/microsoft/graph/functional/BatchTests.java @@ -68,6 +68,7 @@ public void GetsABatchFromRequests() throws IOException{ assertEquals(200, batchResponse.code()); final MSBatchResponseContent responseContent = new MSBatchResponseContent(batchResponse); + batchResponse.close(); assertEquals(400, responseContent.getResponseById(userPostId).code()); //400:we're not providing enough properties for the call to go through assertEquals(200, responseContent.getResponseById(meGetId).code()); From 8b8dc160ec716995e73a63a12bd66ff192843fcd Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Tue, 15 Sep 2020 13:42:53 -0400 Subject: [PATCH 2/6] - enables connections retry from ok http lib to avoid bubbling exceptions --- src/main/java/com/microsoft/graph/http/CoreHttpProvider.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/microsoft/graph/http/CoreHttpProvider.java b/src/main/java/com/microsoft/graph/http/CoreHttpProvider.java index 1cb2cf2db96..77fb8450a6e 100644 --- a/src/main/java/com/microsoft/graph/http/CoreHttpProvider.java +++ b/src/main/java/com/microsoft/graph/http/CoreHttpProvider.java @@ -367,7 +367,6 @@ public Request authenticateRequest(Request request) { okBuilder.connectTimeout(connectionConfig.getConnectTimeout(), TimeUnit.MILLISECONDS); okBuilder.readTimeout(connectionConfig.getReadTimeout(), TimeUnit.MILLISECONDS); okBuilder.followRedirects(false); - okBuilder.retryOnConnectionFailure(false); this.corehttpClient = okBuilder.build(); } if (authenticationProvider != null) { From 0e987027fb2c76846c5bc38e3dc6cc09c6550812 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Tue, 15 Sep 2020 14:30:47 -0400 Subject: [PATCH 3/6] - adds end to end unit test for throttling handler --- .../microsoft/graph/functional/UserTests.java | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/microsoft/graph/functional/UserTests.java b/src/test/java/com/microsoft/graph/functional/UserTests.java index 2f0c9143fe9..84d7554e346 100644 --- a/src/test/java/com/microsoft/graph/functional/UserTests.java +++ b/src/test/java/com/microsoft/graph/functional/UserTests.java @@ -1,11 +1,15 @@ package com.microsoft.graph.functional; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; import org.junit.Before; import org.junit.Ignore; @@ -24,7 +28,6 @@ import com.microsoft.graph.requests.extensions.IOrganizationCollectionPage; import com.microsoft.graph.requests.extensions.IUsedInsightCollectionPage; import com.microsoft.graph.requests.extensions.IUserCollectionPage; - @Ignore public class UserTests { IGraphServiceClient graphServiceClient = null; @@ -163,5 +166,26 @@ public void meMemberof() { IDirectoryObjectCollectionWithReferencesPage page = graphServiceClient.me().memberOf().buildRequest().get(); assertNotNull(page); } + @Test + public void getMeAndRetryOnThrottling() throws Exception { + ExecutorService exec = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2); + try { + for(Integer i = 0; i < 2000; i++) { + exec.submit(new Runnable() { + @Override + public void run() { + final IUserCollectionPage users = graphServiceClient.users().buildRequest().get(); + assertNotNull(users); + final List currentPage = users.getCurrentPage(); + assertNotNull(currentPage); + assertNotEquals(0, currentPage.size()); + } + }); + } + exec.awaitTermination(5L, TimeUnit.MINUTES); + } finally { + exec.shutdown(); + } + } } From 2f082f59b9f2aef87e540931595dc128c9ce4f8b Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Thu, 17 Sep 2020 13:19:30 -0400 Subject: [PATCH 4/6] - disables HTTP/2 to avoid faulty handshakes with service on Java 11+ --- .../graph/http/CoreHttpProvider.java | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/microsoft/graph/http/CoreHttpProvider.java b/src/main/java/com/microsoft/graph/http/CoreHttpProvider.java index 79a5ff8740e..eb6fb505c88 100644 --- a/src/main/java/com/microsoft/graph/http/CoreHttpProvider.java +++ b/src/main/java/com/microsoft/graph/http/CoreHttpProvider.java @@ -356,20 +356,22 @@ private Result sendRequestInternal(final IHttpRe throws ClientException { try { + if(this.connectionConfig == null) { + this.connectionConfig = new DefaultConnectionConfig(); + } if(this.corehttpClient == null) { - OkHttpClient.Builder okBuilder = HttpClients.createDefault(new ICoreAuthenticationProvider() { - @Override - public Request authenticateRequest(Request request) { - return request; - } - }).newBuilder(); - if(this.connectionConfig == null) { - this.connectionConfig = new DefaultConnectionConfig(); - } - okBuilder.connectTimeout(connectionConfig.getConnectTimeout(), TimeUnit.MILLISECONDS); - okBuilder.readTimeout(connectionConfig.getReadTimeout(), TimeUnit.MILLISECONDS); - okBuilder.followRedirects(false); - this.corehttpClient = okBuilder.build(); + this.corehttpClient = HttpClients + .createDefault(new ICoreAuthenticationProvider() { + @Override + public Request authenticateRequest(Request request) { + return request; + } + }).newBuilder() + .connectTimeout(connectionConfig.getConnectTimeout(), TimeUnit.MILLISECONDS) + .readTimeout(connectionConfig.getReadTimeout(), TimeUnit.MILLISECONDS) + .followRedirects(false) + .protocols(Arrays.asList(Protocol.HTTP_1_1)) //https://stackoverflow.com/questions/62031298/sockettimeout-on-java-11-but-not-on-java-8 + .build(); } if (authenticationProvider != null) { authenticationProvider.authenticateRequest(request); From 0709db5d65878350e89e0108301515f3aad7539a Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Thu, 17 Sep 2020 14:01:51 -0400 Subject: [PATCH 5/6] - adds missing imports following commit triage --- src/main/java/com/microsoft/graph/http/CoreHttpProvider.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/microsoft/graph/http/CoreHttpProvider.java b/src/main/java/com/microsoft/graph/http/CoreHttpProvider.java index eb6fb505c88..1e7fc5a8b82 100644 --- a/src/main/java/com/microsoft/graph/http/CoreHttpProvider.java +++ b/src/main/java/com/microsoft/graph/http/CoreHttpProvider.java @@ -31,6 +31,7 @@ import java.io.UnsupportedEncodingException; import java.net.URL; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -58,6 +59,7 @@ import okhttp3.Headers; import okhttp3.MediaType; import okhttp3.OkHttpClient; +import okhttp3.Protocol; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; From de17b611f2b9fad63451b40a8af3d221f5be79e0 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Fri, 18 Sep 2020 09:41:07 -0400 Subject: [PATCH 6/6] - fixes indentation --- .../graph/http/CoreHttpProvider.java | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/microsoft/graph/http/CoreHttpProvider.java b/src/main/java/com/microsoft/graph/http/CoreHttpProvider.java index 1e7fc5a8b82..5fa79bde72d 100644 --- a/src/main/java/com/microsoft/graph/http/CoreHttpProvider.java +++ b/src/main/java/com/microsoft/graph/http/CoreHttpProvider.java @@ -362,18 +362,20 @@ private Result sendRequestInternal(final IHttpRe this.connectionConfig = new DefaultConnectionConfig(); } if(this.corehttpClient == null) { + final ICoreAuthenticationProvider authProvider = new ICoreAuthenticationProvider() { + @Override + public Request authenticateRequest(Request request) { + return request; + } + }; this.corehttpClient = HttpClients - .createDefault(new ICoreAuthenticationProvider() { - @Override - public Request authenticateRequest(Request request) { - return request; - } - }).newBuilder() - .connectTimeout(connectionConfig.getConnectTimeout(), TimeUnit.MILLISECONDS) - .readTimeout(connectionConfig.getReadTimeout(), TimeUnit.MILLISECONDS) - .followRedirects(false) - .protocols(Arrays.asList(Protocol.HTTP_1_1)) //https://stackoverflow.com/questions/62031298/sockettimeout-on-java-11-but-not-on-java-8 - .build(); + .createDefault(authProvider) + .newBuilder() + .connectTimeout(connectionConfig.getConnectTimeout(), TimeUnit.MILLISECONDS) + .readTimeout(connectionConfig.getReadTimeout(), TimeUnit.MILLISECONDS) + .followRedirects(false) + .protocols(Arrays.asList(Protocol.HTTP_1_1)) //https://stackoverflow.com/questions/62031298/sockettimeout-on-java-11-but-not-on-java-8 + .build(); } if (authenticationProvider != null) { authenticationProvider.authenticateRequest(request);