This is an automated email from the ASF dual-hosted git repository.

dkulp pushed a commit to branch 3.6.x-fixes
in repository https://gitbox.apache.org/repos/asf/cxf.git

commit 069b9ec61876f81ed78b87ed0927a3033a5603f2
Author: Daniel Kulp <[email protected]>
AuthorDate: Fri Mar 17 12:50:19 2023 -0400

    Make the default for http servers to enable http/2 when possible.  Provide 
way for client to force to http/2 ahead of time.
    
    (cherry picked from commit a4bdbdd4ddf9c1a202c7085ebc59fb73ef96db07)
    
    # Conflicts:
    #       parent/pom.xml
---
 .../cxf/transport/http/HttpClientHTTPConduit.java  | 50 ++++++++++++++++------
 .../systest/https/clientauth/ClientAuthTest.java   | 40 +++++++++--------
 2 files changed, 60 insertions(+), 30 deletions(-)

diff --git 
a/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HttpClientHTTPConduit.java
 
b/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HttpClientHTTPConduit.java
index 1338109a22..da1e0d9717 100644
--- 
a/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HttpClientHTTPConduit.java
+++ 
b/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HttpClientHTTPConduit.java
@@ -139,6 +139,14 @@ public class HttpClientHTTPConduit extends 
URLConnectionHTTPConduit {
             sslURL = null;
             client = null;
         }
+        // If the HTTP_REQUEST_METHOD is not set, the default is "POST".
+        String httpRequestMethod =
+            (String)message.get(Message.HTTP_REQUEST_METHOD);
+        if (httpRequestMethod == null) {
+            httpRequestMethod = "POST";
+            message.put(Message.HTTP_REQUEST_METHOD, "POST");
+        }
+
         HttpClient cl = client;
         if (cl == null) {
             int ctimeout = determineConnectionTimeout(message, csPolicy);      
  
@@ -194,25 +202,37 @@ public class HttpClientHTTPConduit extends 
URLConnectionHTTPConduit {
                     throw new IOException(e);
                 }
             }
-            if ("1.1".equals(HTTP_VERSION) || 
"1.1".equals(csPolicy.getVersion())) {
+            String verc = 
(String)message.getContextualProperty(FORCE_HTTP_VERSION);
+            if (verc == null) {
+                verc = csPolicy.getVersion();
+            }
+            if ("1.1".equals(HTTP_VERSION) || "1.1".equals(verc)) {
                 cb.version(Version.HTTP_1_1);  
-            }    
-            
-            //TODO
-            //cb.authenticator(Authenticator.getDefault())
+            }
 
             cl = cb.build();
+            if (!"https".equals(uri.getScheme()) 
+                && 
!KNOWN_HTTP_VERBS_WITH_NO_CONTENT.contains(httpRequestMethod)
+                && cl.version() == Version.HTTP_2
+                && ("2".equals(verc) || ("auto".equals(verc) && 
"2".equals(HTTP_VERSION)))) {
+                try {
+                    // We specifically want HTTP2, but we're using a request
+                    // that won't trigger an upgrade to HTTP/2 so we'll
+                    // call OPTIONS on the URI which may trigger HTTP/2 
upgrade.
+                    // Not needed for methods that don't have a body 
(GET/HEAD/etc...) 
+                    // or for https (negotiated at the TLS level)
+                    HttpRequest.Builder rb = HttpRequest.newBuilder()
+                        .uri(uri)
+                        .method("OPTIONS", BodyPublishers.noBody());
+                    cl.send(rb.build(), BodyHandlers.ofByteArray());
+                } catch (IOException | InterruptedException e) {
+                    //
+                }
+            } 
             client = cl;
         }        
         message.put(HttpClient.class, cl);
         
-        // If the HTTP_REQUEST_METHOD is not set, the default is "POST".
-        String httpRequestMethod =
-            (String)message.get(Message.HTTP_REQUEST_METHOD);
-        if (httpRequestMethod == null) {
-            httpRequestMethod = "POST";
-            message.put(Message.HTTP_REQUEST_METHOD, "POST");
-        }
         message.put(KEY_HTTP_CONNECTION_ADDRESS, address);        
     }
 
