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

dkulp pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cxf.git

commit 3d70de80fb60b74040c0214fc6a28774362556e4
Author: Daniel Kulp <d...@kulp.com>
AuthorDate: Wed Aug 30 12:28:20 2023 -0400

    Add system properly to force use of older URLConnection
---
 .../cxf/transport/http/HTTPTransportFactory.java   | 11 ++-
 .../cxf/transport/http/HttpClientHTTPConduit.java  | 81 ++++++++++++----------
 .../transport/http/URLConnectionHTTPConduit.java   |  7 --
 3 files changed, 53 insertions(+), 46 deletions(-)

diff --git 
a/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPTransportFactory.java
 
b/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPTransportFactory.java
index f13e236425..40d42c8e31 100644
--- 
a/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPTransportFactory.java
+++ 
b/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPTransportFactory.java
@@ -37,6 +37,7 @@ import java.util.logging.Logger;
 import org.apache.cxf.Bus;
 import org.apache.cxf.common.injection.NoJSR250Annotations;
 import org.apache.cxf.common.logging.LogUtils;
+import org.apache.cxf.common.util.SystemPropertyAction;
 import org.apache.cxf.configuration.Configurer;
 import org.apache.cxf.service.Service;
 import org.apache.cxf.service.model.BindingInfo;
@@ -84,6 +85,9 @@ public class HTTPTransportFactory
     private final ReadWriteLock lock = new ReentrantReadWriteLock();
     private final Lock r = lock.readLock();
     private final Lock w = lock.writeLock();
