Fixed handling of request configuration by async clients
This commit is contained in:
parent
7c0a1127be
commit
1577356f37
|
@ -42,8 +42,6 @@ import org.apache.hc.client5.http.CircularRedirectException;
|
|||
import org.apache.hc.client5.http.RedirectException;
|
||||
import org.apache.hc.client5.http.async.methods.SimpleHttpRequest;
|
||||
import org.apache.hc.client5.http.async.methods.SimpleHttpResponse;
|
||||
import org.apache.hc.client5.http.async.methods.SimpleRequestProducer;
|
||||
import org.apache.hc.client5.http.async.methods.SimpleResponseConsumer;
|
||||
import org.apache.hc.client5.http.config.RequestConfig;
|
||||
import org.apache.hc.client5.http.cookie.BasicCookieStore;
|
||||
import org.apache.hc.client5.http.cookie.CookieStore;
|
||||
|
@ -455,9 +453,9 @@ public class TestAsyncRedirects extends IntegrationTestBase {
|
|||
.setCircularRedirectsAllowed(true)
|
||||
.setMaxRedirects(5).build();
|
||||
try {
|
||||
final Future<SimpleHttpResponse> future = httpclient.execute(
|
||||
SimpleRequestProducer.create(SimpleHttpRequest.get(target, "/circular-oldlocation/"), config),
|
||||
SimpleResponseConsumer.create(), null);
|
||||
final SimpleHttpRequest request = SimpleHttpRequest.get(target, "/circular-oldlocation/");
|
||||
request.setConfig(config);
|
||||
final Future<SimpleHttpResponse> future = httpclient.execute(request, null);
|
||||
future.get();
|
||||
} catch (final ExecutionException e) {
|
||||
Assert.assertTrue(e.getCause() instanceof RedirectException);
|
||||
|
@ -481,9 +479,9 @@ public class TestAsyncRedirects extends IntegrationTestBase {
|
|||
.setCircularRedirectsAllowed(false)
|
||||
.build();
|
||||
try {
|
||||
final Future<SimpleHttpResponse> future = httpclient.execute(
|
||||
SimpleRequestProducer.create(SimpleHttpRequest.get(target, "/circular-oldlocation/"), config),
|
||||
SimpleResponseConsumer.create(), null);
|
||||
final SimpleHttpRequest request = SimpleHttpRequest.get(target, "/circular-oldlocation/");
|
||||
request.setConfig(config);
|
||||
final Future<SimpleHttpResponse> future = httpclient.execute(request, null);
|
||||
future.get();
|
||||
} catch (final ExecutionException e) {
|
||||
Assert.assertTrue(e.getCause() instanceof CircularRedirectException);
|
||||
|
|
|
@ -35,8 +35,6 @@ import java.util.concurrent.atomic.AtomicLong;
|
|||
|
||||
import org.apache.hc.client5.http.async.methods.SimpleHttpRequest;
|
||||
import org.apache.hc.client5.http.async.methods.SimpleHttpResponse;
|
||||
import org.apache.hc.client5.http.async.methods.SimpleRequestProducer;
|
||||
import org.apache.hc.client5.http.async.methods.SimpleResponseConsumer;
|
||||
import org.apache.hc.client5.http.auth.AuthChallenge;
|
||||
import org.apache.hc.client5.http.auth.AuthScheme;
|
||||
import org.apache.hc.client5.http.auth.AuthSchemeProvider;
|
||||
|
@ -45,7 +43,6 @@ import org.apache.hc.client5.http.auth.ChallengeType;
|
|||
import org.apache.hc.client5.http.auth.Credentials;
|
||||
import org.apache.hc.client5.http.auth.CredentialsStore;
|
||||
import org.apache.hc.client5.http.auth.UsernamePasswordCredentials;
|
||||
import org.apache.hc.client5.http.classic.methods.HttpGet;
|
||||
import org.apache.hc.client5.http.config.RequestConfig;
|
||||
import org.apache.hc.client5.http.impl.DefaultAuthenticationStrategy;
|
||||
import org.apache.hc.client5.http.impl.auth.BasicCredentialsProvider;
|
||||
|
@ -547,12 +544,9 @@ public class TestClientAuthentication extends IntegrationTestBase {
|
|||
context.setCredentialsProvider(credsProvider);
|
||||
|
||||
for (int i = 0; i < 10; i++) {
|
||||
final HttpGet httpget = new HttpGet("/");
|
||||
httpget.setConfig(config);
|
||||
final Future<SimpleHttpResponse> future = httpclient.execute(
|
||||
SimpleRequestProducer.create(SimpleHttpRequest.get(target, "/"), config),
|
||||
SimpleResponseConsumer.create(),
|
||||
context, null);
|
||||
final SimpleHttpRequest request = SimpleHttpRequest.get(target, "/");
|
||||
request.setConfig(config);
|
||||
final Future<SimpleHttpResponse> future = httpclient.execute(request, context, null);
|
||||
final SimpleHttpResponse response = future.get();
|
||||
Assert.assertNotNull(response);
|
||||
Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
|
||||
|
|
|
@ -66,7 +66,7 @@ public class AsyncClientConnectionEviction {
|
|||
|
||||
final SimpleHttpRequest request = SimpleHttpRequest.get(target, "/");
|
||||
final Future<SimpleHttpResponse> future1 = client.execute(
|
||||
SimpleRequestProducer.create(request, null),
|
||||
SimpleRequestProducer.create(request),
|
||||
SimpleResponseConsumer.create(),
|
||||
new FutureCallback<SimpleHttpResponse>() {
|
||||
|
||||
|
@ -95,7 +95,7 @@ public class AsyncClientConnectionEviction {
|
|||
// Previous connection should get evicted from the pool by now
|
||||
|
||||
final Future<SimpleHttpResponse> future2 = client.execute(
|
||||
SimpleRequestProducer.create(request, null),
|
||||
SimpleRequestProducer.create(request),
|
||||
SimpleResponseConsumer.create(),
|
||||
new FutureCallback<SimpleHttpResponse>() {
|
||||
|
||||
|
|
|
@ -98,7 +98,7 @@ public class AsyncClientCustomSSL {
|
|||
|
||||
final SimpleHttpRequest request = SimpleHttpRequest.get(target, requestUri);
|
||||
final Future<SimpleHttpResponse> future = client.execute(
|
||||
SimpleRequestProducer.create(request, null),
|
||||
SimpleRequestProducer.create(request),
|
||||
SimpleResponseConsumer.create(),
|
||||
clientContext,
|
||||
new FutureCallback<SimpleHttpResponse>() {
|
||||
|
|
|
@ -69,7 +69,7 @@ public class AsyncClientHttp1Pipelining {
|
|||
for (final String requestUri: requestUris) {
|
||||
final SimpleHttpRequest request = SimpleHttpRequest.get(target, requestUri);
|
||||
endpoint.execute(
|
||||
SimpleRequestProducer.create(request, null),
|
||||
SimpleRequestProducer.create(request),
|
||||
SimpleResponseConsumer.create(),
|
||||
new FutureCallback<SimpleHttpResponse>() {
|
||||
|
||||
|
|
|
@ -70,7 +70,7 @@ public class AsyncClientHttp2Multiplexing {
|
|||
for (final String requestUri: requestUris) {
|
||||
final SimpleHttpRequest request = SimpleHttpRequest.get(target, requestUri);
|
||||
endpoint.execute(
|
||||
SimpleRequestProducer.create(request, null),
|
||||
SimpleRequestProducer.create(request),
|
||||
SimpleResponseConsumer.create(),
|
||||
new FutureCallback<SimpleHttpResponse>() {
|
||||
|
||||
|
|
|
@ -100,7 +100,7 @@ public class AsyncClientTlsAlpn {
|
|||
|
||||
final SimpleHttpRequest request = SimpleHttpRequest.get(target, requestUri);
|
||||
final Future<SimpleHttpResponse> future = client.execute(
|
||||
SimpleRequestProducer.create(request, null),
|
||||
SimpleRequestProducer.create(request),
|
||||
SimpleResponseConsumer.create(),
|
||||
clientContext,
|
||||
new FutureCallback<SimpleHttpResponse>() {
|
||||
|
|
|
@ -43,11 +43,11 @@ import org.apache.hc.core5.http.HttpHost;
|
|||
import org.apache.hc.core5.http.NameValuePair;
|
||||
import org.apache.hc.core5.http.ProtocolVersion;
|
||||
import org.apache.hc.core5.http.message.BasicHeader;
|
||||
import org.apache.hc.core5.http.message.BasicHttpRequest;
|
||||
import org.apache.hc.core5.http.message.BasicNameValuePair;
|
||||
import org.apache.hc.core5.http.message.HeaderGroup;
|
||||
import org.apache.hc.core5.http.nio.AsyncEntityProducer;
|
||||
import org.apache.hc.core5.http.nio.AsyncRequestProducer;
|
||||
import org.apache.hc.core5.http.nio.BasicRequestProducer;
|
||||
import org.apache.hc.core5.http.nio.entity.BasicAsyncEntityProducer;
|
||||
import org.apache.hc.core5.http.nio.entity.StringAsyncEntityProducer;
|
||||
import org.apache.hc.core5.net.URIBuilder;
|
||||
|
@ -429,16 +429,17 @@ public class AsyncRequestBuilder {
|
|||
}
|
||||
}
|
||||
}
|
||||
final BasicHttpRequest request = host != null ?
|
||||
new BasicHttpRequest(method, host, !TextUtils.isBlank(path) ? path : "/") :
|
||||
new BasicHttpRequest(method, uri != null ? uri : URI.create("/"));
|
||||
final ConfigurableHttpRequest request = host != null ?
|
||||
new ConfigurableHttpRequest(method, host, !TextUtils.isBlank(path) ? path : "/") :
|
||||
new ConfigurableHttpRequest(method, uri != null ? uri : URI.create("/"));
|
||||
if (this.headergroup != null) {
|
||||
request.setHeaders(this.headergroup.getAllHeaders());
|
||||
}
|
||||
if (version != null) {
|
||||
request.setVersion(version);
|
||||
}
|
||||
return new DefaultAsyncRequestProducer(request, entityProducerCopy, config);
|
||||
request.setConfig(config);
|
||||
return new BasicRequestProducer(request, entityProducerCopy);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -24,30 +24,40 @@
|
|||
* <http://www.apache.org/>.
|
||||
*
|
||||
*/
|
||||
|
||||
package org.apache.hc.client5.http.async.methods;
|
||||
|
||||
import java.net.URI;
|
||||
|
||||
import org.apache.hc.client5.http.config.Configurable;
|
||||
import org.apache.hc.client5.http.config.RequestConfig;
|
||||
import org.apache.hc.core5.http.HttpRequest;
|
||||
import org.apache.hc.core5.http.nio.AsyncEntityProducer;
|
||||
import org.apache.hc.core5.http.nio.BasicRequestProducer;
|
||||
import org.apache.hc.core5.http.HttpHost;
|
||||
import org.apache.hc.core5.http.message.BasicHttpRequest;
|
||||
|
||||
public class DefaultAsyncRequestProducer extends BasicRequestProducer implements Configurable {
|
||||
public class ConfigurableHttpRequest extends BasicHttpRequest implements Configurable {
|
||||
|
||||
private final RequestConfig config;
|
||||
private RequestConfig requestConfig;
|
||||
|
||||
public DefaultAsyncRequestProducer(final HttpRequest request, final AsyncEntityProducer entityProducer, final RequestConfig config) {
|
||||
super(request, entityProducer);
|
||||
this.config = config;
|
||||
public ConfigurableHttpRequest(final String method, final String path) {
|
||||
super(method, path);
|
||||
}
|
||||
|
||||
public DefaultAsyncRequestProducer(final HttpRequest request, final AsyncEntityProducer entityProducer) {
|
||||
this(request, entityProducer, null);
|
||||
public ConfigurableHttpRequest(final String method, final HttpHost host, final String path) {
|
||||
super(method, host, path);
|
||||
}
|
||||
|
||||
public ConfigurableHttpRequest(final String method, final URI requestUri) {
|
||||
super(method, requestUri);
|
||||
}
|
||||
|
||||
@Override
|
||||
public RequestConfig getConfig() {
|
||||
return config;
|
||||
return requestConfig;
|
||||
}
|
||||
|
||||
public void setConfig(final RequestConfig requestConfig) {
|
||||
this.requestConfig = requestConfig;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -31,15 +31,16 @@ import java.net.URI;
|
|||
import java.util.Iterator;
|
||||
|
||||
import org.apache.hc.client5.http.StandardMethods;
|
||||
import org.apache.hc.client5.http.config.RequestConfig;
|
||||
import org.apache.hc.core5.http.ContentType;
|
||||
import org.apache.hc.core5.http.Header;
|
||||
import org.apache.hc.core5.http.HttpHost;
|
||||
import org.apache.hc.core5.http.HttpRequest;
|
||||
import org.apache.hc.core5.http.message.BasicHttpRequest;
|
||||
import org.apache.hc.core5.util.Args;
|
||||
|
||||
public final class SimpleHttpRequest extends BasicHttpRequest {
|
||||
public final class SimpleHttpRequest extends ConfigurableHttpRequest {
|
||||
|
||||
private RequestConfig requestConfig;
|
||||
private SimpleBody body;
|
||||
|
||||
public static SimpleHttpRequest get(final URI requestUri) {
|
||||
|
|
|
@ -26,20 +26,19 @@
|
|||
*/
|
||||
package org.apache.hc.client5.http.async.methods;
|
||||
|
||||
import org.apache.hc.client5.http.config.RequestConfig;
|
||||
import org.apache.hc.core5.http.HttpRequest;
|
||||
import org.apache.hc.core5.http.nio.AsyncEntityProducer;
|
||||
import org.apache.hc.core5.http.nio.BasicRequestProducer;
|
||||
import org.apache.hc.core5.http.nio.entity.BasicAsyncEntityProducer;
|
||||
import org.apache.hc.core5.http.nio.entity.StringAsyncEntityProducer;
|
||||
import org.apache.hc.core5.util.Args;
|
||||
|
||||
public final class SimpleRequestProducer extends DefaultAsyncRequestProducer {
|
||||
public final class SimpleRequestProducer extends BasicRequestProducer {
|
||||
|
||||
SimpleRequestProducer(final HttpRequest request, final AsyncEntityProducer entityProducer, final RequestConfig requestConfig) {
|
||||
super(request, entityProducer, requestConfig);
|
||||
SimpleRequestProducer(final SimpleHttpRequest request, final AsyncEntityProducer entityProducer) {
|
||||
super(request, entityProducer);
|
||||
}
|
||||
|
||||
public static SimpleRequestProducer create(final SimpleHttpRequest request, final RequestConfig requestConfig) {
|
||||
public static SimpleRequestProducer create(final SimpleHttpRequest request) {
|
||||
Args.notNull(request, "Request");
|
||||
final SimpleBody body = request.getBody();
|
||||
final AsyncEntityProducer entityProducer;
|
||||
|
@ -52,7 +51,7 @@ public final class SimpleRequestProducer extends DefaultAsyncRequestProducer {
|
|||
} else {
|
||||
entityProducer = null;
|
||||
}
|
||||
return new SimpleRequestProducer(request, entityProducer, requestConfig);
|
||||
return new SimpleRequestProducer(request, entityProducer);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -88,7 +88,7 @@ public abstract class CloseableHttpAsyncClient implements HttpAsyncClient, Close
|
|||
final FutureCallback<SimpleHttpResponse> callback) {
|
||||
Args.notNull(request, "Request");
|
||||
final BasicFuture<SimpleHttpResponse> future = new BasicFuture<>(callback);
|
||||
execute(SimpleRequestProducer.create(request, null), SimpleResponseConsumer.create(), context, new FutureCallback<SimpleHttpResponse>() {
|
||||
execute(SimpleRequestProducer.create(request), SimpleResponseConsumer.create(), context, new FutureCallback<SimpleHttpResponse>() {
|
||||
|
||||
@Override
|
||||
public void completed(final SimpleHttpResponse response) {
|
||||
|
|
|
@ -153,15 +153,6 @@ class InternalHttpAsyncClient extends AbstractHttpAsyncClientBase {
|
|||
final BasicFuture<T> future = new BasicFuture<>(callback);
|
||||
try {
|
||||
final HttpClientContext clientContext = HttpClientContext.adapt(context);
|
||||
|
||||
RequestConfig requestConfig = null;
|
||||
if (requestProducer instanceof Configurable) {
|
||||
requestConfig = ((Configurable) requestProducer).getConfig();
|
||||
}
|
||||
if (requestConfig != null) {
|
||||
clientContext.setRequestConfig(requestConfig);
|
||||
}
|
||||
|
||||
requestProducer.sendRequest(new RequestChannel() {
|
||||
|
||||
@Override
|
||||
|
@ -169,6 +160,13 @@ class InternalHttpAsyncClient extends AbstractHttpAsyncClientBase {
|
|||
final HttpRequest request,
|
||||
final EntityDetails entityDetails) throws HttpException, IOException {
|
||||
|
||||
RequestConfig requestConfig = null;
|
||||
if (request instanceof Configurable) {
|
||||
requestConfig = ((Configurable) request).getConfig();
|
||||
}
|
||||
if (requestConfig != null) {
|
||||
clientContext.setRequestConfig(requestConfig);
|
||||
}
|
||||
final HttpHost target = routePlanner.determineTargetHost(request, clientContext);
|
||||
final HttpRoute route = routePlanner.determineRoute(target, clientContext);
|
||||
final String exchangeId = String.format("ex-%08X", ExecSupport.getNextExecNumber());
|
||||
|
|
|
@ -202,25 +202,25 @@ public class MinimalHttpAsyncClient extends AbstractHttpAsyncClientBase {
|
|||
final HttpContext context,
|
||||
final FutureCallback<T> callback) {
|
||||
ensureRunning();
|
||||
final HttpClientContext clientContext = HttpClientContext.adapt(context);
|
||||
RequestConfig requestConfig = null;
|
||||
if (requestProducer instanceof Configurable) {
|
||||
requestConfig = ((Configurable) requestProducer).getConfig();
|
||||
}
|
||||
if (requestConfig != null) {
|
||||
clientContext.setRequestConfig(requestConfig);
|
||||
} else {
|
||||
requestConfig = clientContext.getRequestConfig();
|
||||
}
|
||||
final ComplexFuture<T> resultFuture = new ComplexFuture<>(callback);
|
||||
final HttpClientContext clientContext = HttpClientContext.adapt(context);
|
||||
try {
|
||||
final Timeout connectTimeout = requestConfig.getConnectTimeout();
|
||||
requestProducer.sendRequest(new RequestChannel() {
|
||||
|
||||
@Override
|
||||
public void sendRequest(
|
||||
final HttpRequest request,
|
||||
final EntityDetails entityDetails) throws HttpException, IOException {
|
||||
RequestConfig requestConfig = null;
|
||||
if (request instanceof Configurable) {
|
||||
requestConfig = ((Configurable) request).getConfig();
|
||||
}
|
||||
if (requestConfig != null) {
|
||||
clientContext.setRequestConfig(requestConfig);
|
||||
} else {
|
||||
requestConfig = clientContext.getRequestConfig();
|
||||
}
|
||||
final Timeout connectTimeout = requestConfig.getConnectTimeout();
|
||||
final HttpHost target = new HttpHost(request.getAuthority(), request.getScheme());
|
||||
final Future<AsyncConnectionEndpoint> leaseFuture = leaseEndpoint(target, connectTimeout, clientContext,
|
||||
new FutureCallback<AsyncConnectionEndpoint>() {
|
||||
|
|
Loading…
Reference in New Issue