Skip to content

Commit 91f89dc

Browse files
committed
Support cancelling in flight REST requests
Fixes: #41971
1 parent 7ffdb4b commit 91f89dc

File tree

2 files changed

+25
-2
lines changed

2 files changed

+25
-2
lines changed

independent-projects/resteasy-reactive/client/runtime/src/main/java/org/jboss/resteasy/reactive/client/handlers/ClientSendRequestHandler.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,8 @@ public void handle(RestClientRequestContext requestContext) {
9898
future.subscribe().with(new Consumer<>() {
9999
@Override
100100
public void accept(HttpClientRequest httpClientRequest) {
101+
requestContext.setHttpClientRequest(httpClientRequest);
102+
101103
// adapt headers to HTTP/2 depending on the underlying HTTP connection
102104
ClientSendRequestHandler.this.adaptRequest(httpClientRequest);
103105

independent-projects/resteasy-reactive/client/runtime/src/main/java/org/jboss/resteasy/reactive/client/impl/UniInvoker.java

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package org.jboss.resteasy.reactive.client.impl;
22

3+
import java.util.concurrent.CompletableFuture;
34
import java.util.concurrent.CompletionStage;
5+
import java.util.concurrent.atomic.AtomicReference;
46
import java.util.function.Function;
57
import java.util.function.Supplier;
68

@@ -10,10 +12,11 @@
1012
import jakarta.ws.rs.core.Response;
1113

1214
import io.smallrye.mutiny.Uni;
15+
import io.vertx.core.http.HttpClientRequest;
1316

1417
public class UniInvoker extends AbstractRxInvoker<Uni<?>> {
1518

16-
private InvocationBuilderImpl invocationBuilder;
19+
private final InvocationBuilderImpl invocationBuilder;
1720

1821
public UniInvoker(InvocationBuilderImpl invocationBuilder) {
1922
this.invocationBuilder = invocationBuilder;
@@ -22,10 +25,16 @@ public UniInvoker(InvocationBuilderImpl invocationBuilder) {
2225
@Override
2326
public <R> Uni<R> method(String name, Entity<?> entity, GenericType<R> responseType) {
2427
AsyncInvokerImpl invoker = (AsyncInvokerImpl) invocationBuilder.rx();
28+
AtomicReference<RestClientRequestContext> restClientRequestContextRef = new AtomicReference<>();
2529
return Uni.createFrom().completionStage(new Supplier<CompletionStage<R>>() {
2630
@Override
2731
public CompletionStage<R> get() {
28-
return invoker.method(name, entity, responseType);
32+
RestClientRequestContext restClientRequestContext = invoker.performRequestInternal(name, entity,
33+
responseType == null ? new GenericType<>(String.class) : responseType,
34+
true);
35+
restClientRequestContextRef.set(restClientRequestContext);
36+
CompletableFuture response = restClientRequestContext.getResult();
37+
return invoker.mapResponse(response, responseType == null ? String.class : responseType.getRawType());
2938
}
3039
}).onFailure().transform(new Function<>() {
3140
@Override
@@ -35,6 +44,18 @@ public Throwable apply(Throwable t) {
3544
}
3645
return t;
3746
}
47+
}).onCancellation().invoke(new Runnable() {
48+
@Override
49+
public void run() {
50+
// be very defensive here as things could have been nulled out when the application is being torn down
51+
RestClientRequestContext restClientRequestContext = restClientRequestContextRef.get();
52+
if (restClientRequestContext != null) {
53+
HttpClientRequest httpClientRequest = restClientRequestContext.getHttpClientRequest();
54+
if (httpClientRequest != null) {
55+
httpClientRequest.reset();
56+
}
57+
}
58+
}
3859
});
3960
}
4061

0 commit comments

Comments
 (0)