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

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

commit 2561dfc8ae76689c2432d65099d4036e01c69158
Author: Freeman(Yue) Fang <[email protected]>
AuthorDate: Tue Oct 8 09:36:46 2024 -0400

    [CXF-9062]Be able to create AsyncHTTPConduit based on URLConnectionHT… 
(#2093)
    
    * [CXF-9062]Be able to create AsyncHTTPConduit based on 
URLConnectionHTTPConduit
    
    * [CXF-9062]address feedback
    
    (cherry picked from commit d3da696c254edcdd4ed95ad6ed24907f5ab036c1)
---
 .../http/asyncclient/AsyncHTTPConduit.java         |  6 ++--
 .../http/asyncclient/AsyncHTTPConduitFactory.java  | 13 +++++++--
 .../asyncclient/AsyncWrappedOutputStreamBase.java  | 34 ++++++++++++++++++++++
 .../asyncclient/CXFHttpAsyncResponseConsumer.java  |  5 ++--
 .../transport/http/asyncclient/CXFHttpRequest.java |  8 ++---
 ...uit.java => URLConnectionAsyncHTTPConduit.java} | 20 ++++++-------
 .../http/asyncclient/hc5/AsyncHTTPConduit.java     |  6 ++--
 .../asyncclient/hc5/AsyncHTTPConduitFactory.java   | 13 +++++++--
 .../hc5/AsyncWrappedOutputStreamBase.java          | 34 ++++++++++++++++++++++
 .../hc5/CXFHttpAsyncResponseConsumer.java          |  5 ++--
 .../http/asyncclient/hc5/CXFHttpRequest.java       |  7 ++---
 ...uit.java => URLConnectionAsyncHTTPConduit.java} | 23 ++++++++-------
 .../cxf/transport/http/HTTPTransportFactory.java   | 13 ++++++---
 .../http_undertow/UndertowDigestAuthTest.java      |  2 +-
 .../AbstractUndertowClientServerHttp2Test.java     |  8 ++---
 .../systest/http_jetty/JettyDigestAuthTest.java    |  2 +-
 16 files changed, 139 insertions(+), 60 deletions(-)

diff --git 
a/rt/transports/http-hc/src/main/java/org/apache/cxf/transport/http/asyncclient/AsyncHTTPConduit.java
 
b/rt/transports/http-hc/src/main/java/org/apache/cxf/transport/http/asyncclient/AsyncHTTPConduit.java
index 7325611b8b..c3eb240191 100755
--- 
a/rt/transports/http-hc/src/main/java/org/apache/cxf/transport/http/asyncclient/AsyncHTTPConduit.java
+++ 
b/rt/transports/http-hc/src/main/java/org/apache/cxf/transport/http/asyncclient/AsyncHTTPConduit.java
@@ -31,7 +31,6 @@ import java.net.SocketTimeoutException;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.nio.ByteBuffer;
-import java.nio.channels.WritableByteChannel;
 import java.security.GeneralSecurityException;
 import java.security.Principal;
 import java.security.cert.Certificate;
@@ -58,7 +57,6 @@ import org.apache.cxf.helpers.HttpHeaderHelper;
 import org.apache.cxf.helpers.IOUtils;
 import org.apache.cxf.io.CacheAndWriteOutputStream;
 import org.apache.cxf.io.CachedOutputStream;
-import org.apache.cxf.io.CopyingOutputStream;
 import org.apache.cxf.message.Message;
 import org.apache.cxf.message.MessageUtils;
 import org.apache.cxf.service.model.EndpointInfo;