+    
+    private boolean forceURLConnectionConduit 
+        = 
Boolean.valueOf(SystemPropertyAction.getProperty("org.apache.cxf.transport.http.forceURLConnection"));
 
     public HTTPTransportFactory() {
         this(new DestinationRegistryImpl());
@@ -233,8 +237,11 @@ public class HTTPTransportFactory
             conduit = factory.createConduit(this, bus, endpointInfo, target);
         }
         if (conduit == null) {
-            //conduit = new URLConnectionHTTPConduit(bus, endpointInfo, 
target);
-            conduit = new HttpClientHTTPConduit(bus, endpointInfo, target);
+            if (forceURLConnectionConduit) {
+                conduit = new URLConnectionHTTPConduit(bus, endpointInfo, 
target);
+            } else {
+                conduit = new HttpClientHTTPConduit(bus, endpointInfo, target);
+            }
         }
 
         // Spring configure the conduit.
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 e16f9d3b48..b40b6904dc 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
@@ -90,10 +90,6 @@ public class HttpClientHTTPConduit extends 
URLConnectionHTTPConduit {
     volatile HttpClient client;
     volatile int lastTlsHash = -1;
     volatile URI sslURL;
-    
-    public HttpClientHTTPConduit(Bus b, EndpointInfo ei) throws IOException {
-        super(b, ei);
-    }
 
     public HttpClientHTTPConduit(Bus b, EndpointInfo ei, EndpointReferenceType 
t) throws IOException {
         super(b, ei, t);
@@ -115,7 +111,13 @@ public class HttpClientHTTPConduit extends 
URLConnectionHTTPConduit {
      * Close the conduit
      */
     public void close() {
-        if (client != null) {
+        if (client instanceof AutoCloseable) {
+            try {
+                ((AutoCloseable)client).close();
+            } catch (Exception e) {
+                //ignore
+            }                
+        } else if (client != null) {
             String name = client.toString();
             client = null;
             tryToShutdownSelector(name);
@@ -398,6 +400,41 @@ public class HttpClientHTTPConduit extends 
URLConnectionHTTPConduit {
             }            
         }
         
+        private boolean isConnectionAttemptCompleted(HTTPClientPolicy 
csPolicy, PipedOutputStream out)
+            throws IOException {
+            if (!connectionComplete) {
+                // if we haven't connected yet, we'll see if an exception is 
the reason
+                // why we haven't connected.  Otherwise, wait for the 
connection
+                // to complete.
+                if (future.isDone()) {
+                    try {
+                        future.get();
+                    } catch (InterruptedException | ExecutionException e) {
+                        if (e.getCause() instanceof IOException) {
+                            throw new Fault("Could not send Message.", LOG, 
(IOException)e.getCause());
+                        }
+                    }
+                    return false;
+                }
+                try {
+                    out.wait(csPolicy.getConnectionTimeout());
+                } catch (InterruptedException e) {
+                    //ignore
+                }
+                if (future.isDone()) {
+                    try {
+                        future.get();
+                    } catch (InterruptedException | ExecutionException e) {
+                        if (e.getCause() instanceof IOException) {
+                            throw new Fault("Could not send Message.", LOG, 
(IOException)e.getCause());
+                        }
+                    }
+                    return false;
+                }
+            }
+            return true;
+        }
+        
         @Override
         protected void setProtocolHeaders() throws IOException {
             HttpClient cl = outMessage.get(HttpClient.class);
@@ -410,37 +447,7 @@ public class HttpClientHTTPConduit extends 
URLConnectionHTTPConduit {
                                         ? 4096 : csPolicy.getChunkLength());
             pout = new PipedOutputStream(pin) {
                 synchronized boolean canWrite() throws IOException {
-                    if (!connectionComplete) {
-                        // if we haven't connected yet, we'll see if an 
exception is the reason 
-                        // why we haven't connected.  Otherwise, wait for the 
connection
-                        // to complete.
-                        if (future.isDone()) {
-                            try {
-                                future.get();
-                            } catch (InterruptedException | ExecutionException 
e) {
-                                if (e.getCause() instanceof IOException) {
-                                    throw new Fault("Could not send Message.", 
LOG, (IOException)e.getCause());
-                                }
-                            }
-                            return false;
-                        }                        
-                        try {
-                            wait(csPolicy.getConnectionTimeout());
-                        } catch (InterruptedException e) {
-                            //ignore
-                        }
-                        if (future.isDone()) {
-                            try {
-                                future.get();
-                            } catch (InterruptedException | ExecutionException 
e) {
-                                if (e.getCause() instanceof IOException) {
-                                    throw new Fault("Could not send Message.", 
LOG, (IOException)e.getCause());
-                                }
-                            }
-                            return false;
-                        }
-                    }                    
-                    return true;
+                    return isConnectionAttemptCompleted(csPolicy, this);
                 }
                 @Override
                 public void write(int b) throws IOException {
@@ -466,7 +473,7 @@ public class HttpClientHTTPConduit extends 
URLConnectionHTTPConduit {
                 @Override
                 public void subscribe(Subscriber<? super ByteBuffer> 
subscriber) {
                     connectionComplete = true;
-                    synchronized(pout) {
+                    synchronized (pout) {
                         pout.notifyAll();
                     }
                     BodyPublishers.ofInputStream(new Supplier<InputStream>() {
diff --git 
a/rt/transports/http/src/main/java/org/apache/cxf/transport/http/URLConnectionHTTPConduit.java
 
b/rt/transports/http/src/main/java/org/apache/cxf/transport/http/URLConnectionHTTPConduit.java
index e31b2c5782..028eaf950f 100644
--- 
a/rt/transports/http/src/main/java/org/apache/cxf/transport/http/URLConnectionHTTPConduit.java
+++ 
b/rt/transports/http/src/main/java/org/apache/cxf/transport/http/URLConnectionHTTPConduit.java
@@ -76,13 +76,6 @@ public class URLConnectionHTTPConduit extends HTTPConduit {
      */
     protected HttpsURLConnectionFactory connectionFactory;
 
-
-    public URLConnectionHTTPConduit(Bus b, EndpointInfo ei) throws IOException 
{
-        super(b, ei);
-        connectionFactory = new HttpsURLConnectionFactory();
-        CXFAuthenticator.addAuthenticator();
-    }
-
     public URLConnectionHTTPConduit(Bus b, EndpointInfo ei, 
EndpointReferenceType t) throws IOException {
         super(b, ei, t);
         connectionFactory = new HttpsURLConnectionFactory();

Reply via email to