Fixed handling of request configuration by async clients

This commit is contained in:
Oleg Kalnichevski 2017-11-09 11:26:51 +01:00
parent 7c0a1127be
commit 1577356f37
14 changed files with 70 additions and 69 deletions

View File

@ -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);

View File

@ -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());

View File

@ -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>() {

View File

@ -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>() {

View File

@ -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>() {

View File

@ -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>() {

View File

@ -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>() {

View File

@ -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);
}
}

View File

@ -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;
}
}

View File

@ -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) {

View File

@ -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);
}
}

View File

@ -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) {

View File

@ -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());

View File

@ -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>() {