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