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);
|
entityEnclosingRequest.setEntity(requestEntity);
|
||||||
}
|
}
|
||||||
|
|
||||||
final HttpResponseFutureCallback callback = new HttpResponseFutureCallback();
|
final HttpResponseFutureCallback callback = new HttpResponseFutureCallback(this.httpRequest);
|
||||||
final Future<HttpResponse> futureResponse =
|
final Future<HttpResponse> futureResponse =
|
||||||
this.httpClient.execute(this.httpRequest, this.httpContext, callback);
|
this.httpClient.execute(this.httpRequest, this.httpContext, callback);
|
||||||
return new ClientHttpResponseFuture(futureResponse, callback);
|
return new ClientHttpResponseFuture(futureResponse, callback);
|
||||||
@@ -104,6 +104,14 @@ final class HttpComponentsAsyncClientHttpRequest extends AbstractBufferingAsyncC
|
|||||||
private final ListenableFutureCallbackRegistry<ClientHttpResponse> callbacks =
|
private final ListenableFutureCallbackRegistry<ClientHttpResponse> callbacks =
|
||||||
new ListenableFutureCallbackRegistry<>();
|
new ListenableFutureCallbackRegistry<>();
|
||||||
|
|
||||||
|
private final HttpUriRequest httpRequest;
|
||||||
|
|
||||||
|
|
||||||
|
public HttpResponseFutureCallback(HttpUriRequest httpRequest) {
|
||||||
|
this.httpRequest = httpRequest;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public void addCallback(ListenableFutureCallback<? super ClientHttpResponse> callback) {
|
public void addCallback(ListenableFutureCallback<? super ClientHttpResponse> callback) {
|
||||||
this.callbacks.addCallback(callback);
|
this.callbacks.addCallback(callback);
|
||||||
}
|
}
|
||||||
@@ -128,6 +136,7 @@ final class HttpComponentsAsyncClientHttpRequest extends AbstractBufferingAsyncC
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void cancelled() {
|
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");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with 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