@@ -265,7 +263,7 @@ public class AsyncHTTPConduit extends HttpClientHTTPConduit 
{
 
 
     public class AsyncWrappedOutputStream extends WrappedOutputStream
-        implements CopyingOutputStream, WritableByteChannel {
+        implements AsyncWrappedOutputStreamBase {
         final HTTPClientPolicy csPolicy;
 
         CXFHttpRequest entity;
@@ -618,7 +616,7 @@ public class AsyncHTTPConduit extends HttpClientHTTPConduit 
{
                     || lastURL.getPort() != url.getPort();
         }
 
-        protected boolean retrySetHttpResponse(HttpResponse r) {
+        public boolean retrySetHttpResponse(HttpResponse r) {
             if (isAsync) {
                 setHttpResponse(r);
             }
diff --git 
a/rt/transports/http-hc/src/main/java/org/apache/cxf/transport/http/asyncclient/AsyncHTTPConduitFactory.java
 
b/rt/transports/http-hc/src/main/java/org/apache/cxf/transport/http/asyncclient/AsyncHTTPConduitFactory.java
index f0c88a8cac..9b0c928f29 100644
--- 
a/rt/transports/http-hc/src/main/java/org/apache/cxf/transport/http/asyncclient/AsyncHTTPConduitFactory.java
+++ 
b/rt/transports/http-hc/src/main/java/org/apache/cxf/transport/http/asyncclient/AsyncHTTPConduitFactory.java
@@ -32,6 +32,7 @@ import org.apache.cxf.service.model.EndpointInfo;
 import org.apache.cxf.transport.http.HTTPConduit;
 import org.apache.cxf.transport.http.HTTPConduitFactory;
 import org.apache.cxf.transport.http.HTTPTransportFactory;
+import org.apache.cxf.transport.http.URLConnectionHTTPConduit;
 import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
 import org.apache.cxf.ws.addressing.EndpointReferenceType;
 import org.apache.http.HttpRequest;
@@ -85,7 +86,8 @@ public class AsyncHTTPConduitFactory implements 
HTTPConduitFactory {
 
     //CXF specific
     public static final String USE_POLICY = 
"org.apache.cxf.transport.http.async.usePolicy";
-
+    
+    
 
     public enum UseAsyncPolicy {
         ALWAYS, ASYNC_ONLY, NEVER;
@@ -129,6 +131,7 @@ public class AsyncHTTPConduitFactory implements 
HTTPConduitFactory {
     int soTimeout = IOReactorConfig.DEFAULT.getSoTimeout();
     boolean soKeepalive = IOReactorConfig.DEFAULT.isSoKeepalive();
     boolean tcpNoDelay = true;
+    
 
 
     AsyncHTTPConduitFactory() {
@@ -262,7 +265,11 @@ public class AsyncHTTPConduitFactory implements 
HTTPConduitFactory {
         if (isShutdown) {
             return null;
         }
-        return new AsyncHTTPConduit(bus, localInfo, target, this);
+        if (HTTPTransportFactory.isForceURLConnectionConduit()) {
+            return new URLConnectionAsyncHTTPConduit(bus, localInfo, target, 
this);
+        } else {
+            return new AsyncHTTPConduit(bus, localInfo, target, this);
+        }
     }
 
     public void shutdown() {
@@ -375,7 +382,7 @@ public class AsyncHTTPConduitFactory implements 
HTTPConduitFactory {
     protected void adaptClientBuilder(HttpAsyncClientBuilder 
httpAsyncClientBuilder) {
     }
 
-    public CloseableHttpAsyncClient createClient(final AsyncHTTPConduit c) 
throws IOException {
+    public CloseableHttpAsyncClient createClient(final 
URLConnectionHTTPConduit c) throws IOException {
         if (client == null) {
             setupNIOClient(c.getClient());
         }
diff --git 
a/rt/transports/http-hc/src/main/java/org/apache/cxf/transport/http/asyncclient/AsyncWrappedOutputStreamBase.java
 
b/rt/transports/http-hc/src/main/java/org/apache/cxf/transport/http/asyncclient/AsyncWrappedOutputStreamBase.java
new file mode 100644
index 0000000000..66e5b24198
--- /dev/null
+++ 
b/rt/transports/http-hc/src/main/java/org/apache/cxf/transport/http/asyncclient/AsyncWrappedOutputStreamBase.java
@@ -0,0 +1,34 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cxf.transport.http.asyncclient;
+
+import java.nio.channels.WritableByteChannel;
+
+import org.apache.cxf.io.CachedOutputStream;
+import org.apache.cxf.io.CopyingOutputStream;
+import org.apache.http.HttpResponse;
+
+interface AsyncWrappedOutputStreamBase 
+    extends CopyingOutputStream, WritableByteChannel  {
+    boolean retransmitable();
+    
+    CachedOutputStream getCachedStream();
+    
+    boolean retrySetHttpResponse(HttpResponse r);
+}
diff --git 
a/rt/transports/http-hc/src/main/java/org/apache/cxf/transport/http/asyncclient/CXFHttpAsyncResponseConsumer.java
 
b/rt/transports/http-hc/src/main/java/org/apache/cxf/transport/http/asyncclient/CXFHttpAsyncResponseConsumer.java
index 09af41f64b..bae369f4dc 100644
--- 
a/rt/transports/http-hc/src/main/java/org/apache/cxf/transport/http/asyncclient/CXFHttpAsyncResponseConsumer.java
+++ 
b/rt/transports/http-hc/src/main/java/org/apache/cxf/transport/http/asyncclient/CXFHttpAsyncResponseConsumer.java
@@ -21,7 +21,6 @@ package org.apache.cxf.transport.http.asyncclient;
 
 import java.io.IOException;
 
-import 
org.apache.cxf.transport.http.asyncclient.AsyncHTTPConduit.AsyncWrappedOutputStream;
 import org.apache.http.HttpException;
 import org.apache.http.HttpResponse;
 import org.apache.http.nio.ContentDecoder;
@@ -32,7 +31,7 @@ import org.apache.http.protocol.HttpContext;
 public class CXFHttpAsyncResponseConsumer implements 
HttpAsyncResponseConsumer<Boolean> {
 
     private final SharedInputBuffer buf;
-    private final AsyncWrappedOutputStream outstream;
+    private final AsyncWrappedOutputStreamBase outstream;
     private final CXFResponseCallback responseCallback;
 
     private volatile boolean completed;
@@ -40,7 +39,7 @@ public class CXFHttpAsyncResponseConsumer implements 
HttpAsyncResponseConsumer<B
     private volatile HttpResponse response;
 
     public CXFHttpAsyncResponseConsumer(
-            final AsyncWrappedOutputStream asyncWrappedOutputStream,
+            final AsyncWrappedOutputStreamBase asyncWrappedOutputStream,
             final SharedInputBuffer buf,
             final CXFResponseCallback responseCallback) {
         super();
diff --git 
a/rt/transports/http-hc/src/main/java/org/apache/cxf/transport/http/asyncclient/CXFHttpRequest.java
 
b/rt/transports/http-hc/src/main/java/org/apache/cxf/transport/http/asyncclient/CXFHttpRequest.java
index 82dfff5e73..e206bcac43 100644
--- 
a/rt/transports/http-hc/src/main/java/org/apache/cxf/transport/http/asyncclient/CXFHttpRequest.java
+++ 
b/rt/transports/http-hc/src/main/java/org/apache/cxf/transport/http/asyncclient/CXFHttpRequest.java
@@ -21,7 +21,7 @@ package org.apache.cxf.transport.http.asyncclient;
 
 import java.net.URI;
 
-import 
org.apache.cxf.transport.http.asyncclient.AsyncHTTPConduit.AsyncWrappedOutputStream;
+
 import org.apache.http.Header;
 import org.apache.http.HttpEntity;
 import org.apache.http.HttpEntityEnclosingRequest;
@@ -40,7 +40,7 @@ public class CXFHttpRequest extends AbstractHttpMessage 
implements HttpEntityEnc
 
     private URI uri;
     private HttpEntity entity;
-    private AsyncWrappedOutputStream out;
+    private AsyncWrappedOutputStreamBase out;
     private RequestConfig config;
 
     public CXFHttpRequest(final String method) {
@@ -48,10 +48,10 @@ public class CXFHttpRequest extends AbstractHttpMessage 
implements HttpEntityEnc
         this.method = method;
     }
 
-    public void setOutputStream(AsyncWrappedOutputStream o) {
+    public void setOutputStream(AsyncWrappedOutputStreamBase o) {
         out = o;
     }
-    public AsyncWrappedOutputStream getOutputStream() {
+    public AsyncWrappedOutputStreamBase getOutputStream() {
         return out;
     }
     public URI getURI() {
diff --git 
a/rt/transports/http-hc/src/main/java/org/apache/cxf/transport/http/asyncclient/AsyncHTTPConduit.java
 
b/rt/transports/http-hc/src/main/java/org/apache/cxf/transport/http/asyncclient/URLConnectionAsyncHTTPConduit.java
similarity index 98%
copy from 
rt/transports/http-hc/src/main/java/org/apache/cxf/transport/http/asyncclient/AsyncHTTPConduit.java
copy to 
rt/transports/http-hc/src/main/java/org/apache/cxf/transport/http/asyncclient/URLConnectionAsyncHTTPConduit.java
index 7325611b8b..9244db36ad 100755
--- 
a/rt/transports/http-hc/src/main/java/org/apache/cxf/transport/http/asyncclient/AsyncHTTPConduit.java
+++ 
b/rt/transports/http-hc/src/main/java/org/apache/cxf/transport/http/asyncclient/URLConnectionAsyncHTTPConduit.java
@@ -31,7 +31,6 @@ import java.net.SocketTimeoutException;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.nio.ByteBuffer;
-import java.nio.channels.WritableByteChannel;
 import java.security.GeneralSecurityException;
 import java.security.Principal;
 import java.security.cert.Certificate;
@@ -58,13 +57,12 @@ import org.apache.cxf.helpers.HttpHeaderHelper;
 import org.apache.cxf.helpers.IOUtils;
 import org.apache.cxf.io.CacheAndWriteOutputStream;
 import org.apache.cxf.io.CachedOutputStream;
-import org.apache.cxf.io.CopyingOutputStream;
 import org.apache.cxf.message.Message;
 import org.apache.cxf.message.MessageUtils;
 import org.apache.cxf.service.model.EndpointInfo;
 import org.apache.cxf.transport.http.Address;
 import org.apache.cxf.transport.http.Headers;
-import org.apache.cxf.transport.http.HttpClientHTTPConduit;
+import org.apache.cxf.transport.http.URLConnectionHTTPConduit;
 import 
org.apache.cxf.transport.http.asyncclient.AsyncHTTPConduitFactory.UseAsyncPolicy;
 import 
org.apache.cxf.transport.http.asyncclient.AsyncHttpResponseWrapperFactory.AsyncHttpResponseWrapper;
 import org.apache.cxf.transport.https.HttpsURLConnectionInfo;
@@ -97,7 +95,7 @@ import org.apache.http.nio.util.HeapByteBufferAllocator;
 /**
  *
  */
-public class AsyncHTTPConduit extends HttpClientHTTPConduit {
+public class URLConnectionAsyncHTTPConduit extends URLConnectionHTTPConduit {
     public static final String USE_ASYNC = "use.async.http.conduit";
 
     private final AsyncHTTPConduitFactory factory;
@@ -111,7 +109,7 @@ public class AsyncHTTPConduit extends HttpClientHTTPConduit 
{
     private volatile CloseableHttpAsyncClient client;
 
 
-    public AsyncHTTPConduit(Bus b,
+    public URLConnectionAsyncHTTPConduit(Bus b,
                             EndpointInfo ei,
                             EndpointReferenceType t,
                             AsyncHTTPConduitFactory factory) throws 
IOException {
@@ -265,7 +263,7 @@ public class AsyncHTTPConduit extends HttpClientHTTPConduit 
{
 
 
     public class AsyncWrappedOutputStream extends WrappedOutputStream
-        implements CopyingOutputStream, WritableByteChannel {
+        implements AsyncWrappedOutputStreamBase {
         final HTTPClientPolicy csPolicy;
 
         CXFHttpRequest entity;
@@ -523,11 +521,11 @@ public class AsyncHTTPConduit extends 
HttpClientHTTPConduit {
                     if (creds != null) {
                         return creds;
                     }
-                    if (AsyncHTTPConduit.this.proxyAuthorizationPolicy != null
-                            && 
AsyncHTTPConduit.this.proxyAuthorizationPolicy.getUserName() != null) {
-                        return new 
UsernamePasswordCredentials(AsyncHTTPConduit.this
+                    if 
(URLConnectionAsyncHTTPConduit.this.proxyAuthorizationPolicy != null
+                            && 
URLConnectionAsyncHTTPConduit.this.proxyAuthorizationPolicy.getUserName() != 
null) {
+                        return new 
UsernamePasswordCredentials(URLConnectionAsyncHTTPConduit.this
                                 .proxyAuthorizationPolicy.getUserName(),
-                                
AsyncHTTPConduit.this.proxyAuthorizationPolicy.getPassword());
+                                
URLConnectionAsyncHTTPConduit.this.proxyAuthorizationPolicy.getPassword());
                     }
                     return null;
                 }
@@ -618,7 +616,7 @@ public class AsyncHTTPConduit extends HttpClientHTTPConduit 
{
                     || lastURL.getPort() != url.getPort();
         }
 
-        protected boolean retrySetHttpResponse(HttpResponse r) {
+        public boolean retrySetHttpResponse(HttpResponse r) {
             if (isAsync) {
                 setHttpResponse(r);
             }
diff --git 
a/rt/transports/http-hc5/src/main/java/org/apache/cxf/transport/http/asyncclient/hc5/AsyncHTTPConduit.java
 
b/rt/transports/http-hc5/src/main/java/org/apache/cxf/transport/http/asyncclient/hc5/AsyncHTTPConduit.java
index 33351f17d6..3372ae4343 100644
--- 
a/rt/transports/http-hc5/src/main/java/org/apache/cxf/transport/http/asyncclient/hc5/AsyncHTTPConduit.java
+++ 
b/rt/transports/http-hc5/src/main/java/org/apache/cxf/transport/http/asyncclient/hc5/AsyncHTTPConduit.java
@@ -31,7 +31,6 @@ import java.net.SocketTimeoutException;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.nio.ByteBuffer;
-import java.nio.channels.WritableByteChannel;
 import java.security.GeneralSecurityException;
 import java.security.Principal;
 import java.security.cert.Certificate;
@@ -58,7 +57,6 @@ import org.apache.cxf.helpers.HttpHeaderHelper;
 import org.apache.cxf.helpers.IOUtils;
 import org.apache.cxf.io.CacheAndWriteOutputStream;
 import org.apache.cxf.io.CachedOutputStream;
-import org.apache.cxf.io.CopyingOutputStream;
 import org.apache.cxf.message.Message;
 import org.apache.cxf.message.MessageUtils;
 import org.apache.cxf.service.model.EndpointInfo;
@@ -285,7 +283,7 @@ public class AsyncHTTPConduit extends HttpClientHTTPConduit 
{
     }
 
     public class AsyncWrappedOutputStream extends WrappedOutputStream
-            implements CopyingOutputStream, WritableByteChannel {
+            implements AsyncWrappedOutputStreamBase {
         private final HTTPClientPolicy csPolicy;
 
         private CXFHttpRequest entity;
@@ -634,7 +632,7 @@ public class AsyncHTTPConduit extends HttpClientHTTPConduit 
{
                     || lastURL.getPort() != url.getPort();
         }
 
-        protected boolean retrySetHttpResponse(HttpResponse r) {
+        public boolean retrySetHttpResponse(HttpResponse r) {
             if (isAsync) {
                 setHttpResponse(r);
             }
diff --git 
a/rt/transports/http-hc5/src/main/java/org/apache/cxf/transport/http/asyncclient/hc5/AsyncHTTPConduitFactory.java
 
b/rt/transports/http-hc5/src/main/java/org/apache/cxf/transport/http/asyncclient/hc5/AsyncHTTPConduitFactory.java
index 0c1114cd5d..634843dc19 100644
--- 
a/rt/transports/http-hc5/src/main/java/org/apache/cxf/transport/http/asyncclient/hc5/AsyncHTTPConduitFactory.java
+++ 
b/rt/transports/http-hc5/src/main/java/org/apache/cxf/transport/http/asyncclient/hc5/AsyncHTTPConduitFactory.java
@@ -35,6 +35,7 @@ import org.apache.cxf.service.model.EndpointInfo;
 import org.apache.cxf.transport.http.HTTPConduit;
 import org.apache.cxf.transport.http.HTTPConduitFactory;
 import org.apache.cxf.transport.http.HTTPTransportFactory;
+import org.apache.cxf.transport.http.URLConnectionHTTPConduit;
 import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
 import org.apache.cxf.ws.addressing.EndpointReferenceType;
 import org.apache.hc.client5.http.SystemDefaultDnsResolver;
@@ -89,7 +90,8 @@ public class AsyncHTTPConduitFactory implements 
HTTPConduitFactory {
     public static final String USE_POLICY = 
"org.apache.cxf.transport.http.async.usePolicy";
 
     private static final Logger LOG = 
LogUtils.getL7dLogger(AsyncHTTPConduitFactory.class);
-
+    
+    
     public enum UseAsyncPolicy {
         ALWAYS, ASYNC_ONLY, NEVER;
 
@@ -154,6 +156,7 @@ public class AsyncHTTPConduitFactory implements 
HTTPConduitFactory {
     private boolean soKeepalive = IOReactorConfig.DEFAULT.isSoKeepalive();
     private boolean tcpNoDelay = true;
 
+
     AsyncHTTPConduitFactory() {
         super();
     }
@@ -276,7 +279,11 @@ public class AsyncHTTPConduitFactory implements 
HTTPConduitFactory {
         if (isShutdown) {
             return null;
         }
-        return new AsyncHTTPConduit(bus, localInfo, target, this);
+        if (HTTPTransportFactory.isForceURLConnectionConduit()) {
+            return new URLConnectionAsyncHTTPConduit(bus, localInfo, target, 
this);
+        } else {
+            return new AsyncHTTPConduit(bus, localInfo, target, this);
+        }
     }
 
     public void shutdown() {
@@ -399,7 +406,7 @@ public class AsyncHTTPConduitFactory implements 
HTTPConduitFactory {
     protected void adaptClientBuilder(HttpAsyncClientBuilder 
httpAsyncClientBuilder) {
     }
 
-    public CloseableHttpAsyncClient createClient(final AsyncHTTPConduit c, 
final TlsStrategy tlsStrategy) 
+    public CloseableHttpAsyncClient createClient(final 
URLConnectionHTTPConduit c, final TlsStrategy tlsStrategy) 
             throws IOException {
 
         return clients
diff --git 
a/rt/transports/http-hc5/src/main/java/org/apache/cxf/transport/http/asyncclient/hc5/AsyncWrappedOutputStreamBase.java
 
b/rt/transports/http-hc5/src/main/java/org/apache/cxf/transport/http/asyncclient/hc5/AsyncWrappedOutputStreamBase.java
new file mode 100644
index 0000000000..de36731636
--- /dev/null
+++ 
b/rt/transports/http-hc5/src/main/java/org/apache/cxf/transport/http/asyncclient/hc5/AsyncWrappedOutputStreamBase.java
@@ -0,0 +1,34 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cxf.transport.http.asyncclient.hc5;
+
+import java.nio.channels.WritableByteChannel;
+
+import org.apache.cxf.io.CachedOutputStream;
+import org.apache.cxf.io.CopyingOutputStream;
+import org.apache.hc.core5.http.HttpResponse;
+
+interface AsyncWrappedOutputStreamBase 
+    extends CopyingOutputStream, WritableByteChannel  {
+    boolean retransmitable();
+    
+    CachedOutputStream getCachedStream();
+    
+    boolean retrySetHttpResponse(HttpResponse r);
+}
diff --git 
a/rt/transports/http-hc5/src/main/java/org/apache/cxf/transport/http/asyncclient/hc5/CXFHttpAsyncResponseConsumer.java
 
b/rt/transports/http-hc5/src/main/java/org/apache/cxf/transport/http/asyncclient/hc5/CXFHttpAsyncResponseConsumer.java
index 5808de4870..2ed2b634e1 100644
--- 
a/rt/transports/http-hc5/src/main/java/org/apache/cxf/transport/http/asyncclient/hc5/CXFHttpAsyncResponseConsumer.java
+++ 
b/rt/transports/http-hc5/src/main/java/org/apache/cxf/transport/http/asyncclient/hc5/CXFHttpAsyncResponseConsumer.java
@@ -23,7 +23,6 @@ import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.List;
 
-import 
org.apache.cxf.transport.http.asyncclient.hc5.AsyncHTTPConduit.AsyncWrappedOutputStream;
 import org.apache.hc.core5.concurrent.FutureCallback;
 import org.apache.hc.core5.http.EntityDetails;
 import org.apache.hc.core5.http.Header;
@@ -35,7 +34,7 @@ import org.apache.hc.core5.http.protocol.HttpContext;
 
 public class CXFHttpAsyncResponseConsumer implements 
AsyncResponseConsumer<Boolean> {
     private final SharedInputBuffer buf;
-    private final AsyncWrappedOutputStream outstream;
+    private final AsyncWrappedOutputStreamBase outstream;
     private final CXFResponseCallback responseCallback;
     
     private volatile boolean completed;
@@ -43,7 +42,7 @@ public class CXFHttpAsyncResponseConsumer implements 
AsyncResponseConsumer<Boole
     private volatile HttpResponse response;
 
     public CXFHttpAsyncResponseConsumer(
-            final AsyncWrappedOutputStream asyncWrappedOutputStream,
+            final AsyncWrappedOutputStreamBase asyncWrappedOutputStream,
             final SharedInputBuffer buf,
             final CXFResponseCallback responseCallback) {
         super();
diff --git 
a/rt/transports/http-hc5/src/main/java/org/apache/cxf/transport/http/asyncclient/hc5/CXFHttpRequest.java
 
b/rt/transports/http-hc5/src/main/java/org/apache/cxf/transport/http/asyncclient/hc5/CXFHttpRequest.java
index 037bb88179..e38a9ceba6 100644
--- 
a/rt/transports/http-hc5/src/main/java/org/apache/cxf/transport/http/asyncclient/hc5/CXFHttpRequest.java
+++ 
b/rt/transports/http-hc5/src/main/java/org/apache/cxf/transport/http/asyncclient/hc5/CXFHttpRequest.java
@@ -22,7 +22,6 @@ package org.apache.cxf.transport.http.asyncclient.hc5;
 import java.net.URI;
 import java.net.URISyntaxException;
 
-import 
org.apache.cxf.transport.http.asyncclient.hc5.AsyncHTTPConduit.AsyncWrappedOutputStream;
 import org.apache.hc.client5.http.classic.methods.HttpUriRequestBase;
 import org.apache.hc.client5.http.config.Configurable;
 import org.apache.hc.client5.http.config.RequestConfig;
@@ -32,17 +31,17 @@ public class CXFHttpRequest extends HttpUriRequestBase 
implements Configurable {
     private static final long serialVersionUID = 1L;
     
     private HttpEntity entity;
-    private AsyncWrappedOutputStream out;
+    private AsyncWrappedOutputStreamBase out;
     private RequestConfig config;
 
     public CXFHttpRequest(String method, URI uri) {
         super(method, uri);
     }
 
-    public void setOutputStream(AsyncWrappedOutputStream o) {
+    public void setOutputStream(AsyncWrappedOutputStreamBase o) {
         out = o;
     }
-    public AsyncWrappedOutputStream getOutputStream() {
+    public AsyncWrappedOutputStreamBase getOutputStream() {
         return out;
     }
 
diff --git 
a/rt/transports/http-hc5/src/main/java/org/apache/cxf/transport/http/asyncclient/hc5/AsyncHTTPConduit.java
 
b/rt/transports/http-hc5/src/main/java/org/apache/cxf/transport/http/asyncclient/hc5/URLConnectionAsyncHTTPConduit.java
similarity index 97%
copy from 
rt/transports/http-hc5/src/main/java/org/apache/cxf/transport/http/asyncclient/hc5/AsyncHTTPConduit.java
copy to 
rt/transports/http-hc5/src/main/java/org/apache/cxf/transport/http/asyncclient/hc5/URLConnectionAsyncHTTPConduit.java
index 33351f17d6..d8e70f1ff2 100644
--- 
a/rt/transports/http-hc5/src/main/java/org/apache/cxf/transport/http/asyncclient/hc5/AsyncHTTPConduit.java
+++ 
b/rt/transports/http-hc5/src/main/java/org/apache/cxf/transport/http/asyncclient/hc5/URLConnectionAsyncHTTPConduit.java
@@ -31,7 +31,6 @@ import java.net.SocketTimeoutException;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.nio.ByteBuffer;
-import java.nio.channels.WritableByteChannel;
 import java.security.GeneralSecurityException;
 import java.security.Principal;
 import java.security.cert.Certificate;
@@ -58,13 +57,12 @@ import org.apache.cxf.helpers.HttpHeaderHelper;
 import org.apache.cxf.helpers.IOUtils;
 import org.apache.cxf.io.CacheAndWriteOutputStream;
 import org.apache.cxf.io.CachedOutputStream;
-import org.apache.cxf.io.CopyingOutputStream;
 import org.apache.cxf.message.Message;
 import org.apache.cxf.message.MessageUtils;
 import org.apache.cxf.service.model.EndpointInfo;
 import org.apache.cxf.transport.http.Address;
 import org.apache.cxf.transport.http.Headers;
-import org.apache.cxf.transport.http.HttpClientHTTPConduit;
+import org.apache.cxf.transport.http.URLConnectionHTTPConduit;
 import 
org.apache.cxf.transport.http.asyncclient.hc5.AsyncHTTPConduitFactory.UseAsyncPolicy;
 import 
org.apache.cxf.transport.http.asyncclient.hc5.AsyncHttpResponseWrapperFactory.AsyncHttpResponseWrapper;
 import org.apache.cxf.transport.https.HttpsURLConnectionInfo;
@@ -98,7 +96,7 @@ import org.apache.hc.core5.util.Timeout;
 /**
  * Async HTTP Conduit using Apache HttpClient 5
  */
-public class AsyncHTTPConduit extends HttpClientHTTPConduit {
+public class URLConnectionAsyncHTTPConduit extends URLConnectionHTTPConduit {
     /**
      * Enable HTTP/2 support
      */
@@ -114,7 +112,9 @@ public class AsyncHTTPConduit extends HttpClientHTTPConduit 
{
     private volatile SSLSession session;
     private volatile CloseableHttpAsyncClient client;
 
-    public AsyncHTTPConduit(Bus b, EndpointInfo ei, EndpointReferenceType t, 
AsyncHTTPConduitFactory factory) 
+    public URLConnectionAsyncHTTPConduit(Bus b, EndpointInfo ei, 
+                                         EndpointReferenceType t, 
+                                         AsyncHTTPConduitFactory factory) 
             throws IOException {
         super(b, ei, t);
         this.factory = factory;
@@ -285,7 +285,7 @@ public class AsyncHTTPConduit extends HttpClientHTTPConduit 
{
     }
 
     public class AsyncWrappedOutputStream extends WrappedOutputStream
-            implements CopyingOutputStream, WritableByteChannel {
+            implements AsyncWrappedOutputStreamBase {
         private final HTTPClientPolicy csPolicy;
 
         private CXFHttpRequest entity;
@@ -539,11 +539,12 @@ public class AsyncHTTPConduit extends 
HttpClientHTTPConduit {
                     if (creds != null) {
                         return creds;
                     }
-                    if (AsyncHTTPConduit.this.proxyAuthorizationPolicy != null
-                            && 
AsyncHTTPConduit.this.proxyAuthorizationPolicy.getUserName() != null) {
+                    if 
(URLConnectionAsyncHTTPConduit.this.proxyAuthorizationPolicy != null
+                            && 
URLConnectionAsyncHTTPConduit.this.proxyAuthorizationPolicy.getUserName() != 
null) {
                         return new UsernamePasswordCredentials(
-                                
AsyncHTTPConduit.this.proxyAuthorizationPolicy.getUserName(),
-                                
AsyncHTTPConduit.this.proxyAuthorizationPolicy.getPassword().toCharArray());
+                                
URLConnectionAsyncHTTPConduit.this.proxyAuthorizationPolicy.getUserName(),
+                                
URLConnectionAsyncHTTPConduit.this.proxyAuthorizationPolicy.getPassword().
+                                toCharArray());
                     }
                     return null;
                 }
@@ -634,7 +635,7 @@ public class AsyncHTTPConduit extends HttpClientHTTPConduit 
{
                     || lastURL.getPort() != url.getPort();
         }
 
-        protected boolean retrySetHttpResponse(HttpResponse r) {
+        public boolean retrySetHttpResponse(HttpResponse r) {
             if (isAsync) {
                 setHttpResponse(r);
             }
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 40d42c8e31..11e1f69cc5 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
@@ -69,6 +69,10 @@ public class HTTPTransportFactory
             "http://schemas.xmlsoap.org/wsdl/http/";
         ));
 
+    private static boolean forceURLConnectionConduit
+        = 
Boolean.valueOf(SystemPropertyAction.getProperty("org.apache.cxf.transport.http.forceURLConnection"));
+
+
     private static final Logger LOG = 
LogUtils.getL7dLogger(HTTPTransportFactory.class);
 
     /**
@@ -86,8 +90,6 @@ public class HTTPTransportFactory
     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());
@@ -237,7 +239,7 @@ public class HTTPTransportFactory
             conduit = factory.createConduit(this, bus, endpointInfo, target);
         }
         if (conduit == null) {
-            if (forceURLConnectionConduit) {
+            if (HTTPTransportFactory.isForceURLConnectionConduit()) {
                 conduit = new URLConnectionHTTPConduit(bus, endpointInfo, 
target);
             } else {
                 conduit = new HttpClientHTTPConduit(bus, endpointInfo, target);
@@ -301,5 +303,8 @@ public class HTTPTransportFactory
             r.unlock();
         }
     }
-
+    
+    public static boolean isForceURLConnectionConduit() {
+        return forceURLConnectionConduit;
+    }
 }
diff --git 
a/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/UndertowDigestAuthTest.java
 
b/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/UndertowDigestAuthTest.java
index ce295b66e3..ab48a96472 100644
--- 
a/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/UndertowDigestAuthTest.java
+++ 
b/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/UndertowDigestAuthTest.java
@@ -118,7 +118,7 @@ public class UndertowDigestAuthTest extends 
AbstractClientServerTestBase {
         client.setReceiveTimeout(600000);
         cond.setClient(client);
         if (async) {
-            if (cond instanceof AsyncHTTPConduit) {
+            if (cond.getClass().getName().endsWith("AsyncHTTPConduit")) {
                 UsernamePasswordCredentials creds = new 
UsernamePasswordCredentials("ffang", "pswd".toCharArray());
                 bp.getRequestContext().put(Credentials.class.getName(), creds);
                 bp.getRequestContext().put(AsyncHTTPConduit.USE_ASYNC, 
Boolean.TRUE);
diff --git 
a/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/http2/AbstractUndertowClientServerHttp2Test.java
 
b/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/http2/AbstractUndertowClientServerHttp2Test.java
index 1f318e148b..d1179bb23f 100644
--- 
a/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/http2/AbstractUndertowClientServerHttp2Test.java
+++ 
b/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/http2/AbstractUndertowClientServerHttp2Test.java
@@ -30,15 +30,15 @@ import org.apache.cxf.transport.https.InsecureTrustManager;
 import org.junit.Test;
 
 import static org.hamcrest.CoreMatchers.equalTo;
-import static org.hamcrest.CoreMatchers.instanceOf;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 abstract class AbstractUndertowClientServerHttp2Test extends 
AbstractBusClientServerTestBase {
     @Test
     public void testBookNotFoundWithHttp2() throws Exception {
         final WebClient client = createWebClient("/web/bookstore/notFound", 
true);
-        assertThat(WebClient.getConfig(client).getHttpConduit(), 
instanceOf(AsyncHTTPConduit.class));
+        
assertTrue(WebClient.getConfig(client).getHttpConduit().getClass().getName().endsWith("AsyncHTTPConduit"));
 
         final Response response = client
             .accept("text/plain")
@@ -53,7 +53,7 @@ abstract class AbstractUndertowClientServerHttp2Test extends 
AbstractBusClientSe
     @Test
     public void testBookWithHttp2() throws Exception {
         final WebClient client = createWebClient("/web/bookstore/booknames", 
true);
-        assertThat(WebClient.getConfig(client).getHttpConduit(), 
instanceOf(AsyncHTTPConduit.class));
+        
assertTrue(WebClient.getConfig(client).getHttpConduit().getClass().getName().endsWith("AsyncHTTPConduit"));
 
         final Response response = client
             .accept("text/plain")
@@ -68,7 +68,7 @@ abstract class AbstractUndertowClientServerHttp2Test extends 
AbstractBusClientSe
     @Test
     public void testGetBookStreamHttp2() throws Exception {
         final WebClient client = createWebClient("/web/bookstore/bookstream", 
true);
-        assertThat(WebClient.getConfig(client).getHttpConduit(), 
instanceOf(AsyncHTTPConduit.class));
+        
assertTrue(WebClient.getConfig(client).getHttpConduit().getClass().getName().endsWith("AsyncHTTPConduit"));
         
         final Response response = client
             .accept("application/json")
diff --git 
a/systests/transports/src/test/java/org/apache/cxf/systest/http_jetty/JettyDigestAuthTest.java
 
b/systests/transports/src/test/java/org/apache/cxf/systest/http_jetty/JettyDigestAuthTest.java
index aef52d8121..fa10c66731 100644
--- 
a/systests/transports/src/test/java/org/apache/cxf/systest/http_jetty/JettyDigestAuthTest.java
+++ 
b/systests/transports/src/test/java/org/apache/cxf/systest/http_jetty/JettyDigestAuthTest.java
@@ -116,7 +116,7 @@ public class JettyDigestAuthTest extends 
AbstractClientServerTestBase {
         HTTPClientPolicy client = new HTTPClientPolicy();
         cond.setClient(client);
         if (async) {
-            if (cond instanceof AsyncHTTPConduit) {
+            if (cond.getClass().getName().endsWith("AsyncHTTPConduit")) {
                 UsernamePasswordCredentials creds = new 
UsernamePasswordCredentials("ffang", "pswd");
                 bp.getRequestContext().put(Credentials.class.getName(), creds);
                 bp.getRequestContext().put(AsyncHTTPConduit.USE_ASYNC, 
Boolean.TRUE);


Reply via email to