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