This is an automated email from the ASF dual-hosted git repository.
coheigea pushed a commit to branch 4.1.x-fixes
in repository https://gitbox.apache.org/repos/asf/cxf.git
The following commit(s) were added to refs/heads/4.1.x-fixes by this push:
new 373703c5749 CXF-8272: Don't fail a one-way invocation if the response
stream can't be drained (#3586)
373703c5749 is described below
commit 373703c5749b2fe61875bfbce56a21dffaeb2d4e
Author: Colm O hEigeartaigh <[email protected]>
AuthorDate: Thu Oct 15 15:57:16 2026 +0100
CXF-8272: Don't fail a one-way invocation if the response stream can't be
drained (#3586)
(cherry picked from commit 2e16926ff8b76389261e0d754ab20a4de7a3b225)
---
.../transport/http/URLConnectionHTTPConduit.java | 8 +++++-
.../transport/http/HTTPConduitURLEasyMockTest.java | 32 ++++++++++++++++++++--
2 files changed, 37 insertions(+), 3 deletions(-)
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 028eaf950f4..33b952cc155 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
@@ -357,7 +357,13 @@ public class URLConnectionHTTPConduit extends HTTPConduit {
ins = connection.getInputStream();
}
if (ins != null) {
- IOUtils.consume(ins);
+ try {
+ IOUtils.consume(ins);
+ } catch (IOException ex) {
+ // Draining is only done so the connection might be
reused, so a failure here
+ // (for example the stream was already closed) should not
fail the invocation
+ LOG.log(Level.FINE, "Could not consume the response
stream: " + ex.getMessage(), ex);
+ }
ins.close();
}
}
diff --git
a/rt/transports/http/src/test/java/org/apache/cxf/transport/http/HTTPConduitURLEasyMockTest.java
b/rt/transports/http/src/test/java/org/apache/cxf/transport/http/HTTPConduitURLEasyMockTest.java
index 3850ce338be..40adb2d10c4 100644
---
a/rt/transports/http/src/test/java/org/apache/cxf/transport/http/HTTPConduitURLEasyMockTest.java
+++
b/rt/transports/http/src/test/java/org/apache/cxf/transport/http/HTTPConduitURLEasyMockTest.java
@@ -64,6 +64,7 @@ import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.nullable;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
/**
@@ -73,7 +74,9 @@ public class HTTPConduitURLEasyMockTest {
private static final String HTTP_RESPONSE_MESSAGE = "Some Response Message
I can test";
- private enum ResponseStyle { NONE, BACK_CHANNEL, BACK_CHANNEL_ERROR,
DECOUPLED, ONEWAY_NONE };
+ private enum ResponseStyle {
+ NONE, BACK_CHANNEL, BACK_CHANNEL_ERROR, DECOUPLED, ONEWAY_NONE,
ONEWAY_STREAM_CLOSED
+ };
private enum ResponseDelimiter { LENGTH, CHUNKED, EOF };
private static final String NOWHERE = "http://nada.nothing.nowhere.null/";
@@ -259,6 +262,21 @@ public class HTTPConduitURLEasyMockTest {
"POST");
}
+ @Test
+ public void testSendOnewayResponseStreamAlreadyClosed()
+ throws Exception {
+ HTTPConduit conduit = setUpConduit(true, false, "POST");
+ Message message = createMessage();
+ conduit.prepare(message);
+ verifySentMessage(conduit,
+ message,
+ ResponseStyle.ONEWAY_STREAM_CLOSED,
+ ResponseDelimiter.CHUNKED,
+ true, // empty response
+ "POST");
+ verify(is).close();
+ }
+
@Test
public void testSendTwowayDecoupledEmptyPartialResponse()
throws Exception {
@@ -443,7 +461,8 @@ public class HTTPConduitURLEasyMockTest {
doNothing().when(os).close();
}
- setUpExchange(message, style == ResponseStyle.NONE || style ==
ResponseStyle.ONEWAY_NONE);
+ setUpExchange(message, style == ResponseStyle.NONE || style ==
ResponseStyle.ONEWAY_NONE
+ || style == ResponseStyle.ONEWAY_STREAM_CLOSED);
when(connection.getRequestMethod()).thenReturn(method);
verifyHandleResponse(style, delimiter, emptyResponse, conduit);
@@ -568,6 +587,15 @@ public class HTTPConduitURLEasyMockTest {
when(connection.getInputStream()).thenReturn(new
ByteArrayInputStream(new byte[0]));
break;
+ case ONEWAY_STREAM_CLOSED:
+ is = mock(InputStream.class);
+ when(connection.getInputStream()).thenReturn(is);
+ when(connection.getContentLength()).thenReturn(-1);
+
when(connection.getHeaderField("Transfer-Encoding")).thenReturn("chunked");
+ when(is.read()).thenReturn(-1);
+ when(is.available()).thenThrow(new IOException("stream is
closed"));
+ break;
+
default:
break;
}