@@ -342,7 +362,11 @@ public class HttpClientHTTPConduit extends 
URLConnectionHTTPConduit {
 
             HttpRequest.Builder rb = HttpRequest.newBuilder()
                 .method(httpRequestMethod, bp);  
-            if ("1.1".equals(HTTP_VERSION) || 
"1.1".equals(csPolicy.getVersion())) {
+            String verc = 
(String)outMessage.getContextualProperty(FORCE_HTTP_VERSION);
+            if (verc == null) {
+                verc = csPolicy.getVersion();
+            }
+            if ("1.1".equals(HTTP_VERSION) || "1.1".equals(verc)) {
                 rb.version(Version.HTTP_1_1);  
             }            
             try {
diff --git 
a/systests/transports/src/test/java/org/apache/cxf/systest/https/clientauth/ClientAuthTest.java
 
b/systests/transports/src/test/java/org/apache/cxf/systest/https/clientauth/ClientAuthTest.java
index e58a8eb979..d18010c51c 100644
--- 
a/systests/transports/src/test/java/org/apache/cxf/systest/https/clientauth/ClientAuthTest.java
+++ 
b/systests/transports/src/test/java/org/apache/cxf/systest/https/clientauth/ClientAuthTest.java
@@ -67,16 +67,22 @@ public class ClientAuthTest extends 
AbstractBusClientServerTestBase {
     static final String PORT2 = allocatePort(ClientAuthServer.class, 2);
 
     final String clientKey;
+    final Object clientVal;
 
-    public ClientAuthTest(String ck) {
+    public ClientAuthTest(String ck, Object value) {
         this.clientKey = ck;
+        this.clientVal = value;
     }
     
     @Parameters(name = "{0}")
-    public static Collection<String> data() {
-        return Arrays.asList(new String[] {"force.urlconnection.http.conduit",
-                                           "defaultConduit",
-                                           "use.async.http.conduit"});
+    public static Collection<Object[]> data() {
+        return Arrays.asList(new Object[][] {
+            {"force.urlconnection.http.conduit", true},
+            {"use.async.http.conduit", true},
+            {"defaultConduit", true},
+            {"org.apache.cxf.transport.http.forceVersion", "1.1"},
+            {"org.apache.cxf.transport.http.forceVersion", "2"}
+        });
     }
 
     @BeforeClass
@@ -112,7 +118,7 @@ public class ClientAuthTest extends 
AbstractBusClientServerTestBase {
 
         updateAddressPort(port, PORT);
 
-        ((BindingProvider)port).getRequestContext().put(clientKey, true);
+        ((BindingProvider)port).getRequestContext().put(clientKey, clientVal);
 
         
         assertEquals(port.greetMe("Kitty"), "Hello Kitty");
@@ -139,7 +145,7 @@ public class ClientAuthTest extends 
AbstractBusClientServerTestBase {
 
         updateAddressPort(port, PORT);
 
-        ((BindingProvider)port).getRequestContext().put(clientKey, true);
+        ((BindingProvider)port).getRequestContext().put(clientKey, clientVal);
 
         try {
             port.greetMe("Kitty");
@@ -170,7 +176,7 @@ public class ClientAuthTest extends 
AbstractBusClientServerTestBase {
 
         updateAddressPort(port, PORT);
 
-        ((BindingProvider)port).getRequestContext().put(clientKey, true);
+        ((BindingProvider)port).getRequestContext().put(clientKey, clientVal);
 
         try {
             port.greetMe("Kitty");
@@ -208,7 +214,7 @@ public class ClientAuthTest extends 
AbstractBusClientServerTestBase {
 
             updateAddressPort(port, PORT);
 
-            ((BindingProvider)port).getRequestContext().put(clientKey, true);
+            ((BindingProvider)port).getRequestContext().put(clientKey, 
clientVal);
 
             assertEquals(port.greetMe("Kitty"), "Hello Kitty");
 
@@ -240,7 +246,7 @@ public class ClientAuthTest extends 
AbstractBusClientServerTestBase {
 
         updateAddressPort(port, PORT2);
 
-        ((BindingProvider)port).getRequestContext().put(clientKey, true);
+        ((BindingProvider)port).getRequestContext().put(clientKey, clientVal);
 
         assertEquals(port.greetMe("Kitty"), "Hello Kitty");
 
@@ -266,7 +272,7 @@ public class ClientAuthTest extends 
AbstractBusClientServerTestBase {
 
         updateAddressPort(port, PORT2);
 
-        ((BindingProvider)port).getRequestContext().put(clientKey, true);
+        ((BindingProvider)port).getRequestContext().put(clientKey, clientVal);
 
         try {
             port.greetMe("Kitty");
@@ -297,7 +303,7 @@ public class ClientAuthTest extends 
AbstractBusClientServerTestBase {
 
         updateAddressPort(port, PORT);
 
-        ((BindingProvider)port).getRequestContext().put(clientKey, true);
+        ((BindingProvider)port).getRequestContext().put(clientKey, clientVal);
 
         try {
             port.greetMe("Kitty");
@@ -328,7 +334,7 @@ public class ClientAuthTest extends 
AbstractBusClientServerTestBase {
 
         updateAddressPort(port, PORT2);
 
-        ((BindingProvider)port).getRequestContext().put(clientKey, true);
+        ((BindingProvider)port).getRequestContext().put(clientKey, clientVal);
 
         try {
             port.greetMe("Kitty");
@@ -409,7 +415,7 @@ public class ClientAuthTest extends 
AbstractBusClientServerTestBase {
 
         updateAddressPort(port, PORT);
 
-        ((BindingProvider)port).getRequestContext().put(clientKey, true);
+        ((BindingProvider)port).getRequestContext().put(clientKey, clientVal);
 
         Client client = ClientProxy.getClient(port);
         HTTPConduit http = (HTTPConduit) client.getConduit();
@@ -430,7 +436,7 @@ public class ClientAuthTest extends 
AbstractBusClientServerTestBase {
 
         updateAddressPort(port, PORT2);
 
-        ((BindingProvider)port).getRequestContext().put(clientKey, true);
+        ((BindingProvider)port).getRequestContext().put(clientKey, clientVal);
 
         client = ClientProxy.getClient(port);
         http = (HTTPConduit) client.getConduit();
@@ -452,7 +458,7 @@ public class ClientAuthTest extends 
AbstractBusClientServerTestBase {
 
         updateAddressPort(port, PORT);
 
-        ((BindingProvider)port).getRequestContext().put(clientKey, true);
+        ((BindingProvider)port).getRequestContext().put(clientKey, clientVal);
 
         // Set up KeyManagers/TrustManagers
         KeyStore ts = KeyStore.getInstance("JKS");
@@ -499,7 +505,7 @@ public class ClientAuthTest extends 
AbstractBusClientServerTestBase {
 
         updateAddressPort(port, PORT);
 
-        ((BindingProvider)port).getRequestContext().put(clientKey, true);
+        ((BindingProvider)port).getRequestContext().put(clientKey, clientVal);
 
         // Set up KeyManagers/TrustManagers
         KeyStore ts = KeyStore.getInstance("JKS");

Reply via email to