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