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.RedirectException;
import org.apache.hc.client5.http.async.methods.SimpleHttpRequest; 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.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.config.RequestConfig;
import org.apache.hc.client5.http.cookie.BasicCookieStore; import org.apache.hc.client5.http.cookie.BasicCookieStore;
import org.apache.hc.client5.http.cookie.CookieStore; import org.apache.hc.client5.http.cookie.CookieStore;
@ -455,9 +453,9 @@ public class TestAsyncRedirects extends IntegrationTestBase {
.setCircularRedirectsAllowed(true) .setCircularRedirectsAllowed(true)
.setMaxRedirects(5).build(); .setMaxRedirects(5).build();
try { try {
final Future<SimpleHttpResponse> future = httpclient.execute( final SimpleHttpRequest request = SimpleHttpRequest.get(target, "/circular-oldlocation/");
SimpleRequestProducer.create(SimpleHttpRequest.get(target, "/circular-oldlocation/"), config), request.setConfig(config);
SimpleResponseConsumer.create(), null); final Future<SimpleHttpResponse> future = httpclient.execute(request, null);
future.get(); future.get();
} catch (final ExecutionException e) { } catch (final ExecutionException e) {
Assert.assertTrue(e.getCause() instanceof RedirectException); Assert.assertTrue(e.getCause() instanceof RedirectException);
@ -481,9 +479,9 @@ public class TestAsyncRedirects extends IntegrationTestBase {
.setCircularRedirectsAllowed(false) .setCircularRedirectsAllowed(false)
.build(); .build();
try { try {
final Future<SimpleHttpResponse> future = httpclient.execute( final SimpleHttpRequest request = SimpleHttpRequest.get(target, "/circular-oldlocation/");
SimpleRequestProducer.create(SimpleHttpRequest.get(target, "/circular-oldlocation/"), config), request.setConfig(config);
SimpleResponseConsumer.create(), null); final Future<SimpleHttpResponse> future = httpclient.execute(request, null);
future.get(); future.get();
} catch (final ExecutionException e) { } catch (final ExecutionException e) {
Assert.assertTrue(e.getCause() instanceof CircularRedirectException); 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.SimpleHttpRequest;
import org.apache.hc.client5.http.async.methods.SimpleHttpResponse; 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.AuthChallenge;
import org.apache.hc.client5.http.auth.AuthScheme; import org.apache.hc.client5.http.auth.AuthScheme;
import org.apache.hc.client5.http.auth.AuthSchemeProvider; 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.Credentials;
import org.apache.hc.client5.http.auth.CredentialsStore; import org.apache.hc.client5.http.auth.CredentialsStore;
import org.apache.hc.client5.http.auth.UsernamePasswordCredentials; 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.config.RequestConfig;
import org.apache.hc.client5.http.impl.DefaultAuthenticationStrategy; import org.apache.hc.client5.http.impl.DefaultAuthenticationStrategy;
import org.apache.hc.client5.http.impl.auth.BasicCredentialsProvider; import org.apache.hc.client5.http.impl.auth.BasicCredentialsProvider;
@ -547,12 +544,9 @@ public class TestClientAuthentication extends IntegrationTestBase {
context.setCredentialsProvider(credsProvider); context.setCredentialsProvider(credsProvider);
for (int i = 0; i < 10; i++) { for (int i = 0; i < 10; i++) {
final HttpGet httpget = new HttpGet("/"); final SimpleHttpRequest request = SimpleHttpRequest.get(target, "/");
httpget.setConfig(config); request.setConfig(config);
final Future<SimpleHttpResponse> future = httpclient.execute( final Future<SimpleHttpResponse> future = httpclient.execute(request, context, null);
SimpleRequestProducer.create(SimpleHttpRequest.get(target, "/"), config),
SimpleResponseConsumer.create(),
context, null);
final SimpleHttpResponse response = future.get(); final SimpleHttpResponse response = future.get();
Assert.assertNotNull(response); Assert.assertNotNull(response);
Assert.assertEquals(HttpStatus.SC_OK, response.getCode()); Assert.assertEquals(HttpStatus.SC_OK, response.getCode());

View File

@ -66,7 +66,7 @@ public class AsyncClientConnectionEviction {
final SimpleHttpRequest request = SimpleHttpRequest.get(target, "/"); final SimpleHttpRequest request = SimpleHttpRequest.get(target, "/");
final Future<SimpleHttpResponse> future1 = client.execute( final Future<SimpleHttpResponse> future1 = client.execute(
SimpleRequestProducer.create(request, null), SimpleRequestProducer.create(request),
SimpleResponseConsumer.create(), SimpleResponseConsumer.create(),
new FutureCallback<SimpleHttpResponse>() { new FutureCallback<SimpleHttpResponse>() {
@ -95,7 +95,7 @@ public class AsyncClientConnectionEviction {
// Previous connection should get evicted from the pool by now // Previous connection should get evicted from the pool by now
final Future<SimpleHttpResponse> future2 = client.execute( final Future<SimpleHttpResponse> future2 = client.execute(
SimpleRequestProducer.create(request, null), SimpleRequestProducer.create(request),
SimpleResponseConsumer.create(), SimpleResponseConsumer.create(),
new FutureCallback<SimpleHttpResponse>() { new FutureCallback<SimpleHttpResponse>() {

View File

@ -98,7 +98,7 @@ public class AsyncClientCustomSSL {
final SimpleHttpRequest request = SimpleHttpRequest.get(target, requestUri); final SimpleHttpRequest request = SimpleHttpRequest.get(target, requestUri);
final Future<SimpleHttpResponse> future = client.execute( final Future<SimpleHttpResponse> future = client.execute(
SimpleRequestProducer.create(request, null), SimpleRequestProducer.create(request),
SimpleResponseConsumer.create(), SimpleResponseConsumer.create(),
clientContext, clientContext,
new FutureCallback<SimpleHttpResponse>() { new FutureCallback<SimpleHttpResponse>() {

View File

@ -69,7 +69,7 @@ public class AsyncClientHttp1Pipelining {
for (final String requestUri: requestUris) { for (final String requestUri: requestUris) {
final SimpleHttpRequest request = SimpleHttpRequest.get(target, requestUri); final SimpleHttpRequest request = SimpleHttpRequest.get(target, requestUri);
endpoint.execute( endpoint.execute(
SimpleRequestProducer.create(request, null), SimpleRequestProducer.create(request),
SimpleResponseConsumer.create(), SimpleResponseConsumer.create(),
new FutureCallback<SimpleHttpResponse>() { new FutureCallback<SimpleHttpResponse>() {

View File

@ -70,7 +70,7 @@ public class AsyncClientHttp2Multiplexing {
for (final String requestUri: requestUris) { for (final String requestUri: requestUris) {
final SimpleHttpRequest request = SimpleHttpRequest.get(target, requestUri); final SimpleHttpRequest request = SimpleHttpRequest.get(target, requestUri);
endpoint.execute( endpoint.execute(
SimpleRequestProducer.create(request, null), SimpleRequestProducer.create(request),
SimpleResponseConsumer.create(), SimpleResponseConsumer.create(),
new FutureCallback<SimpleHttpResponse>() { new FutureCallback<SimpleHttpResponse>() {

View File

@ -100,7 +100,7 @@ public class AsyncClientTlsAlpn {
final SimpleHttpRequest request = SimpleHttpRequest.get(target, requestUri); final SimpleHttpRequest request = SimpleHttpRequest.get(target, requestUri);
final Future<SimpleHttpResponse> future = client.execute( final Future<SimpleHttpResponse> future = client.execute(
SimpleRequestProducer.create(request, null), SimpleRequestProducer.create(request),
SimpleResponseConsumer.create(), SimpleResponseConsumer.create(),
clientContext, clientContext,
new FutureCallback<SimpleHttpResponse>() { 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.NameValuePair;
import org.apache.hc.core5.http.ProtocolVersion; import org.apache.hc.core5.http.ProtocolVersion;
import org.apache.hc.core5.http.message.BasicHeader; 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.BasicNameValuePair;
import org.apache.hc.core5.http.message.HeaderGroup; import org.apache.hc.core5.http.message.HeaderGroup;
import org.apache.hc.core5.http.nio.AsyncEntityProducer; import org.apache.hc.core5.http.nio.AsyncEntityProducer;
import org.apache.hc.core5.http.nio.AsyncRequestProducer; 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.BasicAsyncEntityProducer;
import org.apache.hc.core5.http.nio.entity.StringAsyncEntityProducer; import org.apache.hc.core5.http.nio.entity.StringAsyncEntityProducer;
import org.apache.hc.core5.net.URIBuilder; import org.apache.hc.core5.net.URIBuilder;
@ -429,16 +429,17 @@ public class AsyncRequestBuilder {
} }
} }
} }
final BasicHttpRequest request = host != null ? final ConfigurableHttpRequest request = host != null ?
new BasicHttpRequest(method, host, !TextUtils.isBlank(path) ? path : "/") : new ConfigurableHttpRequest(method, host, !TextUtils.isBlank(path) ? path : "/") :
new BasicHttpRequest(method, uri != null ? uri : URI.create("/")); new ConfigurableHttpRequest(method, uri != null ? uri : URI.create("/"));
if (this.headergroup != null) { if (this.headergroup != null) {
request.setHeaders(this.headergroup.getAllHeaders()); request.setHeaders(this.headergroup.getAllHeaders());
} }
if (version != null) { if (version != null) {
request.setVersion(version); 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/>. * <http://www.apache.org/>.
* *
*/ */
package org.apache.hc.client5.http.async.methods; 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.Configurable;
import org.apache.hc.client5.http.config.RequestConfig; import org.apache.hc.client5.http.config.RequestConfig;
import org.apache.hc.core5.http.HttpRequest; import org.apache.hc.core5.http.HttpHost;
import org.apache.hc.core5.http.nio.AsyncEntityProducer; import org.apache.hc.core5.http.message.BasicHttpRequest;
import org.apache.hc.core5.http.nio.BasicRequestProducer;
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) { public ConfigurableHttpRequest(final String method, final String path) {
super(request, entityProducer); super(method, path);
this.config = config;
} }
public DefaultAsyncRequestProducer(final HttpRequest request, final AsyncEntityProducer entityProducer) { public ConfigurableHttpRequest(final String method, final HttpHost host, final String path) {
this(request, entityProducer, null); super(method, host, path);
}
public ConfigurableHttpRequest(final String method, final URI requestUri) {
super(method, requestUri);
} }
@Override @Override
public RequestConfig getConfig() { 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 java.util.Iterator;
import org.apache.hc.client5.http.StandardMethods; 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.ContentType;
import org.apache.hc.core5.http.Header; import org.apache.hc.core5.http.Header;
import org.apache.hc.core5.http.HttpHost; import org.apache.hc.core5.http.HttpHost;
import org.apache.hc.core5.http.HttpRequest; import org.apache.hc.core5.http.HttpRequest;
import org.apache.hc.core5.http.message.BasicHttpRequest;
import org.apache.hc.core5.util.Args; 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; private SimpleBody body;
public static SimpleHttpRequest get(final URI requestUri) { public static SimpleHttpRequest get(final URI requestUri) {

View File

@ -26,20 +26,19 @@
*/ */
package org.apache.hc.client5.http.async.methods; 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.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.BasicAsyncEntityProducer;
import org.apache.hc.core5.http.nio.entity.StringAsyncEntityProducer; import org.apache.hc.core5.http.nio.entity.StringAsyncEntityProducer;
import org.apache.hc.core5.util.Args; 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) { SimpleRequestProducer(final SimpleHttpRequest request, final AsyncEntityProducer entityProducer) {
super(request, entityProducer, requestConfig); super(request, entityProducer);
} }
public static SimpleRequestProducer create(final SimpleHttpRequest request, final RequestConfig requestConfig) { public static SimpleRequestProducer create(final SimpleHttpRequest request) {
Args.notNull(request, "Request"); Args.notNull(request, "Request");
final SimpleBody body = request.getBody(); final SimpleBody body = request.getBody();
final AsyncEntityProducer entityProducer; final AsyncEntityProducer entityProducer;
@ -52,7 +51,7 @@ public final class SimpleRequestProducer extends DefaultAsyncRequestProducer {
} else { } else {
entityProducer = null; 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) { final FutureCallback<SimpleHttpResponse> callback) {
Args.notNull(request, "Request"); Args.notNull(request, "Request");
final BasicFuture<SimpleHttpResponse> future = new BasicFuture<>(callback); 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 @Override
public void completed(final SimpleHttpResponse response) { public void completed(final SimpleHttpResponse response) {

View File

@ -153,15 +153,6 @@ class InternalHttpAsyncClient extends AbstractHttpAsyncClientBase {
final BasicFuture<T> future = new BasicFuture<>(callback); final BasicFuture<T> future = new BasicFuture<>(callback);
try { try {
final HttpClientContext clientContext = HttpClientContext.adapt(context); 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() { requestProducer.sendRequest(new RequestChannel() {
@Override @Override
@ -169,6 +160,13 @@ class InternalHttpAsyncClient extends AbstractHttpAsyncClientBase {
final HttpRequest request, final HttpRequest request,
final EntityDetails entityDetails) throws HttpException, IOException { 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 HttpHost target = routePlanner.determineTargetHost(request, clientContext);
final HttpRoute route = routePlanner.determineRoute(target, clientContext); final HttpRoute route = routePlanner.determineRoute(target, clientContext);
final String exchangeId = String.format("ex-%08X", ExecSupport.getNextExecNumber()); final String exchangeId = String.format("ex-%08X", ExecSupport.getNextExecNumber());

View File

@ -202,25 +202,25 @@ public class MinimalHttpAsyncClient extends AbstractHttpAsyncClientBase {
final HttpContext context, final HttpContext context,
final FutureCallback<T> callback) { final FutureCallback<T> callback) {
ensureRunning(); 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 ComplexFuture<T> resultFuture = new ComplexFuture<>(callback);
final HttpClientContext clientContext = HttpClientContext.adapt(context);
try { try {
final Timeout connectTimeout = requestConfig.getConnectTimeout();
requestProducer.sendRequest(new RequestChannel() { requestProducer.sendRequest(new RequestChannel() {
@Override @Override
public void sendRequest( public void sendRequest(
final HttpRequest request, final HttpRequest request,
final EntityDetails entityDetails) throws HttpException, IOException { 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 HttpHost target = new HttpHost(request.getAuthority(), request.getScheme());
final Future<AsyncConnectionEndpoint> leaseFuture = leaseEndpoint(target, connectTimeout, clientContext, final Future<AsyncConnectionEndpoint> leaseFuture = leaseEndpoint(target, connectTimeout, clientContext,
new FutureCallback<AsyncConnectionEndpoint>() { new FutureCallback<AsyncConnectionEndpoint>() {