Skip to content

Commit 7aa9865

Browse files
committed
- adds support for cancelling request
1 parent 0adcd40 commit 7aa9865

File tree

3 files changed

+62
-3
lines changed

3 files changed

+62
-3
lines changed

src/main/java/com/microsoft/graph/http/CoreHttpCallbackFutureWrapper.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package com.microsoft.graph.http;
22

33
import java.io.IOException;
4-
4+
import java.util.Objects;
5+
import java.util.concurrent.CancellationException;
56
import java.util.concurrent.CompletableFuture;
67

8+
import javax.annotation.Nonnull;
9+
710
import okhttp3.Call;
811
import okhttp3.Callback;
912
import okhttp3.Response;
@@ -12,6 +15,14 @@
1215
* Wraps the HTTP execution in a future, not public by intention
1316
*/
1417
class CoreHttpCallbackFutureWrapper implements Callback {
18+
public CoreHttpCallbackFutureWrapper(@Nonnull final Call call) {
19+
Objects.requireNonNull(call);
20+
future.whenComplete((r, ex) -> {
21+
if (ex != null && (ex instanceof InterruptedException || ex instanceof CancellationException)) {
22+
call.cancel();
23+
}
24+
});
25+
}
1526
final CompletableFuture<Response> future = new CompletableFuture<>();
1627
@Override
1728
public void onFailure(Call arg0, IOException arg1) {

src/main/java/com/microsoft/graph/http/CoreHttpProvider.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
import javax.annotation.Nonnull;
5252
import javax.annotation.Nullable;
5353

54+
import okhttp3.Call;
5455
import okhttp3.MediaType;
5556
import okhttp3.OkHttpClient;
5657
import okhttp3.Request;
@@ -375,8 +376,9 @@ private <Result, Body, DeserializeType> java.util.concurrent.CompletableFuture<R
375376
@Nullable final IStatefulResponseHandler<Result, DeserializeType> handler)
376377
throws ClientException {
377378
final Request coreHttpRequest = getHttpRequest(request, resultClass, serializable);
378-
final CoreHttpCallbackFutureWrapper wrapper = new CoreHttpCallbackFutureWrapper();
379-
corehttpClient.newCall(coreHttpRequest).enqueue(wrapper);
379+
final Call call = corehttpClient.newCall(coreHttpRequest);
380+
final CoreHttpCallbackFutureWrapper wrapper = new CoreHttpCallbackFutureWrapper(call);
381+
call.enqueue(wrapper);
380382
return wrapper.future.thenApply(r -> processResponse(r, request, resultClass, serializable, handler));
381383
}
382384
/**
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package com.microsoft.graph.http;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertThrows;
5+
import static org.junit.jupiter.api.Assertions.assertTrue;
6+
import static org.mockito.Mockito.doAnswer;
7+
import static org.mockito.Mockito.mock;
8+
9+
import java.io.IOException;
10+
import java.util.concurrent.ExecutionException;
11+
12+
import org.junit.jupiter.api.Test;
13+
14+
import okhttp3.Call;
15+
import okhttp3.Response;
16+
17+
public class CoreHttpCallbackFutureWrapperTests {
18+
19+
@Test
20+
public void ThrowsIfCallIsNull() {
21+
assertThrows(NullPointerException.class, () -> new CoreHttpCallbackFutureWrapper(null));
22+
}
23+
boolean isCanceled = false;
24+
25+
@Test
26+
public void CancelsCall() {
27+
var call = mock(Call.class);
28+
doAnswer(i -> {
29+
isCanceled = true;
30+
return null;
31+
}).when(call).cancel();
32+
var wrapper = new CoreHttpCallbackFutureWrapper(call);
33+
wrapper.future.cancel(true);
34+
assertTrue(isCanceled);
35+
}
36+
37+
@Test
38+
public void ReturnsResponseWhenCompleted() throws IOException, InterruptedException, ExecutionException {
39+
var call = mock(Call.class);
40+
var response = mock(Response.class);
41+
var wrapper = new CoreHttpCallbackFutureWrapper(call);
42+
wrapper.onResponse(call, response);
43+
assertEquals(response, wrapper.future.get());
44+
}
45+
46+
}

0 commit comments

Comments
 (0)