Make HttpComponentsAsyncClientHttpRequest abortable
This commit aborts the HttpComponentsAsyncClientHttpRequest whenever the returned Future is canceled. Issue: SPR-14845
This commit is contained in:
@@ -92,7 +92,7 @@ final class HttpComponentsAsyncClientHttpRequest extends AbstractBufferingAsyncC
|
||||
entityEnclosingRequest.setEntity(requestEntity);
|
||||
}
|
||||
|
||||
final HttpResponseFutureCallback callback = new HttpResponseFutureCallback();
|
||||
final HttpResponseFutureCallback callback = new HttpResponseFutureCallback(this.httpRequest);
|
||||
final Future<HttpResponse> futureResponse =
|
||||
this.httpClient.execute(this.httpRequest, this.httpContext, callback);
|
||||
return new ClientHttpResponseFuture(futureResponse, callback);
|
||||
@@ -104,6 +104,14 @@ final class HttpComponentsAsyncClientHttpRequest extends AbstractBufferingAsyncC
|
||||
private final ListenableFutureCallbackRegistry<ClientHttpResponse> callbacks =
|
||||
new ListenableFutureCallbackRegistry<>();
|
||||
|
||||
private final HttpUriRequest httpRequest;
|
||||
|
||||
|
||||
public HttpResponseFutureCallback(HttpUriRequest httpRequest) {
|
||||
this.httpRequest = httpRequest;
|
||||
}
|
||||
|
||||
|
||||
public void addCallback(ListenableFutureCallback<? super ClientHttpResponse> callback) {
|
||||
this.callbacks.addCallback(callback);
|
||||
}
|
||||
@@ -128,6 +136,7 @@ final class HttpComponentsAsyncClientHttpRequest extends AbstractBufferingAsyncC
|
||||
|
||||
@Override
|
||||
public void cancelled() {
|
||||
this.httpRequest.abort();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2015 the original author or authors.
|
||||
* Copyright 2002-2016 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -222,4 +222,14 @@ public abstract class AbstractAsyncHttpRequestFactoryTestCase extends AbstractJe
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void cancel() throws Exception {
|
||||
URI uri = new URI(baseUrl + "/status/notfound");
|
||||
AsyncClientHttpRequest request = this.factory.createAsyncRequest(uri, HttpMethod.GET);
|
||||
Future<ClientHttpResponse> futureResponse = request.executeAsync();
|
||||
futureResponse.cancel(true);
|
||||
assertTrue(futureResponse.isCancelled());
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user