You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by ol...@apache.org on 2024/01/17 12:18:14 UTC
(httpcomponents-client) branch master updated: Fixed a design mistake of ConnectionEndpoint having a direct dependency on HttpRequestExecutor class
This is an automated email from the ASF dual-hosted git repository.
olegk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/httpcomponents-client.git
The following commit(s) were added to refs/heads/master by this push:
new a1fa1739b Fixed a design mistake of ConnectionEndpoint having a direct dependency on HttpRequestExecutor class
a1fa1739b is described below
commit a1fa1739bf0898fa8eaa39df4a20ee82ba19b452
Author: Oleg Kalnichevski <ol...@apache.org>
AuthorDate: Wed Jan 17 12:34:33 2024 +0100
Fixed a design mistake of ConnectionEndpoint having a direct dependency on HttpRequestExecutor class
---
.../testing/sync/TestConnectionManagement.java | 35 ++++++++++++------
.../http/impl/classic/InternalExecRuntime.java | 6 +++-
.../impl/io/BasicHttpClientConnectionManager.java | 21 +++++++++++
.../io/PoolingHttpClientConnectionManager.java | 21 +++++++++++
.../hc/client5/http/io/ConnectionEndpoint.java | 42 ++++++++++++++++++----
5 files changed, 108 insertions(+), 17 deletions(-)
diff --git a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestConnectionManagement.java b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestConnectionManagement.java
index ff1f8d0a2..fab340c69 100644
--- a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestConnectionManagement.java
+++ b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestConnectionManagement.java
@@ -40,10 +40,12 @@ import org.apache.hc.client5.testing.classic.RandomHandler;
import org.apache.hc.client5.testing.sync.extension.TestClientResources;
import org.apache.hc.core5.http.ClassicHttpRequest;
import org.apache.hc.core5.http.ClassicHttpResponse;
+import org.apache.hc.core5.http.HttpException;
import org.apache.hc.core5.http.HttpHost;
import org.apache.hc.core5.http.HttpStatus;
import org.apache.hc.core5.http.URIScheme;
import org.apache.hc.core5.http.impl.io.HttpRequestExecutor;
+import org.apache.hc.core5.http.io.HttpClientConnection;
import org.apache.hc.core5.http.message.BasicClassicHttpRequest;
import org.apache.hc.core5.http.protocol.BasicHttpContext;
import org.apache.hc.core5.http.protocol.DefaultHttpProcessor;
@@ -58,6 +60,7 @@ import org.apache.hc.core5.testing.classic.ClassicTestServer;
import org.apache.hc.core5.util.TimeValue;
import org.apache.hc.core5.util.Timeout;
import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
@@ -72,6 +75,28 @@ public class TestConnectionManagement {
@RegisterExtension
private TestClientResources testResources = new TestClientResources(URIScheme.HTTP, TIMEOUT);
+ ConnectionEndpoint.RequestExecutor exec;
+
+ @BeforeEach
+ public void setup() {
+ exec = new ConnectionEndpoint.RequestExecutor() {
+
+ final HttpRequestExecutor requestExecutor = new HttpRequestExecutor();
+ final HttpProcessor httpProcessor = new DefaultHttpProcessor(
+ new RequestTargetHost(), new RequestContent(), new RequestConnControl());
+ @Override
+ public ClassicHttpResponse execute(final ClassicHttpRequest request,
+ final HttpClientConnection conn,
+ final HttpContext context) throws IOException, HttpException {
+ requestExecutor.preProcess(request, httpProcessor, context);
+ final ClassicHttpResponse response = requestExecutor.execute(request, conn, context);
+ requestExecutor.postProcess(response, httpProcessor, context);
+ return response;
+ }
+
+ };
+ }
+
public ClassicTestServer startServer() throws IOException {
return testResources.startServer(null, null, null);
}
@@ -110,11 +135,6 @@ public class TestConnectionManagement {
connManager.connect(endpoint1, null, context);
- final HttpProcessor httpProcessor = new DefaultHttpProcessor(
- new RequestTargetHost(), new RequestContent(), new RequestConnControl());
-
- final HttpRequestExecutor exec = new HttpRequestExecutor();
- exec.preProcess(request, httpProcessor, context);
try (final ClassicHttpResponse response1 = endpoint1.execute("id1", request, exec, context)) {
Assertions.assertEquals(HttpStatus.SC_OK, response1.getCode());
}
@@ -178,11 +198,6 @@ public class TestConnectionManagement {
final ConnectionEndpoint endpoint1 = leaseRequest1.get(Timeout.ZERO_MILLISECONDS);
connManager.connect(endpoint1, null, context);
- final HttpProcessor httpProcessor = new DefaultHttpProcessor(
- new RequestTargetHost(), new RequestContent(), new RequestConnControl());
-
- final HttpRequestExecutor exec = new HttpRequestExecutor();
- exec.preProcess(request, httpProcessor, context);
try (final ClassicHttpResponse response1 = endpoint1.execute("id1", request, exec, context)) {
Assertions.assertEquals(HttpStatus.SC_OK, response1.getCode());
}
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/classic/InternalExecRuntime.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/classic/InternalExecRuntime.java
index a3d5b6f2d..cb86ec7b2 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/classic/InternalExecRuntime.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/classic/InternalExecRuntime.java
@@ -213,7 +213,11 @@ class InternalExecRuntime implements ExecRuntime, Cancellable {
if (log.isDebugEnabled()) {
log.debug("{} start execution {}", ConnPoolSupport.getId(endpoint), id);
}
- return endpoint.execute(id, request, requestExecutor, context);
+ return endpoint.execute(
+ id,
+ request,
+ requestExecutor::execute,
+ context);
}
@Override
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/BasicHttpClientConnectionManager.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/BasicHttpClientConnectionManager.java
index e6f4b911d..c2adfb767 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/BasicHttpClientConnectionManager.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/BasicHttpClientConnectionManager.java
@@ -610,6 +610,10 @@ public class BasicHttpClientConnectionManager implements HttpClientConnectionMan
getValidatedConnection().setSocketTimeout(timeout);
}
+ /**
+ * @deprecated Use {@link #execute(String, ClassicHttpRequest, RequestExecutor, HttpContext)}
+ */
+ @Deprecated
@Override
public ClassicHttpResponse execute(
final String exchangeId,
@@ -624,6 +628,23 @@ public class BasicHttpClientConnectionManager implements HttpClientConnectionMan
return requestExecutor.execute(request, getValidatedConnection(), context);
}
+ /**
+ * @since 5.4
+ */
+ @Override
+ public ClassicHttpResponse execute(
+ final String exchangeId,
+ final ClassicHttpRequest request,
+ final RequestExecutor requestExecutor,
+ final HttpContext context) throws IOException, HttpException {
+ Args.notNull(request, "HTTP request");
+ Args.notNull(requestExecutor, "Request executor");
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("{} Executing exchange {}", id, exchangeId);
+ }
+ return requestExecutor.execute(request, getValidatedConnection(), context);
+ }
+
}
/**
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/PoolingHttpClientConnectionManager.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/PoolingHttpClientConnectionManager.java
index 73fa29d8e..93b07cf35 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/PoolingHttpClientConnectionManager.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/PoolingHttpClientConnectionManager.java
@@ -710,6 +710,10 @@ public class PoolingHttpClientConnectionManager
getValidatedPoolEntry().getConnection().setSocketTimeout(timeout);
}
+ /**
+ * @deprecated Use {@link #execute(String, ClassicHttpRequest, RequestExecutor, HttpContext)}
+ */
+ @Deprecated
@Override
public ClassicHttpResponse execute(
final String exchangeId,
@@ -725,5 +729,22 @@ public class PoolingHttpClientConnectionManager
return requestExecutor.execute(request, connection, context);
}
+ /**
+ * @since 5.4
+ */
+ public ClassicHttpResponse execute(
+ final String exchangeId,
+ final ClassicHttpRequest request,
+ final RequestExecutor requestExecutor,
+ final HttpContext context) throws IOException, HttpException {
+ Args.notNull(request, "HTTP request");
+ Args.notNull(requestExecutor, "Request executor");
+ final ManagedHttpClientConnection connection = getValidatedPoolEntry().getConnection();
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("{} executing exchange {} over {}", id, exchangeId, ConnPoolSupport.getId(connection));
+ }
+ return requestExecutor.execute(request, connection, context);
+ }
+
}
}
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/io/ConnectionEndpoint.java b/httpclient5/src/main/java/org/apache/hc/client5/http/io/ConnectionEndpoint.java
index 1abc055d5..0bbff7e3b 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/io/ConnectionEndpoint.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/io/ConnectionEndpoint.java
@@ -30,11 +30,13 @@ package org.apache.hc.client5.http.io;
import java.io.IOException;
import org.apache.hc.core5.annotation.Contract;
+import org.apache.hc.core5.annotation.Internal;
import org.apache.hc.core5.annotation.ThreadingBehavior;
import org.apache.hc.core5.http.ClassicHttpRequest;
import org.apache.hc.core5.http.ClassicHttpResponse;
import org.apache.hc.core5.http.HttpException;
import org.apache.hc.core5.http.impl.io.HttpRequestExecutor;
+import org.apache.hc.core5.http.io.HttpClientConnection;
import org.apache.hc.core5.http.protocol.HttpContext;
import org.apache.hc.core5.io.ModalCloseable;
import org.apache.hc.core5.util.Timeout;
@@ -51,6 +53,16 @@ import org.apache.hc.core5.util.Timeout;
@Contract(threading = ThreadingBehavior.SAFE)
public abstract class ConnectionEndpoint implements ModalCloseable {
+ /**
+ * @deprecated Use {@link #execute(String, ClassicHttpRequest, RequestExecutor, HttpContext)}
+ */
+ @Deprecated
+ public abstract ClassicHttpResponse execute(
+ String id,
+ ClassicHttpRequest request,
+ HttpRequestExecutor executor,
+ HttpContext context) throws IOException, HttpException;
+
/**
* Executes HTTP request using the provided request executor.
* <p>
@@ -59,14 +71,19 @@ public abstract class ConnectionEndpoint implements ModalCloseable {
*
* @param id unique operation ID or {@code null}.
* @param request the request message.
- * @param executor the request executor.
+ * @param requestExecutor the request executor.
* @param context the execution context.
+ *
+ * @since 5.4
*/
- public abstract ClassicHttpResponse execute(
- String id,
- ClassicHttpRequest request,
- HttpRequestExecutor executor,
- HttpContext context) throws IOException, HttpException;
+ // In the next major release this method must be made abstract.
+ public ClassicHttpResponse execute(
+ final String id,
+ final ClassicHttpRequest request,
+ final RequestExecutor requestExecutor,
+ final HttpContext context) throws IOException, HttpException {
+ return requestExecutor.execute(request,null, context);
+ }
/**
* Determines if the connection to the remote endpoint is still open and valid.
@@ -80,4 +97,17 @@ public abstract class ConnectionEndpoint implements ModalCloseable {
*/
public abstract void setSocketTimeout(Timeout timeout);
+ /**
+ * @since 5.4
+ */
+ @Internal
+ public interface RequestExecutor {
+
+ ClassicHttpResponse execute(
+ ClassicHttpRequest request,
+ HttpClientConnection conn,
+ HttpContext context) throws IOException, HttpException;
+
+ }
+
}